PowerLanguage 建立策略完整教學:從零開始寫你的第一支交易策略
想用 MultiCharts 做程式交易,第一步就是學會用 PowerLanguage 撰寫策略。本文將從 PowerLanguage Editor 的基本操作開始,一步步帶你建立、編譯、掛載策略,到最後的回測與優化。
PowerLanguage 是什麼?
PowerLanguage 是 MultiCharts 內建的程式語言,專門用來撰寫交易策略。它的語法設計接近英文口語,即使沒有程式設計背景也能快速上手。
| 特點 | 說明 |
|---|---|
| 語法簡單 | 接近英文口語,如 Buy next bar at market; |
| 相容 EasyLanguage | 與 TradeStation 的 EasyLanguage 高度相容 |
| 三種腳本類型 | Signal(策略訊號)、Indicator(指標)、Function(函數) |
| 豐富內建函數 | 超過 300 個內建函數和保留字 |
| 即時編譯 | 寫完立刻編譯,錯誤即時回饋 |
前置準備
安裝 MultiCharts
群益期貨客戶可免費申請券商版 MultiCharts。申請方式請參考 MultiCharts 完整教學。
開啟 PowerLanguage Editor
安裝完 MultiCharts 後,開啟方式有兩種:
- 從 MultiCharts 主介面:工具列 → 「PowerLanguage Editor」
- 從開始選單:直接搜尋 PowerLanguage Editor
建立第一支策略(Signal)
Step 1:新增 Signal
開啟 PowerLanguage Editor
啟動後會看到左側的 Navigator(導航列)和右側的程式碼編輯區。
新增訊號
選單 → File → New → Signal(訊號)。輸入名稱,例如「My_First_Strategy」。
撰寫程式碼
在編輯區輸入策略程式碼(下面有範例)。
編譯
按下 F7 或點選工具列的「Compile」按鈕。如果沒有錯誤,底部會顯示「Compilation successful」。
Step 2:範例策略——雙均線交叉
這是最經典的入門策略,當短期均線上穿長期均線時買進,下穿時賣出。
// 雙均線交叉策略
// My_First_Strategy
Inputs:
FastLength(5), // 短期均線週期
SlowLength(20); // 長期均線週期
Variables:
FastMA(0),
SlowMA(0);
// 計算均線
FastMA = Average(Close, FastLength);
SlowMA = Average(Close, SlowLength);
// 進場條件
If FastMA Crosses Over SlowMA Then
Buy next bar at market;
If FastMA Crosses Under SlowMA Then
SellShort next bar at market;
程式碼解析
| 程式碼 | 說明 |
|---|---|
Inputs: | 宣告可調整的參數(名稱和預設值) |
Variables: | 宣告變數(名稱和初始值) |
Average(Close, N) | 內建函數,計算 N 根 K 棒的收盤價平均(SMA) |
Crosses Over | 上穿(FastMA 從下方穿越到上方) |
Crosses Under | 下穿(FastMA 從上方穿越到下方) |
Buy next bar at market; | 在下一根 K 棒的開盤以市價買進 |
SellShort next bar at market; | 在下一根 K 棒的開盤以市價放空 |
掛載策略到圖表
編譯成功後,需要把策略掛載到 MultiCharts 的圖表上:
開啟圖表
在 MultiCharts 中開啟你要測試的商品圖表(如台指期 TXF 5 分鐘線)。
插入訊號
在圖表上點選右鍵 → Insert Study → Signal。找到你的策略「My_First_Strategy」。
設定參數
掛載時會跳出參數設定視窗,可以修改 FastLength 和 SlowLength 的值。
檢視結果
掛載後,圖表上會顯示買賣點箭頭標記,表示策略運作成功。
PowerLanguage 基本語法
資料引用
| 語法 | 說明 | 範例 |
|---|---|---|
Open | 目前 K 棒開盤價 | Value1 = Open; |
High | 目前 K 棒最高價 | Value1 = High; |
Low | 目前 K 棒最低價 | Value1 = Low; |
Close | 目前 K 棒收盤價 | Value1 = Close; |
Volume | 目前 K 棒成交量 | Value1 = Volume; |
Close[1] | 前一根 K 棒收盤價 | Value1 = Close[1]; |
Close[N] | 往前 N 根 K 棒的收盤價 | Value1 = Close[5]; |
委託指令
| 指令 | 說明 |
|---|---|
Buy | 買進做多 |
Sell | 平多倉 |
SellShort | 賣出放空 |
BuyToCover | 平空倉 |
next bar at market | 下一根 K 棒市價成交 |
next bar at 20000 limit | 下一根 K 棒以限價 20000 成交 |
next bar at 19900 stop | 下一根 K 棒以停損價 19900 成交 |
條件判斷
// 基本 If-Then
If Close > Open Then
Buy next bar at market;
// If-Then-Else
If Close > Average(Close, 20) Then
Buy next bar at market
Else
SellShort next bar at market;
// 多條件
If Close > Open and Volume > Average(Volume, 20) Then
Buy next bar at market;
常用內建函數
| 函數 | 說明 | 範例 |
|---|---|---|
Average(Price, N) | 簡單移動平均 | Average(Close, 20) |
XAverage(Price, N) | 指數移動平均 | XAverage(Close, 12) |
RSI(Price, N) | 相對強弱指標 | RSI(Close, 14) |
Highest(Price, N) | N 根 K 棒最高值 | Highest(High, 20) |
Lowest(Price, N) | N 根 K 棒最低值 | Lowest(Low, 20) |
StandardDev(Price, N, 1) | 標準差 | StandardDev(Close, 20, 1) |
MarketPosition | 目前持倉狀態 | 1=多, -1=空, 0=無 |
EntryPrice | 進場價格 | If Close - EntryPrice > 100 Then... |
BarsSinceEntry | 進場後經過的 K 棒數 | If BarsSinceEntry > 10 Then... |
進階策略範例
範例一:布林通道突破策略
// 布林通道突破策略
Inputs:
BollLength(20),
NumDevs(2),
StopLoss(100);
Variables:
UpperBand(0),
LowerBand(0),
MidBand(0);
MidBand = Average(Close, BollLength);
UpperBand = MidBand + NumDevs * StandardDev(Close, BollLength, 1);
LowerBand = MidBand - NumDevs * StandardDev(Close, BollLength, 1);
// 突破上軌做多
If Close Crosses Over UpperBand Then
Buy next bar at market;
// 跌破下軌做空
If Close Crosses Under LowerBand Then
SellShort next bar at market;
// 停損
SetStopLoss(StopLoss * BigPointValue);
範例二:RSI 超買超賣策略
// RSI 超買超賣策略
Inputs:
RSILength(14),
OverSold(30),
OverBought(70);
Variables:
MyRSI(0);
MyRSI = RSI(Close, RSILength);
// RSI 跌破超賣區後回升,買進
If MyRSI Crosses Over OverSold Then
Buy next bar at market;
// RSI 升破超買區後回落,放空
If MyRSI Crosses Under OverBought Then
SellShort next bar at market;
// 回中線平倉
If MarketPosition = 1 and MyRSI > 50 Then
Sell next bar at market;
If MarketPosition = -1 and MyRSI < 50 Then
BuyToCover next bar at market;
範例三:加入停損停利的完整策略
// 雙均線策略(含停損停利)
Inputs:
FastLen(5),
SlowLen(20),
ProfitTarget(200), // 停利點數
StopLossAmt(100); // 停損點數
Variables:
FastMA(0),
SlowMA(0);
FastMA = Average(Close, FastLen);
SlowMA = Average(Close, SlowLen);
// 進場
If FastMA Crosses Over SlowMA Then
Buy next bar at market;
If FastMA Crosses Under SlowMA Then
SellShort next bar at market;
// 停利停損(以點數計算)
SetProfitTarget(ProfitTarget * BigPointValue);
SetStopLoss(StopLossAmt * BigPointValue);
回測與績效分析
策略掛載後,MultiCharts 會自動進行歷史回測。查看回測報告:
- 在圖表上的策略名稱右鍵 → 「Format Signal」確認設定
- 點選「Strategy Performance Report」開啟績效報告
關鍵績效指標
| 指標 | 說明 | 理想值 |
|---|---|---|
| Net Profit | 淨利潤 | 正值 |
| Profit Factor | 獲利因子(總獲利 / 總虧損) | > 1.5 |
| Max Drawdown | 最大回撤 | 越小越好 |
| Win Rate | 勝率 | 因策略而異 |
| Avg Trade | 平均每筆交易獲利 | 需扣除手續費後仍為正 |
| Total Trades | 總交易筆數 | 足夠的樣本數(> 100) |
| Sharpe Ratio | 夏普比率 | > 1 |
重要提醒:歷史回測績效不代表未來表現。回測時容易產生過度擬合(Overfitting)的問題。建議使用「樣本外測試」來驗證策略的穩健性。
常見錯誤與除錯
| 錯誤訊息 | 可能原因 | 解決方法 |
|---|---|---|
| Syntax Error | 語法拼寫錯誤 | 檢查關鍵字拼寫、分號、括號 |
| Unknown identifier | 變數未宣告 | 在 Variables: 區段宣告變數 |
| Type mismatch | 資料類型不符 | 數值與字串不能混用 |
| 策略沒有交易 | 條件太嚴格或資料不足 | 檢查條件是否能被觸發、K 棒數量是否足夠 |
| Missing semicolon | 缺少分號 | 每個語句結尾要加分號 ; |
常見問題 FAQ
不難。語法接近英文,1-2 週就能寫出簡單策略。MultiCharts 也有大量範例可以參考修改。
高度相容。絕大部分 EasyLanguage 程式碼可以直接用在 PowerLanguage,反之亦然。
需要 MultiCharts 軟體。群益期貨客戶可免費申請券商版。安裝後打開 PowerLanguage Editor 即可開始寫策略。
結論
PowerLanguage 是進入 MultiCharts 程式交易的鑰匙。從簡單的雙均線交叉策略開始,逐步加入停損停利、進階條件判斷,你就能打造屬於自己的自動化交易系統。最重要的是動手練習——理論再多,不如實際寫一支策略跑一次回測。