天天看點

量化交易政策matlab交易方案,【每日一策】MATLAB量化交易政策之 海龜組合政策...

政策名稱:海龜組合政策

政策思路:

以多均線構造海龜系統,采取加速因子跟蹤出場

回測曲線:

量化交易政策matlab交易方案,【每日一策】MATLAB量化交易政策之 海龜組合政策...

2017-2-24 11:17:21 上傳

下載下傳附件 (74.74 KB)

政策代碼:

function  Strategy1(default_unit,default_exitway,freq)%

targetList  =  traderGetTargetList();

%擷取目标資産資訊

HandleList  =  traderGetHandleList();

%擷取賬戶句柄

global  entry;

for  k=1:length(targetList);

%--------------------倉位、K線、目前bar的提取-----------------------------%

%擷取目前倉位

[marketposition,~,~]=traderGetAccountPosition(HandleList(1),targetList(k).Market,targetList(k).Code);

%政策中每次取資料的長度

dlags=10;

lags=150;

barnum=traderGetCurrentBar(targetList(k).Market,targetList(k).Code);

%資料長度限制

if(barnum

continue;

end

%擷取K線資料

[time,open,high,low,close,volume,turnover,openinterest]  =  traderGetKData(targetList(k).Market,targetList(k).Code,'min',freq,  0-lags,  0,false,'FWard');

%          [Dtime,Dopen,Dhigh,Dlow,Dclose,Dvolume,Dturnover,Dopeninterest]  =  traderGetKData(targetList(k).Market,targetList(k).Code,'day',1,0-dlags,  0,false,'FWard');

if  length(close)

continue;

end

%  虛拟交易所初始手數

totalunit=0;

%-------------------------交易邏輯-------------------------------%

%----------入場信号--------------------%

n1=100;

p=0.015;

mclose=close(end-n1:end-1);

midvalue=mean(mclose);

upvalue=midvalue*(1+p);

dnvalue=midvalue*(1-p);

con1=0;

for  i=1:length(mclose)

if  mclose(i)>upvalue  ||  mclose(i)

con1=1;

end;

end;

s(1).buycon=close(end)>max(mclose);

s(1).sellshortcon=close(end)

ma0=ma(close,5);

ma1=ma(close,20);

ma2=ma(close,50);

s(2).buycon=ma0(end)>ma1(end)  &&  ma0(end-1)ma2(end);

s(2).sellshortcon=ma0(end)ma1(end-1)  &&  ma0(end)

%----------主動出場信号----------------%

s(1).sellcon=0;

s(1).buytocovercon=0;

s(2).sellcon=0;

s(2).buytocovercon=0;

%------------被動出場操作------------------%

%找到未平倉的訂單

remain=remainorder(entry,k);

%對未平倉的訂單進行平倉判斷及操作

for  i=1:length(remain.entrybar);

%  進倉以來的bar個數

barsinceentry=barnum-remain.entrybar(i);

backlen=10;        %  回溯的長度(進倉bar之前)

%  回溯的資訊提取

[backtime,backopen,backhigh,backlow,backclose,~,~,~]  =  traderGetKData(targetList(k).Market,targetList(k).Code,'min',freq,  0-barsinceentry-backlen,  0,false,'FWard');

%  根據出場方式計算出場條件

if  remain.entryexitway(i)==1;

AFinitial=0;

AFparam=0.02;

AFmax=0.2;

Firstbarmultp=1;    %影響第一根bar的止損價,調高表示可忍受的回撤越多

[longstopcon,shortstopcon,exitline]=exit1(backopen,backhigh,backlow,backclose,remain.entrydirection(i),backlen,AFinitial,AFparam,AFmax,Firstbarmultp);

elseif  remain.entryexitway(i)==2;

initialATRparam=2;

AF=0.02;

minATRparam=1;

[longstopcon,shortstopcon,exitline]=exit2(backopen,backhigh,backlow,backclose,remain.entrydirection(i),backlen,initialATRparam,AF,minATRparam);

elseif  remain.entryexitway(i)==3;

[longstopcon,shortstopcon,exitline]=exit3(backopen,backhigh,backlow,backclose,remain.entrydirection(i),backlen);

elseif  remain.entryexitway(i)==4

startpoint=10;

percent=0.3;

TRmutlp=1;

[longstopcon,shortstopcon,exitline]=exit4(backopen,backhigh,backlow,backclose,remain.entrydirection(i),backlen,startpoint,percent,TRmutlp);

elseif  remain.entryexitway(i)==5;

initialATRparam=1.4;

AF=0.02;

minATRparam=1;

[longstopcon,shortstopcon,exitline]=exit2(backopen,backhigh,backlow,backclose,remain.entrydirection(i),backlen,initialATRparam,AF,minATRparam);

end;

%  出場執行

if  longstopcon

totalunit=totalunit-remain.entryunit(i);

entry.record{k}(remain.num(i))=0;

end;

if  shortstopcon

totalunit=totalunit+remain.entryunit(i);

entry.record{k}(remain.num(i))=0;

end;

end;

%{

%-------------------  主動出場操作  --------------------%

%再次找到未平倉的訂單

remain=remainorder(entry,k);

%  找到政策i的marketposition

s=mptaking(s,remain);

%----------------政策1----------------------%

if  s(1).sellcon  &&  s(1).marketposition>0

totalunit=totalunit-abs(s(2).marketposition);

%  把已經平掉的訂單的開關關掉

for  j=1:length(s(1).num)

entry.record{k}(remain.num(s(1).num(j)))=0;

end;

end;

if  s(1).buytocovercon  &&  s(1).marketposition<0

totalunit=totalunit+abs(s(2).marketposition);

%  把已經平掉的訂單的開關關掉

for  j=1:length(s(1).num)

entry.record{k}(remain.num(s(1).num(j)))=0;

end;

end;

%----------------政策2----------------------%

if  s(2).sellcon  &&  s(2).marketposition>0

totalunit=totalunit-s(2).marketposition;

%  把已經平掉的訂單的開關關掉

for  j=1:length(s(2).num)

entry.record{k}(remain.num(s(2).num(j)))=0;

end;

end;

if  s(2).buytocovercon  &&  s(2).marketposition<0

totalunit=totalunit+s(2).marketposition;

%  把已經平掉的訂單的開關關掉

for  j=1:length(s(2).num)

entry.record{k}(remain.num(s(2).num(j)))=0;

end;

end;

%}

%---------------------------加倉--------------------------------%

%再次找到未平倉的訂單

remain=remainorder(entry,k);

%  找到政策i的marketposition

s=mptaking(s,remain);

%  找到最近的加倉點和加倉價格

%----------------政策1----------------------%

if  s(1).marketposition~=0;

lastentrybar=max(remain.entrybar(s(1).num));

lastbarsinceentry=barnum-lastentrybar;

lastentryprice=open(end-lastbarsinceentry+1);

vector=remain.entrydirection(s(1).num);

lastdirection=vector(end);

TRvalue=TR(close,high,low);

ATR=ma(TRvalue,10);

s(1).addbuycon=0;

s(1).addsellshortcon=0;

if  lastdirection>0

s(1).addbuycon=close(end)-lastentryprice>ATR(end);

elseif  lastdirection<0

s(1).addsellshortcon=lastentryprice-close(end)>ATR(end);

end;

%---------------加倉操作-------------------------%

if  s(1).addbuycon  &&  s(1).marketposition>=2  &&  s(1).marketposition<4

addbuyunit=1;

totalunit=totalunit+addbuyunit;

[~]=entryalter(k,barnum,1,1,addbuyunit,5,1);

%  合約号,barnum,方向,開關,手數,出場,政策

end;

if  s(1).addsellshortcon  &&  s(1).marketposition<=-2  &&  s(1).marketposition>-4

addsellshortunit=1;

totalunit=totalunit-addsellshortunit;

[~]=entryalter(k,barnum,-1,1,addsellshortunit,5,1);

%  合約号,barnum,方向,開關,手數,出場,政策

end;

end;

更多免費政策源碼下載下傳,請登入atrader社群-政策服務下載下傳~