XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;visibility:hidden">

【單元8】認識PowerLanguage交易指令


前面幾個單元主要介紹PowerLanguage的ABC基礎,是必要但不免有些枯燥的過程,接下來要開始進入”產出”階段了。本篇先帶讀者認識交易相關指令,如何指示程式正確進行交易動作,包括進場、出場、掛哪一種委託等等,並做一些觀念的釐清。
 
 
>>讀完本文您可以學到什麼?
1. 運用各交易相關指令(保留字)
2. 觀念釐清,避免誤用

交易指令保留字一覽表

在【單元4】PowerLanguage的基本構成元素中,我們介紹了常用的交易相關保留字(Reserve Word),列表一覽如下先讓讀者溫習一下,本文一一用實例介紹如何運用:
 

保留字

功用

Buy

多單進場

SellShort

空單進場

Sell

多單出場

BuytoCover

空單出場

Stop

停損單

Limit

限價單

Market

市價單

Contracts/Shares

下單口數

MarketPosition

目前策略持倉部位多空

CurrentContracts

目前持倉口數(無法識別多空)

EntryPrice

進場價

BarsSinceEntry

進場後經過K棒數

四個最基本的交易指令(Buy、SellShort、Sell、BuytoCover)

交易最主要動作「做多」與「作空」,再加上在PowerLanguage語言中又把出場與進場兩個動作區分開,因此形成四個基本交易指令「Buy」、「SellShort」、「Sell」、「BuytoCover」:
 
 
舉例與重要觀念如下:
 
1.多空互翻
 
在我們前面多次舉例的2條均線交叉策略,它的交易動作是:
 
============================================
If average(close,5) cross over average(close,20) then buy next bar at market;
 
If average(close,5) cross below average(close,20) then sellshort next bar at market;
============================================
 
程式語法翻成白話就是:
當5日均線向上穿越20日均線,下一根K棒開盤市價做多。
當5日均線向下穿越20日均線,下一根K棒開盤市價做空。
 
這是一個沒有出場動作的腳本,使得這個策略不斷多空互翻,不會空手,永遠有部位在倉。此外,策略不允許部位多空並存,所以當訊號從Buy轉換為SellShort或是反之從SellShort轉為Buy,它意味著反手建倉,亦即不管原本剩多少口單,MC的交易動作是一律平倉並反手建立反向部位,這個觀念當策略不再是單純的一口單進出,而是較複雜的分批進出時就會派上用場。
 
2.加上出場動作
 
繼續沿用2條均線交叉策略,這次我們加上出場動作,當乖離過大就先停利出場,我們用長短均線兩者差值超過100點定義為乖離過大,腳本如下:
 
============================================
If average(close,5) cross over average(close,20) then buy next bar at market;
 
If average(close,5) cross below average(close,20) then sellshort next bar at market;
 
If marketposition=1 and average(close,5)- average(close,20)>100 then sell next bar at market;
 
If marketposition=-1 and average(close,20)- average(close,5)>100 then buytocover next bar at market;
============================================
 
加了出場動作,策略就可能出現空手的期間,出場的時機或訊號很多種,後面我們另有專章介紹。此外,在上面腳本中「marketposition=1」或「marketposition=-1」可省略,因為這個腳本很單純程式可自行正確判斷,但建議可以養成習慣加上去,因為當進出邏輯比較複雜時就可以協助我們避免錯亂。
 
3.為進出訊號取名字
 
視需要四個基本交易指令也可以在其後加上字串為該訊號取名,如果在一個交易策略中有多個不同的進出邏輯,取名作為識別更有其必要。取名的語法如下:
 
============================================
If average(close,5) cross over average(close,20) then buy (“2MA Buy”)next bar at market;
 
If average(close,5) cross below average(close,20) then sellshort(“2MA Short”)next bar at market;
============================================
 
 
訊號取名有幾個限制,第一同樣是不能使用中文,第二是同一個策略中,名字不能重複。

委託方式Limit 與 Stop區別

在前例我們都是用「….next bar at market;」,也就是當根K棒收完,條件確立,下根K棒一開盤就市價進場。用Limit或Stop掛單就是一個預掛單的概念,要等待市場價格來到掛價才會進行交易。
 
Limit就是限價單,相信有交易經驗的讀者都很熟悉,但由於台灣期交所並沒有停損單(Stop)的設計,沒交易過海期的交易人一開始對Stop單就容易搞混。簡單講,Limit單使用時機是「低買高賣」,Stop單則是「高買低賣」,詳細說明可參考精選專欄。簡單來理解,當要出場時Limit單是用來停利,Stop單是用來停損;當空手要進場時,Limit單是逆勢,Stop單是順勢。
 

 

出場時

進場時

Limit單=低買高賣

停利

逆勢

Stop單=高買低賣

挺損

順勢

 
再以兩條均線交叉策略舉例,這次我們加上停損(50點)及停利(100點)出場機制,腳本如下:
 
============================================
If average(close,5) cross over average(close,20) then buy next bar at market;
 
If average(close,5) cross below average(close,20) then sellshort next bar at market;
 
If marketposition=1 then begin
     Sell next bar at entryprice+100 Limit;
     Sell next bar at entryprice-50 Stop;
End;
 
If marketposition=-1 then begin
     BuytoCover next bar at entryprice-100 Limit;
     BuytoCover next bar at entryprice+50 Stop;
End;
============================================
 
以上這個寫法是當進場後(有部位),會同時預掛出停利單與停損單,MultiCharts下單機制將之視為OCO單(二擇一,一邊成交另一邊自動取消) ,以達到要嘛停利要嘛停損的效果。 EntryPrice這個保留字很實用,就是回傳進場價。 
 
初學程式交易很容易把Limit 與 Stop委託搞混,當你發現跑出來的交易訊號跟預想不同時,也可以先檢查這方面是否有寫錯。

MarketPosition策略部位多空

MarketPosition會回傳當下策略的多空部位:
空手:MarketPosition=0 
多單:MarketPosition=1
空單:MarketPosition=-1
 
是的,MarketPosition只會告訴我們目前策略是多空或空手,並不會牽涉部位口數。所以如果要表達目前部位是2口多單,語法就要這樣寫:
 
… MarketPosition=1 and CurrentContracts=2 …
 
前面有提過MarketPosition可以協助判斷或限制目前部位多空,運用很廣泛,尤其當交易邏輯比較複雜時非常重要。MarketPosition的完整語法:MarketPosition(N) ,其中N可以指定回傳前幾個訊號部位的多空,例如MarketPosition(1)回傳上一個訊號的多空,不指定N,也就是直接寫MarketPosition就是指目前的策略部位。
 
但實務上,我們更常需要用到的是前N根K棒的多空部位,但MarketPosition[N]這種語法並不被允許,解決方法是另設一個變數來紀錄MarketPosition,例如我們想要判斷部位多空有變化的K棒的(前後根K棒的多空不同),腳本可以這樣寫:
 
Vars:MarketP(0);
 
MarketP=MarketPosition;
Condition1=MarketP[1]<> MarketP;
 
上面這個技巧以後會常用到。

複數次進場(加碼)與下單口數

MultiCharts下單口數預設1口為單,如果要下更多口數可在交易指令後面加N contracts(或是shares),語法如下:
 
============================================
If average(close,5) cross over average(close,20) then buy 5 contracts next bar at market;
If average(close,5) cross below average(close,20) then sellshort 5 contracts next bar at market;
============================================
 
 
此外,交易訊號預設多空同方向只能進出1趟,想要加入同方向的加碼訊號,需修改設定值,在設定>訊號>屬性:
 
  
改完設定後,我們在原有的進場條件多加一個獲利達10000元以上就再加碼1口,加入新的加碼語法後腳本如下:
 
============================================
If average(close,5) cross over average(close,20) then buy("2MA Buy") next bar at market;
 
If average(close,5) cross below average(close,20) then sellshort("2MA Short")  next bar at market;
 
if marketposition=1 and openpositionprofit>10000 then buy("Buy plus")  next bar at market;
 
if marketposition=-1 and openpositionprofit>10000 then sellshort("Short plus")  next bar at market; 
============================================
 
在MultiCharts線圖上呈現如下圖,因我們在語法有幫每個進出訊號取名,以方便我們識進場訊號是根據何條件進場:
 
 
有關加減碼的語法這邊僅簡單示範,實務上要處理較多細節,也比較容易遇到錯誤,此外,不同訊號寫在同一個策略裏也有其缺點,容我們之後再另闢專章介紹,初學者建議先從單一訊號,一口單進、一口單出開始學。

快速結論

本文介紹多、空、進、出等交易指令的語法以及觀念,包括多空互翻、出場、區別Limit與Stop委託、複數次進出場等等,初學者如果是從本系列文第1單元開始學起,到完成本單元,可以說已經初步具有撰寫及閱讀交易策略腳本的基礎,我們建議讀者不用急著去寫自己的策略,多花心思先去觀摩參考別人現成的腳本會更有幫助,在下一單元,我們教各位如何從PowerLanguage內建許多常用訊號或指標的腳本挖寶,以加快學習腳步。
 

【警語】:

  1. 本文所舉之語法範例為教學之用,非提供交易策略,請讀者警慎運用。
  2. 自動交易如遇系統異常或斷線等問題,可能暴露更高的風險,交易人仍應檢查電腦系統或網路之狀態,特別要隨時注意部位變化,以降低相關風險。

點我,看更多程式交易教學https://www.pfcf.com.tw/eventweb/multicharts/

期貨線上開戶 期貨營業員專區
/統一期貨相關連結/
選擇權工具箱選擇權工具箱股票期貨工具箱
亞股指數工具箱程式交易工具箱期貨學起來
統一期貨FB統一期貨YouTube統一期貨LINE統一期貨IG