函數(Function)#

函數跟參數和變數一樣,可以想像成一個容器。這個容器不是用來存放值,而是用來存放一段執行特定任務的程式碼。函數可以接受輸入參數、處理這些參數,並回傳結果。通常會將常用的功能寫成函數,這樣就不用每次都重寫同樣的計算或功能,只需要使用對應的函數名稱。

函數跟參數和變數一樣,分成兩個階段:

  1. 定義(實作): 將想要當作函數使用的程式碼寫好和編譯。
  2. 使用(呼叫): 使用函數名稱並提供引數給函數。

定義函數#

新增函數腳本#

PowerLanguage Editor -> 檔案 -> 開新檔案 -> 函數

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

語法#

1
2
3
4
[Input: InputName1(InputType), InputName2(InputType), ...;]
// 函數的功能

[FunctionName = ReturnValue;]
語法元素是否可省略說明
Input可省略宣告函數的參數。同義字: Inputs
InputName必填參數的名稱
InputType必填參數的型別,見函數的參數型別
FunctionName = ReturnValue可省略指定函數的回傳值為 ReturnValue

函數的參數和訊號腳本或指標腳本的參數不一樣,無法從 MultiCharts 傳入參數值。函數的參數是在使用(呼叫)函數時,同時提供給函數。

寫完函數後,點擊編譯按鈕編譯程式碼。如果沒有錯誤,函數就可以在訊號或指標腳本中使用。

函數的參數型別#

每種參數型別都有 Numeric(數值)、String(字串) 和 TrueFalse(真假值) 三種版本,依後綴分成以下 6 種:

後綴說明
Simple值在每一根K棒都一樣,沒有歷史數值
Series值會隨K棒可能不同,有歷史數值可以參照
(無後綴)接受 Simple 或 Series
Ref傳址呼叫,在函數中改變參數值,引數的值也會改變
Array傳入陣列M 代表傳入陣列每個維度的最大索引值
ArrayRef傳入陣列的傳址呼叫,在函數中改變參數值,引數的值也會改變

Numeric#

型別說明語法範例
NumericSimpleSimple 數值Input: Length(NumericSimple);
NumericSeriesSeries 數值Input: Price(NumericSeries);
Numeric接受 NumericSimpleNumericSeriesInput: Length(Numeric);
NumericRef數值的傳址呼叫Input: BarCount(NumericRef);
NumericArray數值陣列Input: Table[X, Y, Z](NumericArray);
NumericArrayRef數值陣列的傳址呼叫Input: Table[X, Y, Z](NumericArrayRef);

String#

型別說明語法範例
StringSimpleSimple 字串Input: Name(StringSimple);
StringSeriesSeries 字串Input: Messages(StringSeries);
String接受 StringSimpleStringSeriesInput: Name(String);
StringRef字串的傳址呼叫Input: Message(StringRef);
StringArray字串陣列Input: MessageTable[X, Y, Z](StringArray);
StringArrayRef字串陣列的傳址呼叫Input: CommentsTable[X, Y, Z](StringArrayRef);

TrueFalse#

型別說明語法範例
TrueFalseSimpleSimple 真假值Input: Overnight(TrueFalseSimple);
TrueFalseSeriesSeries 真假值Input: UpTrend(TrueFalseSeries);
TrueFalse接受 TrueFalseSimpleTrueFalseSeriesInput: Overnight(TrueFalse);
TrueFalseRef真假值的傳址呼叫Input: Flag(TrueFalseRef);
TrueFalseArray真假值陣列Input: FlagTable[X, Y, Z](TrueFalseArray);
TrueFalseArrayRef真假值陣列的傳址呼叫Input: TrendTable[X, Y, Z](TrueFalseArrayRef);

使用函數#

語法#

1
FunctionName(Argument1, Argument2, ...);
語法元素說明
FunctionName要使用的函數名稱
Argument呼叫函數時,傳給參數的值,稱作引數

範例#

內建函數 AverageFC 的實作:

檔案 -> 開啟檔案 -> 函數(checkbox 打勾) -> AverageFC

1
2
3
4
5
Inputs:
  PriceValue(NumericSeries),
  Len(NumericSimple);

AverageFC = SummationFC(PriceValue, Len) / Len;

AverageFC 本身是函數實作,同時也呼叫另一個函數 SummationFC 完成實作功能。AverageFC 宣告兩個參數: PriceValueNumericSeries 型別、LenNumericSimple 型別。接著呼叫 SummationFC 函數做計算,PriceValueLen 作為引數傳給 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。嘗試改變 ValueAValueB 的值,造成 compile error: Array, variable or refinput expected

函數: swapByValFunc#
1
2
3
4
5
6
7
8
Inputs: ValueA(NumericSimple), ValueB(NumericSimple);
Print("In swapFunc, before swap ValueA: ", ValueA, ", ValueB: ", ValueB);

temp = ValueA;
ValueA = ValueB; // compile error: Array, variable or refinput expected
ValueB = temp; // compile error: Array, variable or refinput expected

Print("In swapFunc, after swap ValueA: ", ValueA, ", ValueB: ", ValueB);

傳址呼叫(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 將參數 ValueAValueB 的值進行互換。在訊號 testSwapFunc 中,呼叫 swapByRefFunc 後,ValueAValueB 的值互換了。

函數: swapByRefFunc#
1
2
3
4
5
6
7
8
9
Inputs: ValueA(NumericRef), ValueB(NumericRef);
Variables: temp(0);

Print("In swapFunc, before swap ValueA: ", ValueA, ", ValueB: ", ValueB);
// swap ValueA and ValueB
temp = ValueA;
ValueA = ValueB;
ValueB = temp;
Print("In swapFunc, after swap ValueA: ", ValueA, ", ValueB: ", ValueB);
訊號: testSwapFunc#
1
2
3
4
5
6
7
8
9
Variables: ValueA(12), ValueB(34);

// ValueA: 12.00, ValueB: 34.00
Print("Before call swapFunc, ValueA: ", ValueA, ", ValueB: ", ValueB);

swapByRefFunc(ValueA, ValueB);

// ValueA: 34.00, ValueB: 12.00
Print("After call swapFunc, ValueA: ", ValueA, ", ValueB: ", ValueB);

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

© 2026 CodeReindeer. All rights reserved.