- 精华
- 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:05:23
|显示全部楼层
均线通道突破+加仓
策略原理:
20均线为中轴,上下一个单位的标准差构成一个均线通道
多头入场:价格突破通道上轨,且成为近期高点
空头入场:价格突破通道下轨,且成为近期低点
加仓:价格每变动2倍ATR
出场:动态跟踪止损
策略源码:
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=11;
lags=150;
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 || length(Dclose)<dlags
continue;
end
% 虚拟交易所初始手数
totalunit=0;
%-------------------------交易逻辑-------------------------------%
%----------入场信号--------------------%
% len=80;
% p=0.3;
ma0=ma(close,5);
ma1=ma(close,20);
std1=stdev(close,20);
upline=ma1+std1;
dnline=ma1-std1;
% HC=max(Dclose(end-len:end-1));
% LC=min(Dclose(end-len:end-1));
% HH=max(Dhigh(end-len:end-1));
% LL=min(Dlow(end-len:end-1));
% range=max(HH-LC,HC-LL);
% upline=Dopen(end)+range*p1;
% dnline=Dopen(end)-range*p2;
% HH=max(high(end-len+1:end));
% LL=min(low(end-len+1:end));
% con1=close(end)<LL+p*(HH-LL);
% con2=close(end)>HH-p*(HH-LL);
% con3=ma0(end)>ma1(end) && ma0(end-1)<ma1(end-1);
% con4=ma0(end)<ma1(end) && ma0(end-1)>ma1(end-1);
% s(1).buycon=con1 && con3;
% s(1).sellshortcon=con2 && con4;
len1=20;
con1=ma0(end)>upline(end);
con2=ma0(end)<dnline(end);
con3=close(end)>max(close(end-len1+1:end-1));
con4=close(end)<min(close(end-len1+1:end-1));
s(1).buycon=con1 && con3;
s(1).sellshortcon=con2 && con4;
%----------主动出场信号----------------%
s(1).sellcon=0;
s(1).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;
%}
%---------------------------加仓--------------------------------%
%----------------策略1----------------------%
%再次找到未平仓的订单
remain=remainorder(entry,k);
% 找到策略i的marketposition
s=mptaking(s,remain);
% 找到最近的加仓点和加仓价格
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>2*ATR(end);
elseif lastdirection<0
s(1).addsellshortcon=lastentryprice-close(end)>2*ATR(end);
end;
%---------------加仓操作-------------------------%
if s(1).addbuycon && s(1).marketposition>=default_unit && s(1).marketposition<default_unit*2
addbuyunit=default_unit*0.5;
totalunit=totalunit+addbuyunit;
[~]=entryalter(k,barnum,1,1,addbuyunit,5,1);
% 合约号,barnum,方向,开关,手数,出场,策略
end;
if s(1).addsellshortcon && s(1).marketposition<=-default_unit && s(1).marketposition>-default_unit*2
addsellshortunit=default_unit*0.5;
totalunit=totalunit-addsellshortunit;
[~]=entryalter(k,barnum,-1,1,addsellshortunit,5,1);
% 合约号,barnum,方向,开关,手数,出场,策略
end;
end;
%---------------------------入场操作--------------------------------%
%----------------策略1----------------------%
if s(1).buycon && s(1).marketposition==0
buyunit=default_unit;
totalunit=totalunit+buyunit;
[~]=entryalter(k,barnum,1,1,buyunit,default_exitway,1);
% 合约号,barnum,方向,开关,手数,出场,策略
end;
if s(1).sellshortcon && s(1).marketposition==0
sellshortunit=default_unit;
totalunit=totalunit-sellshortunit;
[~]=entryalter(k,barnum,-1,1,sellshortunit,default_exitway,1);
% 合约号,barnum,方向,开关,手数,出场,策略
end;
%{
%----------------策略2----------------------%
if s(2).buycon && s(2).marketposition==0
buyunit=default_unit;
totalunit=totalunit+buyunit;
[~]=entryalter(k,barnum,1,1,buyunit,default_exitway,2);
% 合约号,barnum,方向,开关,手数,出场,策略
end;
if s(2).sellshortcon && s(2).marketposition==0
sellshortunit=default_unit;
totalunit=totalunit-sellshortunit;
[~]=entryalter(k,barnum,-1,1,sellshortunit,default_exitway,2);
% 合约号,barnum,方向,开关,手数,出场,策略
end;
%}
%---------------------- 虚拟交易所最终执行买卖 ------------------------------%
if totalunit>0
orderID1=traderDirectBuy(HandleList(1),targetList(k).Market,targetList(k).Code,abs(totalunit),0,'market','totalbuy');
elseif totalunit<0
orderID2=traderDirectSell(HandleList(1),targetList(k).Market,targetList(k).Code,abs(totalunit),0,'market','totalsell');
end;
end
end
|
|