函數(Function)#
函數跟參數和變數一樣,可以想像成一個容器。這個容器不是用來存放值,而是用來存放一段執行特定任務的程式碼。函數可以接受輸入參數、處理這些參數,並回傳結果。通常會將常用的功能寫成函數,這樣就不用每次都重寫同樣的計算或功能,只需要使用對應的函數名稱。
函數跟參數和變數一樣,分成兩個階段:
- 定義(實作): 將想要當作函數使用的程式碼寫好和編譯。
- 使用(呼叫): 使用函數名稱並提供引數給函數。
定義函數#
新增函數腳本#
PowerLanguage Editor -> 檔案 -> 開新檔案 -> 函數

回傳類型 決定函數回傳值的型別,分成數值(Numeric)、TrueFalse(真假值)、字串(String)。函數儲存 進一步決定回傳類型是 Simple 還是 Series,詳見函數的參數型別。

語法#
| |
| 語法元素 | 是否可省略 | 說明 |
|---|---|---|
Input | 可省略 | 宣告函數的參數。同義字: Inputs |
InputName | 必填 | 參數的名稱 |
InputType | 必填 | 參數的型別,見函數的參數型別 |
FunctionName = ReturnValue | 可省略 | 指定函數的回傳值為 ReturnValue |
函數的參數和訊號腳本或指標腳本的參數不一樣,無法從 MultiCharts 傳入參數值。函數的參數是在使用(呼叫)函數時,同時提供給函數。
寫完函數後,點擊編譯按鈕編譯程式碼。如果沒有錯誤,函數就可以在訊號或指標腳本中使用。
函數的參數型別#
每種參數型別都有 Numeric(數值)、String(字串) 和 TrueFalse(真假值) 三種版本,依後綴分成以下 6 種:
| 後綴 | 說明 |
|---|---|
Simple | 值在每一根K棒都一樣,沒有歷史數值 |
Series | 值會隨K棒可能不同,有歷史數值可以參照 |
| (無後綴) | 接受 Simple 或 Series |
Ref | 傳址呼叫,在函數中改變參數值,引數的值也會改變 |
Array | 傳入陣列。M 代表傳入陣列每個維度的最大索引值 |
ArrayRef | 傳入陣列的傳址呼叫,在函數中改變參數值,引數的值也會改變 |
Numeric#
| 型別 | 說明 | 語法範例 |
|---|---|---|
NumericSimple | Simple 數值 | Input: Length(NumericSimple); |
NumericSeries | Series 數值 | Input: Price(NumericSeries); |
Numeric | 接受 NumericSimple 或 NumericSeries | Input: Length(Numeric); |
NumericRef | 數值的傳址呼叫 | Input: BarCount(NumericRef); |
NumericArray | 數值陣列 | Input: Table[X, Y, Z](NumericArray); |
NumericArrayRef | 數值陣列的傳址呼叫 | Input: Table[X, Y, Z](NumericArrayRef); |
String#
| 型別 | 說明 | 語法範例 |
|---|---|---|
StringSimple | Simple 字串 | Input: Name(StringSimple); |
StringSeries | Series 字串 | Input: Messages(StringSeries); |
String | 接受 StringSimple 或 StringSeries | Input: Name(String); |
StringRef | 字串的傳址呼叫 | Input: Message(StringRef); |
StringArray | 字串陣列 | Input: MessageTable[X, Y, Z](StringArray); |
StringArrayRef | 字串陣列的傳址呼叫 | Input: CommentsTable[X, Y, Z](StringArrayRef); |
TrueFalse#
| 型別 | 說明 | 語法範例 |
|---|---|---|
TrueFalseSimple | Simple 真假值 | Input: Overnight(TrueFalseSimple); |
TrueFalseSeries | Series 真假值 | Input: UpTrend(TrueFalseSeries); |
TrueFalse | 接受 TrueFalseSimple 或 TrueFalseSeries | Input: Overnight(TrueFalse); |
TrueFalseRef | 真假值的傳址呼叫 | Input: Flag(TrueFalseRef); |
TrueFalseArray | 真假值陣列 | Input: FlagTable[X, Y, Z](TrueFalseArray); |
TrueFalseArrayRef | 真假值陣列的傳址呼叫 | Input: TrendTable[X, Y, Z](TrueFalseArrayRef); |
使用函數#
語法#
| |
| 語法元素 | 說明 |
|---|---|
FunctionName | 要使用的函數名稱 |
Argument | 呼叫函數時,傳給參數的值,稱作引數 |
範例#
內建函數 AverageFC 的實作:
檔案 -> 開啟檔案 -> 函數(checkbox 打勾) -> AverageFC
| |
AverageFC 本身是函數實作,同時也呼叫另一個函數 SummationFC 完成實作功能。AverageFC 宣告兩個參數: PriceValue 為 NumericSeries 型別、Len 為 NumericSimple 型別。接著呼叫 SummationFC 函數做計算,PriceValue 和 Len 作為引數傳給 SummationFC 的參數。最後,AverageFC 回傳 SummationFC 計算後的結果除以 Len。
傳值呼叫和傳址呼叫#
引數(Argument)#
引數是呼叫函數時,放在函數參數位置,傳給函數使用的值。
引數傳給函數的機制有兩種:
- 傳值呼叫(Passing by Value)
- 傳址呼叫(Passing by Reference)
傳值呼叫(Passing by Value)#
沒有 Ref 結尾的參數型別,引數傳給函數的機制使用 Passing by Value。
使用 Passing by Value 機制的函數參數,在函數實作中不能改變參數的值。如果嘗試在函數中改變參數的值,會造成 compile error: Array, variable or refinput expected。
範例#
swapByValFunc 函數的參數 ValueA(NumericSimple) 和 ValueB(NumericSimple) 是 Passing by Value。嘗試改變 ValueA 和 ValueB 的值,造成 compile error: Array, variable or refinput expected。
函數: swapByValFunc#
| |
傳址呼叫(Passing by Reference)#
有 Ref 結尾的參數型別,引數傳給函數的機制使用 Passing by Reference。
使用 Passing by Reference 機制的函數參數,在函數實作中可以改變參數的值。如果在函數中改變參數的值,則引數的值也會跟著改變。
Passing by Reference 的應用是讓函數有多個輸出。因為原本的函數語法只有一個回傳值,所以一個函數只有一個輸出。如果需要函數有多個輸出時,可以使用 Passing by Reference 機制達成。
範例#
swapByRefFunc 函數的參數 ValueA(NumericRef) 和 ValueB(NumericRef) 是 Passing by Reference。swapByRefFunc 將參數 ValueA 和 ValueB 的值進行互換。在訊號 testSwapFunc 中,呼叫 swapByRefFunc 後,ValueA 和 ValueB 的值互換了。
函數: swapByRefFunc#
| |
訊號: testSwapFunc#
| |
Reference#
https://www.multicharts.com/trading-software/index.php?title=Category:Declaration
https://www.multicharts.com/trading-software/index.php?title=Passing_values_to_and_from_a_function