程式獵人您好!
我是程式交易新手,所以我不太知道該怎麼寫出交易策略耶!該怎麼辦呢?
剛踏入程式交易世界的新手,除了硬體跟軟體上的問題之外,
最大的問題就是要如何去建構出自己的第一支程式,
今天就來教教大家如何建構一支簡單的當沖程式。
一支交易程式的主軸就是進場邏輯,
進場邏輯又分順勢或是逆勢
大家可能會想說,
大盤大概有70%的時間都在盤整沒有特別的方向,
所以用逆勢的方法可能比較容易賺錢,
但是真的是這樣嗎?
其實不一定啦!貼著盤勢做,就會賺到錢了,
順勢逆勢也不是那麼重要,就差在你進場的相對位置。
我們今天打算來寫出一支當沖的程式,
基本的進場邏輯很簡單,
當價格往上突破我們設定的壓力線,我們就作多;
當價格往下跌破我們設定的支撐線,我們就作空。
重點來了,我們怎麼設定壓力線跟支撐線呢?
獵人在這邊提供一個最簡單的想法,
我們設定開盤後一段時間的最高點跟最低點當作一個區間,
往上突破最高點的某個比例就進場做多;
往下跌破最低點的某個比例就進場做空。
現在就開始來撰寫我們的程式碼吧!
參數與變數設定
首先,我們必須先設定我們的參數,
因為我們要突破區間上下的某個比例,
所以我們把比例當作是一個參數,
也方便讓大家可以去最佳化。
再來,因為我們是設定開盤後一段時間的高低點區間,
所以我們開始交易的時間必須限定在那段時間之後,
而且我們總不會一直交易到收盤吧!
所以我們必須設定一個停止交易的時間。
input : R(0.002),BeginTime(0915),EndTime(1245);
Input後面是接我們程式裡可變動的參數,
千萬記得,每句程式碼寫完都要記得加分號「;」
R是代表區間上下的某個比例,
BeginTime是我們開始交易的時間,
EndTime是我們終止交易的時間。
接著我們必須要有變數來儲存我們開盤後一段時間的高低點,
var: TH(0),TL(0),mkp(0),ax(0),ay(0);
TH是用來儲存我們當日某段時間裡的最高點;
TL是用來儲存我們當日某段時間裡的最低點。
mkp用來儲存我們手邊部位狀態。
ax用來計算我們作多的次數,
ay用來計算我們作空的次數。
ax跟ay可以用來限制我們當日多空交易次數。
所以部位狀況跟作多、作空次數,每天都必須歸零,
if date <> date[1] then begin
mkp=0;
ax=0;
ay=0;
end;
進場方式
程式的核心來了,
首先我們會先設定進場時間範圍,
所以我們先設定進場時間在9點到13點。
基本上當沖程式不一定要像留倉程式總是有部位在,
所以我們設定不管多單或是空單進場時,
手邊都不要有任何部位。
當K線最高價格往上突破區間高點的某個比例後,價格過高點進場作多;
當K線最低價格往下跌破區間低點的某個比例後,價格過低點進場作空。
if BeginTime < Time and Time < EndTime then begin
if MarketPosition = 0 and high > TH*(1+R) then buy next bar at highest(high,1)+1 stop;
if MarketPosition = 0 and low < TL*(1-R) then sell next bar at lowest(low,1)-1 stop;
end;
不過我們總不會無限制的進場吧!
所以可能會去限制我們的進場次數,
所以你可以這樣去記錄你的進場次數,
mkp=marketposition;
if mkp[1]<>1 and mkp=1 then ax=ax+1;
if mkp[1]<>-1 and mkp=-1 then ay=ay+1;
我們用mkp去儲存部位狀況,
當你前一個部位不是多單,而現在進多單,
ax就加1,表示作多一次,空單亦然。
出場方式
最後,有進必有出嘛!
基本上我們設定停損點數為50點,
當然,如果你容忍度比較小,停損可以設小一點,
不過當盤在掃的時候,停損太小很容易被掃出場。
然後,在1點40分時,手中的部位還沒出場的話,
就讓它通通出場吧!
最後有一個小地方要注意一下,
因為每個月結算時,交易時間只有到1點30分,
所以結算當天大家可能都會自己手動出場,
或是乾脆抱給他結算,所以必須加上setexitonclose這個指令,
就可以確保你在回測的每一天都會出場。
if marketposition =1 then begin
exitlong at entryprice-50 stop ;
if time>1339 then exitlong this bar on close;
end;
if marketposition =-1 then begin
exitshort at entryprice+50 stop ;
if time>1339 then exitshort this bar on close;
end;
setexitonclose;
事實上,你把這樣的程式套進去作回測,
你會發現績效並沒有很好,
為什麼呢?
首先是交易次數太多,所以我認為你必須去限制你的交易次數,
通常我們會限定一天多空各作一次,
最多多空不會各作超過2次,
畢竟你可能不只有一支程式,
可以讓其他的程式來互補,
沒有必要通通讓同一支程式在那邊拼命阿!
除了限制進場次數來降低交易次數之外,
我們還可以利用其他的濾網來降低我們的交易次數,
這個以後我們在慢慢來介紹。
當然,你也可以縮短你的交易時間,
這樣也可以減少你的交易次數。
但是,大家可能會覺得說,為什麼績效不太好?
大家要知道,每種進場邏輯有它的優點跟缺點,
每種進場邏輯在設定時,想要抓的盤勢可能不相同。
而這種固定區間的進場方式,
如果遇到一路到底的盤,當然是賺翻了。
但是他最怕是上沖下洗的盤了,
尤其是在計算區間的時間裡,
指數波動過大,會讓你的區間也變得很大,
這樣當指數走勢轉向時,會讓你進場變得相對緩慢。
所以大家在寫程式的時候,
必須要清楚自己程式的死穴,
你可以經由觀察K線圖的進出場點,
來發現你程式的問題所在。
因為你知道你程式的死穴在哪?
你才有辦法加些濾網去過濾掉一些你不想要的進場點,
當然不是過度的去fit市場而加了太多的東西。
而要提升績效跟減少drawdown還可以從出場點改進,
畢竟這支範例程式的出場點太單調了,
只有停損跟收盤出場,
你可以加入拉回出場或是一些保護性跟追蹤性的出場方式,
以前也有介紹過一些出場方式,
以後有機會我們也會介紹一些不一樣的出場方式。
建構出一支基本的程式,其實不難,
我們可以由上面這樣的流程,去寫出自己的程式,
最難的是如何把你的想法寫成程式,
新手因為不熟程式指令語言,
所以常常會不知道如何用程式語言表達出自己的想法,
這部分就必須要多看、多問、多寫程式才可以更精進!
最後把完整的程式法分享給大家
input : R(0.002),BeginTime(0915),EndTime(1245);
var :TH(0),TL(0),mkp(0),ax(0),ay(0);
if date <> date[1] then begin
mkp=0;
ax=0;
ay=0;
end;
if time=BeginTime then begin
TH=highd(0);
TL=lowd(0);
end;
if BeginTime < Time and Time < EndTime then begin
if MarketPosition = 0 and ax < 2 and high > TH*(1+R) then buy at highest(h,1)+1 stop;
if MarketPosition = 0 and ay < 2 and low < TL*(1-R) then sell at lowest(l,1)-1 stop;
end;
mkp=marketposition;
if mkp[1] <> 1 and mkp=1 then ax=ax+1;
if mkp[1] <> -1 and mkp=-1 then ay=ay+1;
if marketposition =1 then begin
exitlong at entryprice-50 stop ;
if time>1339 then exitlong this bar on close;
end;
if marketposition =-1 then begin
exitshort at entryprice+50 stop ;
if time>1339 then exitshort this bar on close;
end;
setexitonclose;
0 意見:
張貼留言