- 精华
- 0
- 在线时间
- 37 小时
- UID
- 247176
- 积分
- 162
- 帖子
- 72
- 阅读权限
- 0
- 注册时间
- 2017-2-14
- 最后登录
- 2017-5-18
- 精华
- 0
- UID
- 247176
- 积分
- 162
- 帖子
- 72
- 主题
- 68
- 阅读权限
- 0
- 注册时间
- 2017-2-14
- 最后登录
- 2017-5-18
|
发表于 2017-3-21 11:08:31
|显示全部楼层
策略原理:
通过布林带以及突破后的高低点的形成产生交易信号
采取跟踪止损出场
策略源码:
function Strategy1(default_unit,default_exitway,freq)%
targetList = traderGetTargetList();
%获取目标资产信息
HandleList = traderGetHandleList();
%获取账户句柄
global entry;
global record;
global stopprice;
global boll;
for k=1:length(targetList);
%--------------------仓位、K线、当前bar的提取-----------------------------%
%获取当前仓位
[marketposition,~,~]=traderGetAccountPosition(HandleList(1),targetList(k).Market,targetList(k).Code);
%策略中每次取数据的长度
dlags=10;
lags=60;
barnum=traderGetCurrentBar(targetList(k).Market,targetList(k).Code);
%数据长度限制
if(barnum<lags)
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)<lags
continue;
end;
%-------------------------交易逻辑-------------------------------%
%----------入场信号--------------------%
len=30;
p=2.5;
p2=0;
percent=0.1;
percent2=0.5;
ma0=ma(close,len);
std0=stdev(close,len);
upline=ma0+p*std0;
dnline=ma0-p*std0;
upline2=ma0+p2*std0;
dnline2=ma0-p2*std0;
s(1).buycon=0;
s(1).sellshortcon=0;
if boll.switch==0;
if close(end)>upline(end)
boll.num=boll.num+1;
boll.value(boll.num)=close(end);
boll.switch=1;
elseif close(end)<dnline(end)
boll.num=boll.num+1;
boll.value(boll.num)=close(end);
boll.switch=-1;
end;
elseif boll.switch==1;
if close(end)>upline(end) && close(end)>boll.value(boll.num)
boll.value(boll.num)=close(end);
elseif close(end)<dnline(end)
boll.num=boll.num+1;
boll.value(boll.num)=close(end);
boll.switch=-1;
end;
elseif boll.switch==-1;
if close(end)<dnline(end) && close(end)<boll.value(boll.num)
boll.value(boll.num)=close(end);
elseif close(end)>upline(end)
boll.num=boll.num+1;
boll.value(boll.num)=close(end);
boll.switch=1;
end;
end;
if length(boll.value)>=2;
if record==1
con1=boll.value(end)<boll.value(end-1);
con2=close(end)>(boll.value(end-1)-boll.value(end))*percent+boll.value(end);
s(1).buycon=con1 && con2;
end;
if record==-1
con3=boll.value(end)>boll.value(end-1);
con4=close(end)<-(boll.value(end)-boll.value(end-1))*percent+boll.value(end);
s(1).sellshortcon=con3 && con4;
end;
end;
%------------被动出场操作------------------%
%找到未平仓的订单
remain=remainorder(entry,k);
%对未平仓的订单进行平仓判断及操作
for i=1:length(remain.entrybar);
% 进仓以来的bar个数
longstopcon=0;
shortstopcon=0;
barsinceentry=barnum-remain.entrybar(i);
backlen=50; % 回溯的长度(进仓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=3;
AF=0.1;
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;
stdlen=20;
initialstdparam=3;
minstdparam=1;
AF=0.25;
[longstopcon,shortstopcon,exitline]=exit5(backopen,backhigh,backlow,backclose,remain.entrydirection(i),backlen,stdlen,initialstdparam,minstdparam,AF);
elseif remain.entryexitway(i)==6;
longstopcon=0;
shortstopcon=0;
sellcon=0;
buytocovercon=0;
if remain.entrydirection(i)==1;
sellcon=high(end)>upline2(end);
longstopcon=close(end)<stopprice;
elseif remain.entrydirection(i)==-1
buytocovercon=low(end)<dnline2(end);
shortstopcon=close(end)>stopprice;
end;
longstopcon=longstopcon || sellcon;
shortstopcon=shortstopcon || buytocovercon;
elseif remain.entryexitway(i)==7;
ATRparam=1.5;
[longstopcon,shortstopcon,exitline]=exit7(backopen,backhigh,backlow,backclose,remain.entrydirection(i),backlen,len,stopprice,p2,ATRparam);
elseif remain.entryexitway(i)==8;
ATRparam=1.5;
[longstopcon,shortstopcon,exitline]=exit8(backopen,backhigh,backlow,backclose,remain.entrydirection(i),backlen,len,stopprice,p2,ATRparam);
% sellcon=0;
% buytocovercon=0;
% if remain.entrydirection(i)==1;
% sellcon=high(end)>upline(end);
% longstopcon=close(end)<stopprice.loss;
% elseif remain.entrydirection(i)==-1
% buytocovercon=low(end)<dnline(end);
% shortstopcon=close(end)>stopprice.loss;
% end;
% longstopcon=longstopcon || sellcon;
% shortstopcon=shortstopcon || buytocovercon;
end;
% 出场执行
if longstopcon
orderID1=traderDirectSell(HandleList(1),targetList(k).Market,targetList(k).Code,remain.entryunit(i),0,'market','totalbuy');
if orderID1==0;
continue;
end;
entry.record{k}(remain.num(i))=0;
end;
if shortstopcon
orderID1=traderDirectBuy(HandleList(1),targetList(k).Market,targetList(k).Code,remain.entryunit(i),0,'market','totalbuy');
if orderID1==0;
continue;
end;
entry.record{k}(remain.num(i))=0;
end;
end;
%---------------------------加仓--------------------------------%
%----------------策略1----------------------%
%再次找到未平仓的订单
remain=remainorder(entry,k);
% 找到策略i的marketposition
s=mptaking(s,remain);
%---------------------------入场操作--------------------------------%
%----------------策略1----------------------%
if s(1).buycon && s(1).marketposition==0
buyunit=default_unit;
orderID1=traderDirectBuy(HandleList(1),targetList(k).Market,targetList(k).Code,buyunit,0,'market','totalbuy');
if orderID1==0;
continue;
end;
[~]=entryalter(k,barnum,1,1,buyunit,default_exitway,1);
stopprice.loss=boll.value(end)-10;
stopprice.earn=(boll.value(end-1)-boll.value(end))*percent2+boll.value(end);
record=-1;
% 合约号,barnum,方向,开关,手数,出场,策略
end;
if s(1).sellshortcon && s(1).marketposition==0
sellshortunit=default_unit;
orderID1=traderDirectSell(HandleList(1),targetList(k).Market,targetList(k).Code,sellshortunit,0,'market','totalbuy');
if orderID1==0;
continue;
end;
[~]=entryalter(k,barnum,-1,1,sellshortunit,default_exitway,1);
stopprice.loss=boll.value(end)+10;
stopprice.earn=-(boll.value(end)-boll.value(end-1))*percent2+boll.value(end);
record=1;
% 合约号,barnum,方向,开关,手数,出场,策略
end;
%---------------------- 虚拟交易所最终执行买卖 ------------------------------%
end
end
更多免费策略源码下载请登录DigQuant社区-策略资源,http://www.digquant.com.cn/stra.php
布林通道+高低点策略源码下载:http://www.digquant.com.cn/stra.php?mod=model&pid=153 |
|