一分鐘看懂
PowerLanguage 是 MultiCharts 的策略語言,寫法跟 TradeStation 的 EasyLanguage 幾乎一樣。一個策略通常分四段:參數(Inputs)、變數(Vars)、計算、下單。下單只有四個動詞:Buy(買進做多)、Sell(多單出場)、SellShort(放空)、BuyToCover(空單回補),後面接「next bar at market」這類條件。停損停利用 SetStopLoss、SetProfitTarget,參數是金額,要用點數乘上每點價值(BigPointValue)。
把「20 日均線往上穿過 60 日均線就買進、虧 300 點就停損」這句話寫成 PowerLanguage,只要十幾行。這篇用這個例子,把最常用的語法一次講完。
一個策略的四段結構
Inputs: FastLen(20), SlowLen(60), StopPts(300);
Vars: FastMA(0), SlowMA(0);
FastMA = Average(Close, FastLen);
SlowMA = Average(Close, SlowLen);
If CurrentBar > SlowLen then begin
If FastMA crosses over SlowMA then Buy ("LE") next bar at market;
If FastMA crosses under SlowMA then Sell ("LX") next bar at market;
end;
SetStopLoss(StopPts * BigPointValue);
| 段落 | 這段在做什麼 |
|---|---|
| Inputs | 參數,可以在圖表上直接改數字、也可以拿來做最佳化 |
| Vars | 變數,括號裡是初始值 |
| 計算 | 算均線,Average 是一般均線,Close 是收盤價 |
| 下單 | 均線交叉時,下一根 K 棒開盤用市價進出場 |
| SetStopLoss | 每口虧到一定金額就出場 |
CurrentBar > SlowLen 的意思是:K 棒數量要超過 60 根,60 日均線才算得出來,在這之前不下單。
四個下單動詞
| 指令 | 意思 | 例子 |
|---|---|---|
| Buy | 買進做多 | Buy (“LE”) next bar at market; |
| Sell | 賣出多單(出場) | Sell (“LX”) next bar at market; |
| SellShort | 賣出放空 | SellShort (“SE”) next bar at market; |
| BuyToCover | 買回空單(出場) | BuyToCover (“SX”) next bar at market; |
括號裡的文字是這筆單的名稱,回測報告會用它分辨每種進出場。
「Sell」在 PowerLanguage 裡只用來平多單,不會開空單。要放空一定要寫 SellShort,這是新手最常寫錯的地方。
下單的價格條件
| 寫法 | 意思 |
|---|---|
| next bar at market | 下一根 K 棒用市價 |
| next bar at 45000 limit | 下一根 K 棒掛 45,000 的限價單 |
| next bar at 45000 stop | 下一根 K 棒價格碰到 45,000 才觸發(突破單、停損單) |
| this bar on close | 這根 K 棒收盤價(回測可用,實單要小心) |
this bar on close 在回測裡會用收盤價成交,但實單時,你要等收盤價出來才知道訊號,那時候已經收盤了。用它回測,結果會比實際好看,屬於「偷看未來」的一種。比較保守的寫法是一律用 next bar。
常用函數與保留字
| 名稱 | 用途 |
|---|---|
| Average(Close, 20) | 20 日一般均線 |
| XAverage(Close, 20) | 20 日指數均線(EMA) |
| Highest(High, 20) | 最近 20 根的最高價 |
| Lowest(Low, 20) | 最近 20 根的最低價 |
| AvgTrueRange(14) | 14 日 ATR |
| RSI(Close, 14) | 14 日 RSI |
| MarketPosition | 目前部位:1 是多單、−1 是空單、0 是空手 |
| EntryPrice | 進場價格 |
| BarsSinceEntry | 進場後過了幾根 K 棒 |
| BigPointValue | 每一點的價值,大台 200、小台 50、微台 10 |
停損停利的金額要乘上每點價值
SetStopLoss 和 SetProfitTarget 的參數要填「每口的金額」,填點數會出錯。以停損 300 點為例:
| 商品 | 寫法 | 實際金額 |
|---|---|---|
| 大台 | SetStopLoss(300 * BigPointValue) | 300 × 200 = 60,000 元 |
| 小台 | 同上 | 300 × 50 = 15,000 元 |
| 微台 | 同上 | 300 × 10 = 3,000 元 |
用 BigPointValue 寫,換商品時就不用改程式。如果直接寫 SetStopLoss(300),在大台上只代表 300 元,等於 1.5 點,一進場就會被停損。
進階:ATR 移動停損
固定點數的停損跟不上市場波動,可以改成「進場後最高價減 2 倍 ATR」:
Vars: TrailStop(0);
If MarketPosition = 1 then begin
TrailStop = Highest(High, BarsSinceEntry + 1) - 2 * AvgTrueRange(14);
Sell ("ATR_LX") next bar at TrailStop stop;
end;
MultiCharts 的委託只對下一根 K 棒有效,所以這段每根 K 棒都會重新計算、重新送出停損單。ATR 停損為什麼比固定點數合理,以及倍數怎麼選,可以看ATR 停損怎麼設。
寫第一個策略前先做這三件事
- 把規則寫成一句話:「什麼情況進場、什麼情況出場、虧多少停損」,寫不成一句話的規則,程式也寫不出來。
- 一律用 next bar:避免用當根收盤價成交,回測才不會比實際好看。
- 停損用 BigPointValue 換算:確認回測報告裡的單筆最大虧損,跟你預期的金額一致。
平台怎麼選可以看程式交易平台怎麼選,程式交易的整體流程在期貨程式交易怎麼開始。