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

第一次程式交易就上手-突破當日高點與低點進場策略



首先我們要為賈伯斯哀悼,
賈伯斯雖然走了,但他精彩的一生,將永遠流傳下去。
看看人家,再看看自己,真是平凡的一生阿!
我們只好為了賺自己的生活費,繼續來打拼吧!



之前已經介紹過兩種交易邏輯,
這次獵人在提供一種想法給大家參考。
想當初獵人還是新手的時候,
每天看著K線圖想策略,
就在想說,怎樣的盤勢叫強,怎樣叫弱呢?
後來獵人就靈機一動,
假設K棒過當日高點幾次表示盤比較強,就進場作多;
K棒過當日低點多少次表示盤比較弱,就進場作空。
不過這樣的策略到底可不可以賺錢呢?
我們就來撰寫程式碼作回測看看吧!



參數與變數設定


首先,我們必須先設定我們的參數,
因為我們要突破當日高點或低點某個次數才要進場,
所以我們把次數當作是一個參數,
也方便讓大家可以去作參數調整。
當然我們還是必須設定一個停止交易的時間。
input : r(4),BeginTime(0900),EndTime(1245);

r是代表需要突破的次數,
BeginTime是我們開始交易的時間,
EndTime是我們終止交易的時間。

接著為了要記錄突破高點跟低點的次數,
所以要設定幾個變數來使用。
var: TH(0),TL(0),mkp(0),ax(0),ay(0),aa(0),bb(0);

TH是用來儲存當日的最高點;
TL是用來儲存當日的最低點。
mkp用來儲存我們手邊部位狀態。
ax用來計算我們作多的次數,
ay用來計算我們作空的次數。
aa用來記錄突破高點的次數,
bb用來記錄突破低點的次數。
ax跟ay可以用來限制我們當日多空交易次數。
所以部位狀況跟作多、作空次數,每天都必須歸零。
if date <> date[1] then begin
mkp=0;
ax=0;
ay=0;
aa=0;
bb=0;
TH=high;
TL=low;
end;

那TH跟TL要怎麼來記錄當日高點跟低點呢?
aa跟bb又要怎麼紀錄過高點跟過低點的次數呢?
if high > TH then begin
TH=high;
aa=aa+1;
end;
if low < TL then begin
TL=low;
bb=bb+1;
end;

這樣當高點被突破,TH就會替換成高點,aa就會加總1次,反之亦然。

進場方式


程式的核心來了,
首先我們會先設定進場時間範圍,
所以我們先設定進場時間在9點到12點45分。
基本上當沖程式不一定要像留倉程式總是有部位在,
所以我們設定不管多單或是空單進場時,
手邊都不要有任何部位。
當突破高點次數超過設定的次數後,價格過當日最高點進場作多;
當突破低點次數超過設定的次數後,價格破當日最低點進場作空。
if BeginTime < Time and Time < EndTime then begin
if MarketPosition = 0 and ax < 1 and aa > r and aa > bb then buy next bar at highd(0)+1 stop;
if MarketPosition = 0 and ay < 1 and bb > r and bb > aa then sell next bar at lowd(0)-1 stop;
end;

在這邊我們加入了一個小濾網,就是在作多時,aa要大於bb,
表示過高次數要多於破低次數,反之亦然。

出場方式


基本上我們設定停損點數為50點。
最後在1點40分時,手中的部位還沒出場的話,
就讓它通通出場吧!
不過每次都只有這些出場點好像有點單調,
而且這樣的話DD都會很大,
等等獵人在加幾個出場點看看會不會好一點。
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;

我們來看一下報表



上圖是總績效表



上圖是每年獲利情況

我們可以發現,最近三年好像績效不太好,
都賺不到錢,這樣的程式沒辦法拿來用。
那要怎麼改善呢?
今天要從出場點來改善,看看可不可以把DD降低,獲利給拉高。
在這邊獵人加入了兩種出場點進去:
1. 當你進場後,最大獲利點數小於50點的話,
我們在最近24根K棒的高點(作空時)或低點出場(作多時)。
2. 作多時,從最高點拉回1.5%時出場;
作空時,從最低點拉回1.5%時出場。
在加了這兩種出場點後會有什麼影響呢?
我們把兩種策略績效整理如下:
策略一是原來版本,策略二是加了新出場點的版本。



上圖為每年績效表



上圖為每年績效圖



上圖為其他報表重要數據

從上面績效比較表可以看出,
加了其他出場點之後,績效有拉起來了,
DD也變小了,雖然勝率變低,因為多了保護性的出場點,
不過整體看來比原來只有基本的出場點好多了。
我們可以發現,一個好的交易策略不只要有好的進場點,
其實有好的出場點更重要,因為好的出場點可以控制你的風險,
也可以提升你的獲利。
不過這策略的進場點還是有點多,這邊就要讓大家來腦力激盪一下,
大家可以再多加一些濾網來過濾一些次數,
添加濾網的概念在於你要知道你的程式弱點在哪,
所以你要避免怎樣的情況進場,才可以保護你避免被亂掃。

最後把完整的程式法分享給大家

input : r(4),BeginTime(0900),EndTime(1245);
var :TH(0),TL(0),mkp(0),ax(0),ay(0),aa(0),bb(0);
if date <> date[1] then begin
mkp=0;
ax=0;
ay=0;
aa=0;
bb=0;
TH=high;
TL=low;
end;
if high > TH then begin
TH=high;
aa=aa+1;
end;
if low < TL then begin
TL=low;
bb=bb+1;
end;
if BeginTime < Time and Time < EndTime then begin
if MarketPosition = 0 and ax < 1 and aa > r and aa > bb then buy at highd(0)+1 stop;
if MarketPosition = 0 and ay < 1 and bb > r and bb > aa then sell at lowd(0)-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 highest(h,barssinceentry)-entryprice < 50 then exitlong at lowest(low,24)-1 stop;
exitlong at highd(0)*0.985 stop;
if time>1339 then exitlong this bar on close;
end;
if marketposition =-1 then begin
exitshort at entryprice+50 stop ;
if entryprice-lowest(h,barssinceentry) < 50 then exitshort at highest(high,24)+1 stop;
exitshort at lowd(0)*1.015 stop;
if time>1339 then exitshort this bar on close;
end;
setexitonclose;

0 意見: