電子信箱 service [at] bituzi.com
幣圖誌首頁 facebook粉絲團 google plus google plus


第一次程式交易就上手-如何建構第一支自己的程式


程式獵人您好!
我是程式交易新手,所以我不太知道該怎麼寫出交易策略耶!該怎麼辦呢?
剛踏入程式交易世界的新手,除了硬體跟軟體上的問題之外,
最大的問題就是要如何去建構出自己的第一支程式,
今天就來教教大家如何建構一支簡單的當沖程式。



一支交易程式的主軸就是進場邏輯,
進場邏輯又分順勢或是逆勢
大家可能會想說,
大盤大概有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 意見: