策略的框架和基本語法#
透過一個簡單的內建策略範例 MovAvg2Line Cross LE(兩條均線黃金交叉買進策略),快速了解腳本的框架和基本語法。
打開 PowerLanguage Editor -> 檔案 -> 開啟檔案 -> 公式類型 -> 訊號(打勾) -> MovAvg2Line Cross LE。

MovAvg2Line Cross LE 的程式碼:
| |
框架總覽#
腳本的框架由四個部分組成:
| 框架 | 說明 | 對應程式碼行數 |
|---|---|---|
| I. 宣告 | 宣告參數和變數 | 第 1-2 行 |
| II. 計算規則 | 使用函數計算指標值,並指派給變數 | 第 4-5 行 |
| III. 進出場邏輯判斷 | 組織邏輯條件,搭配 if 分支語法判斷 | 第 7-8 行 |
| IV. 買進或賣出 | 執行買賣下單指令 | 第 9 行 |
I. 宣告#
參數(Inputs) 和變數(Variables)#
參數(Input)和變數(Variable)可以想像成一個容器(Ex: 瓶子),容器內儲存需要的資料(Ex: 5公升)。 在使用容器之前,需要先 宣告,宣告會告訴編譯器要儲存的資料的型別,型別決定了可以對資料做哪些操作(Ex: 算術運算或是文字串接)。
因此,參數和變數分成 宣告 和 使用 兩個階段:
- 宣告: 宣告參數或變數的名稱,給予預設值或初始值,同時定義型別,型別可以是數值(Numerical)、字串(String)、真假值(TrueFalse)。
- 使用: 在程式碼中使用參數或變數的名稱,當程式執行到名稱時,就會去使用儲存的值。
參數(Inputs)宣告的語法#
| |
Inputs: 表示宣告參數。
InputName: 參數的名稱,名稱不區分大小寫,不能是數字或句點(.)開頭。
DefaultValue: 參數的預設值,預設值決定參數的型別。
註: 宣告的結束要加分號(;),沒有加會編譯錯誤。
參數值只能透過預設值設定,在腳本中 無法 透過程式碼更改參數值。你可以從 MultiCharts 設定新的預設值,不需要重新編譯即可套用。
MovAvg2Line Cross LE,第 1 行:
| |
宣告三個參數:
| 參數名稱 | 預設值 | 說明 |
|---|---|---|
Price | Close(收盤價) | 計算均線使用的價格 |
FastLength | 9 | 快線的K棒數量 |
SlowLength | 18 | 慢線的K棒數量 |
下圖是在 MultiCharts -> 設定 -> 訊號 -> MovAvg2Line Cross LE -> 設定 中可以看到這三個參數和對應的預設值。因為沒有從 MultiCharts 修改數值,所以都是使用腳本中定義的預設值。

變數(Variables)宣告的語法#
| |
Variables: 表示宣告變數。
VariableName: 變數的名稱,名稱可以是字母、底線、數字、句點(.)組成,不區分大小寫,不可以是數字或句點(.)開頭。
InitialValue: 變數的初始值,初始值決定變數的型別。
註: 宣告的結束要加分號(;),沒有加會編譯錯誤。
變數值透過初始值設定後,可以在腳本中透過程式碼更改(指派其他的值)。這是變數和參數的主要差異。
MovAvg2Line Cross LE,第 2 行:
| |
宣告兩個變數: var0 和 var1,初始值皆為 0。
保留字(Reserved Word)#
保留字是在 PowerLanguage 中具有特殊意義的單字,不能 被拿來當作參數或變數的名稱。
例如:
Inputs、Variables是宣告用的語法保留字。Close(收盤價)、Open(開盤價)、High(最高價)、Low(最低價) 是代表價格的保留字。
PowerLanguage 還有其他保留字,可以遇到時再查詢。
II. 計算規則#
函數(Function)#
函數跟參數和變數一樣,可以想像成是一個容器,但容器裡面放的是一連串的程式碼。當我們想要重複使用這段程式碼時,不需要全部重寫一次,只需要使用函數名稱,程式在執行到函數名稱的時候,就會去執行對應的程式碼。
函數分成兩個階段:
- 定義(實作): 將想要當作函數使用的程式碼寫好和編譯。詳見 函數(Function)。
- 使用(呼叫): 使用函數名稱和給予參數值,當程式執行到函數名稱時,就會代入參數值和執行對應的程式碼。
由於這篇只是入門介紹,因此只先說明函數的 使用(呼叫)。
函數的呼叫語法#
| |
FunctionName: 要使用的函數名稱。
input: 傳給函數參數的值。
PowerLanguage 提供許多常用功能的內建函數。AverageFC(PriceValue, Len) 是其中之一,計算 Len 根K棒的 PriceValue 的平均值。
MovAvg2Line Cross LE,第 4-5 行:
| |
Price、FastLength、SlowLength 是第 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 if、while)時,為數學的等於 |
下面是一個簡單的例子:
| |
第一行是宣告變數。第二行 BottleA = BottleB + BottleC;,如果從數學的角度來看: BottleA 的值是 5,而 BottleB + BottleC 的值是 8,5 怎麼會等於 8?
因為這裡的等號(=)不是「等於」,而是「指派」:
先計算右邊: BottleB(3) + BottleC(5) = 8,再將 8 指派給 BottleA,BottleA 原來的值(5)被覆蓋,變成 8。
MovAvg2Line Cross LE,第 4-5 行:
| |
將 AverageFC(Price, FastLength) 的計算結果指派給 var0,AverageFC(Price, SlowLength) 的計算結果指派給 var1。
由上一小節得知,var0 是快線(9MA),var1 是慢線(18MA)。
III. 進出場邏輯判斷#
分支(Branch)#
PowerLanguage 提供了 if 分支語法,來決定程式執行的方向: 當滿足某些條件時執行某些指令,否則執行其他指令。
分成兩個步驟:
- 使用 邏輯運算子(Logical Operator)組成 邏輯陳述句(Logical Expression)。
- 將 邏輯陳述句 搭配
if分支語法決定執行方向。
邏輯運算子(Logical Operator)#
| 運算子 | 說明 |
|---|---|
and | 當兩邊都為真時,回傳 true,否則回傳 false |
or | 只要其中一邊為真,回傳 true,否則回傳 false |
邏輯陳述句(Logical Expression)#
邏輯陳述句 是回傳值為真假值型別的陳述句。
| 範例 | 說明 | 值 |
|---|---|---|
5 < 3 | 5 小於 3 | false |
8 <> 9 | 8 不等於 9 | true |
8 <> 9 and 5 < 3 | 8 不等於 9 且 5 小於 3 | false |
第一個步驟: 組織邏輯陳述句#
MovAvg2Line Cross LE,第 7 行:
| |
等號(=)是指派,先計算右邊。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 分支語法:
| |
E: 邏輯陳述句。
I1: 邏輯陳述句為真時,執行的指令。
MovAvg2Line Cross LE,第 8-9 行:
| |
如果 Condition1 為 true(即快線向上穿越慢線),則執行 Buy("MA2CrossLE") next bar at market;。
詳見 分支(Branch)。
IV. 買進或賣出#
買賣指令#
PowerLanguage 提供了 Buy、Sell、SellShort 和 BuyToCover 四個買賣下單指令。
MultiCharts 在執行到這些指令時,就會送出委託單。
Buy(買進)指令的語法#
| |
EntryLabel: 命名買進名稱,會顯示在圖表上。賣出時可以用名稱指定要賣出哪一筆買進。
[] 代表可省略,預設名稱為 “Buy”、“Buy#2”、“Buy#3”,以此類推。
TradeSize: 指定下單的股數(口數)。
[] 代表可省略,預設使用 設定 -> 策略屬性 -> 屬性 -> 固定委託股數(口數) 的設定值。
OrderCommandType: 指定下單的時間點和價格。
買進指令送出委託單後,如果委託單在K棒結束時沒有成交,委託單會被取消。
MovAvg2Line Cross LE,第 9 行:
| |
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 沒有使用到註解,但為了語法說明的完整,在此補充說明。
單行註解#
以 // 表示註解開始,從 // 到該行結束都視為註解。
| |
多行註解#
以 { 表示註解開始,} 表示註解結束,中間的文字都視為註解。
| |
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