策略的框架和基本語法#

透過一個簡單的內建策略範例 MovAvg2Line Cross LE(兩條均線黃金交叉買進策略),快速了解腳本的框架和基本語法。

打開 PowerLanguage Editor -> 檔案 -> 開啟檔案 -> 公式類型 -> 訊號(打勾) -> MovAvg2Line Cross LE

打開 PowerLanguage Editor -> 檔案 -> 開啟檔案 -> 公式類型 -> 訊號(打勾) -> MovAvg2Line Cross LE

MovAvg2Line Cross LE 的程式碼:

1
2
3
4
5
6
7
8
9
Inputs: Price(Close), FastLength(9), SlowLength(18);
Variables: var0(0), var1(0);

var0 = AverageFC(Price, FastLength);
var1 = AverageFC(Price, SlowLength);

Condition1 = CurrentBar > 1 and var0 crosses over var1;
If Condition1 Then
  Buy("MA2CrossLE") next bar at market;

框架總覽#

腳本的框架由四個部分組成:

框架說明對應程式碼行數
I. 宣告宣告參數和變數第 1-2 行
II. 計算規則使用函數計算指標值,並指派給變數第 4-5 行
III. 進出場邏輯判斷組織邏輯條件,搭配 if 分支語法判斷第 7-8 行
IV. 買進或賣出執行買賣下單指令第 9 行

I. 宣告#

參數(Inputs) 和變數(Variables)#

參數(Input)和變數(Variable)可以想像成一個容器(Ex: 瓶子),容器內儲存需要的資料(Ex: 5公升)。 在使用容器之前,需要先 宣告,宣告會告訴編譯器要儲存的資料的型別,型別決定了可以對資料做哪些操作(Ex: 算術運算或是文字串接)。

因此,參數和變數分成 宣告使用 兩個階段:

  1. 宣告: 宣告參數或變數的名稱,給予預設值或初始值,同時定義型別,型別可以是數值(Numerical)、字串(String)、真假值(TrueFalse)。
  2. 使用: 在程式碼中使用參數或變數的名稱,當程式執行到名稱時,就會去使用儲存的值。

參數(Inputs)宣告的語法#

1
Inputs: InputName1(DefaultValue1), InputName2(DefaultValue2), etc;

Inputs: 表示宣告參數。 InputName: 參數的名稱,名稱不區分大小寫,不能是數字或句點(.)開頭。 DefaultValue: 參數的預設值,預設值決定參數的型別。 註: 宣告的結束要加分號(;),沒有加會編譯錯誤。

參數值只能透過預設值設定,在腳本中 無法 透過程式碼更改參數值。你可以從 MultiCharts 設定新的預設值,不需要重新編譯即可套用。

詳見 參數和變數(Input and Variable)

MovAvg2Line Cross LE,第 1 行:

1
Inputs: Price(Close), FastLength(9), SlowLength(18);

宣告三個參數:

參數名稱預設值說明
PriceClose(收盤價)計算均線使用的價格
FastLength9快線的K棒數量
SlowLength18慢線的K棒數量

下圖是在 MultiCharts -> 設定 -> 訊號 -> MovAvg2Line Cross LE -> 設定 中可以看到這三個參數和對應的預設值。因為沒有從 MultiCharts 修改數值,所以都是使用腳本中定義的預設值。

MultiCharts -> 設定 -> 訊號 -> MovAvg2Line Cross LE -> 設定

變數(Variables)宣告的語法#

1
Variables: VariableName1(InitialValue1), VariableName2(InitialValue2), etc;

Variables: 表示宣告變數。 VariableName: 變數的名稱,名稱可以是字母、底線、數字、句點(.)組成,不區分大小寫,不可以是數字或句點(.)開頭。 InitialValue: 變數的初始值,初始值決定變數的型別。 註: 宣告的結束要加分號(;),沒有加會編譯錯誤。

變數值透過初始值設定後,可以在腳本中透過程式碼更改(指派其他的值)。這是變數和參數的主要差異。

詳見 參數和變數(Input and Variable)

MovAvg2Line Cross LE,第 2 行:

1
Variables: var0(0), var1(0);

宣告兩個變數: var0var1,初始值皆為 0

保留字(Reserved Word)#

保留字是在 PowerLanguage 中具有特殊意義的單字,不能 被拿來當作參數或變數的名稱。

例如:

  • InputsVariables 是宣告用的語法保留字。
  • Close(收盤價)、Open(開盤價)、High(最高價)、Low(最低價) 是代表價格的保留字。

PowerLanguage 還有其他保留字,可以遇到時再查詢。

II. 計算規則#

函數(Function)#

函數跟參數和變數一樣,可以想像成是一個容器,但容器裡面放的是一連串的程式碼。當我們想要重複使用這段程式碼時,不需要全部重寫一次,只需要使用函數名稱,程式在執行到函數名稱的時候,就會去執行對應的程式碼。

函數分成兩個階段:

  1. 定義(實作): 將想要當作函數使用的程式碼寫好和編譯。詳見 函數(Function)
  2. 使用(呼叫): 使用函數名稱和給予參數值,當程式執行到函數名稱時,就會代入參數值和執行對應的程式碼。

由於這篇只是入門介紹,因此只先說明函數的 使用(呼叫)

函數的呼叫語法#

1
FunctionName(input1, input2, ...)

FunctionName: 要使用的函數名稱。 input: 傳給函數參數的值。

PowerLanguage 提供許多常用功能的內建函數。AverageFC(PriceValue, Len) 是其中之一,計算 Len 根K棒的 PriceValue 的平均值。

MovAvg2Line Cross LE,第 4-5 行:

1
2
var0 = AverageFC(Price, FastLength);
var1 = AverageFC(Price, SlowLength);

PriceFastLengthSlowLength 是第 1 行宣告的參數,將預設值代入:

程式碼代入預設值意義
AverageFC(Price, FastLength)AverageFC(Close, 9)計算 9 根K棒的收盤價平均值
AverageFC(Price, SlowLength)AverageFC(Close, 18)計算 18 根K棒的收盤價平均值

由於在 MultiCharts 如何執行策略 中,腳本是每一根K棒結束執行一次,所以每根K棒結束都會重新計算平均值。這其實就是移動平均線(Moving Average)的計算,因此 var0 是 9MA(快線),var1 是 18MA(慢線)。

指派(Assignment)#

在 PowerLanguage 中,等號(=)有兩個意思:

含義使用場景
指派(Assignment)一般情況下,先計算等號右邊,再將結果指派給左邊
等於(Equal)搭配條件判斷保留字(Ex: if、else ifwhile)時,為數學的等於

下面是一個簡單的例子:

1
2
Variables: BottleA(5), BottleB(3), BottleC(5);
BottleA = BottleB + BottleC;

第一行是宣告變數。第二行 BottleA = BottleB + BottleC;,如果從數學的角度來看: BottleA 的值是 5,而 BottleB + BottleC 的值是 8,5 怎麼會等於 8?

因為這裡的等號(=)不是「等於」,而是「指派」: 先計算右邊: BottleB(3) + BottleC(5) = 8,再將 8 指派給 BottleABottleA 原來的值(5)被覆蓋,變成 8。

MovAvg2Line Cross LE,第 4-5 行:

1
2
var0 = AverageFC(Price, FastLength);
var1 = AverageFC(Price, SlowLength);

AverageFC(Price, FastLength) 的計算結果指派給 var0AverageFC(Price, SlowLength) 的計算結果指派給 var1。 由上一小節得知,var0 是快線(9MA),var1 是慢線(18MA)。

III. 進出場邏輯判斷#

分支(Branch)#

PowerLanguage 提供了 if 分支語法,來決定程式執行的方向: 當滿足某些條件時執行某些指令,否則執行其他指令。

分成兩個步驟:

  1. 使用 邏輯運算子(Logical Operator)組成 邏輯陳述句(Logical Expression)。
  2. 邏輯陳述句 搭配 if 分支語法決定執行方向。

邏輯運算子(Logical Operator)#

運算子說明
and當兩邊都為真時,回傳 true,否則回傳 false
or只要其中一邊為真,回傳 true,否則回傳 false

邏輯陳述句(Logical Expression)#

邏輯陳述句 是回傳值為真假值型別的陳述句。

範例說明
5 < 35 小於 3false
8 <> 98 不等於 9true
8 <> 9 and 5 < 38 不等於 9 5 小於 3false

第一個步驟: 組織邏輯陳述句#

MovAvg2Line Cross LE,第 7 行:

1
Condition1 = CurrentBar > 1 and var0 crosses over var1;

等號(=)是指派,先計算右邊。CurrentBar > 1 and var0 crosses over var1 是邏輯陳述句:

  • CurrentBar 是保留字,回傳目前K棒的編號(從 Maximum Bars Back 之後開始算第 1 根)。目前可以先將 CurrentBar > 1 視為 true,不影響對策略的理解。
  • crosses over 是保留字,表示向上穿越(黃金交叉)。

因此,等號右邊可以理解為: var0(快線) 向上穿越 var1(慢線)

Condition1 是 PowerLanguage 內建的變數,不需要宣告就可以直接使用。這一行將邏輯判斷的結果指派給 Condition1

Note: Condition1 是內建變數,不建議使用,因為名稱不夠明確。建議自行宣告有意義的變數名稱,例如 GoldenCross

第二個步驟: 邏輯陳述句搭配 if 分支語法#

if 分支語法:

1
If E Then I1;

E: 邏輯陳述句。 I1: 邏輯陳述句為真時,執行的指令。

MovAvg2Line Cross LE,第 8-9 行:

1
2
If Condition1 Then
  Buy("MA2CrossLE") next bar at market;

如果 Condition1true(即快線向上穿越慢線),則執行 Buy("MA2CrossLE") next bar at market;

詳見 分支(Branch)

IV. 買進或賣出#

買賣指令#

PowerLanguage 提供了 BuySellSellShortBuyToCover 四個買賣下單指令。 MultiCharts 在執行到這些指令時,就會送出委託單。

Buy(買進)指令的語法#

1
Buy[("EntryLabel")] [TradeSize] OrderCommandType;

EntryLabel: 命名買進名稱,會顯示在圖表上。賣出時可以用名稱指定要賣出哪一筆買進。 [] 代表可省略,預設名稱為 “Buy”、“Buy#2”、“Buy#3”,以此類推。 TradeSize: 指定下單的股數(口數)。 [] 代表可省略,預設使用 設定 -> 策略屬性 -> 屬性 -> 固定委託股數(口數) 的設定值。 OrderCommandType: 指定下單的時間點和價格。

買進指令送出委託單後,如果委託單在K棒結束時沒有成交,委託單會被取消。

MovAvg2Line Cross LE,第 9 行:

1
  Buy("MA2CrossLE") next bar at market;
  • next bar: 保留字,表示在下一根K棒。
  • at: 保留字(skip word),無實際意義,單純增加可讀性,可省略。
  • market: 保留字,代表市價單。

這一行的意思是: 在下一根K棒以市價單買進,並命名為 “MA2CrossLE”

詳見 買賣指令

結論#

本篇使用內建腳本 MovAvg2Line Cross LE 介紹腳本的四個框架部分:

框架說明
I. 宣告宣告參數(Inputs)和變數(Variables)
II. 計算規則使用函數(Function)計算,並透過指派(Assignment)儲存結果
III. 進出場邏輯判斷使用邏輯陳述句和 if 分支語法判斷進出場條件
IV. 買進或賣出使用買賣指令(Buy/Sell/SellShort/BuyToCover)送出委託單

附錄: 註解(Comment)#

註解用來增加程式碼的可讀性,說明某一段程式碼的用途。程式執行到註解時會跳過,註解不影響程式的邏輯。

MovAvg2Line Cross LE 沒有使用到註解,但為了語法說明的完整,在此補充說明。

單行註解#

// 表示註解開始,從 // 到該行結束都視為註解。

1
// This is a comment

多行註解#

{ 表示註解開始,} 表示註解結束,中間的文字都視為註解。

1
2
3
4
{
comment1
comment2
}

Reference#

https://www.multicharts.com/trading-software/index.php?title=Category:Declaration

https://www.multicharts.com/trading-software/index.php?title=Input

https://www.multicharts.com/trading-software/index.php?title=Variable

https://www.multicharts.com/trading-software/index.php?title=Category:Comparisons_and_Loops

https://www.multicharts.com/trading-software/index.php?title=If

https://www.multicharts.com/trading-software/index.php?title=Category:Strategy_Orders

https://www.multicharts.com/trading-software/index.php?title=Buy

© 2026 CodeReindeer. All rights reserved.