策略说明
用ATR轨道进仓
利用网格加仓法进行加仓:
每个入场点设置中线,止损线和止盈调整线
当到达止盈调整线,加仓1份资金,并将止损线抬高到原中线
当到达止损线,平仓
策略代码:
function Strategy1(freq)%
targetList = traderGetTargetList();
%获取目标资产信息
HandleList = traderGetHandleList();
%获取账户句柄
global record;
for k=1:length(targetList);
%--------------------仓位、K线、当前bar的提取-----------------------------%
%获取当前仓位
[marketposition,~,~]=traderGetAccountPosition(HandleList(1),targetList(k).Market,targetList(k).Code);
%策略中每次取数据的长度
lags=100;
dlags=11;
barnum=traderGetCurrentBar(targetList(k).Market,targetList(k).Code);
%数据长度限制
if(barnum<lags)
continue;
end
%获取K线数据
[time,open,high,low,close,volume,~,~] = traderGetKData(targetList(k).Market,targetList(k).Code,'min',freq, 0-lags, 0,false,'FWard');
[Dtime,Dopen,Dhigh,Dlow,Dclose,Dvolume,~,~] = traderGetKData(targetList(k).Market,targetList(k).Code,'day',1, 0-dlags, 0,false,'FWard');
if length(close)<lags || length(Dclose)<dlags
continue;
end;
%--------------------- 14:50 日内平仓 ---------------------------------%
Y=datevec(time(end));
X=Y(4)*100+Y(5);
if X==1455
traderPositionTo(HandleList(1),targetList(k).Market,targetList(k).Code,0,0,'market','sell');
record{k}.isopen(:)=0;
continue;
end;
if X>1455 && X<1600
continue;
end;
%-------------------------交易逻辑-------------------------------%
TRvalue=TR(Dclose,Dhigh,Dlow);
ATR=ma(TRvalue,10);
stoplossratio=0.2*ATR(end-1)/Dopen(end); % 止损触发比例
stopearnratio=stoplossratio*1.1; % 止盈触发比例
% 未平仓的订单提取
remain_num=find(record{k}.isopen==1);
remain.isopen=record{k}.isopen(remain_num);
remain.isearn=record{k}.isearn(remain_num);
remain.pivotprice=record{k}.pivotprice(remain_num);
remain.entrybar=record{k}.entrybar(remain_num);
remain.unit=record{k}.unit(remain_num);
remain.direction=record{k}.direction(remain_num);
% ------------------- 计算购买手数 ----------------------------- %
% 提取剩余可用资金
[ValidCash,MarketCap,~,~,~] = traderGetAccountInfo(HandleList(1));
[~,~,Multiple,~,~,~,~,LongMargin,ShortMargin] = traderGetFutureInfo(targetList(k).Market,targetList(k).Code);
% 计算当前还有几分资金没使用
num=0; % isopen==1 表示未平仓的资金
for i=1:length(record)
aa=find(record{i}.isopen==1);
num=num+length(aa);
end;
n=5; % 分成5份资金
remain_share=n*length(targetList)-num;
% con1:当n份资金都使用完了,con1=0,不继续开仓,因为没有足够的资金了
con1=0;
if remain_share~=0;
con1=1;
% openunit=fix(MarketCap/close(end)/Multiple/length(targetList)/n); % 一份资金可以购买的手数(没有带杠杆买)
openunit=fix(ValidCash/close(end)/Multiple/length(targetList)/remain_share/LongMargin); % 一份资金可以购买的手数(带杠杆买)
end;
% 判断当前是多头持仓还是空头持仓
posdir=0;
if ~isempty(remain.direction)
if remain.direction(end)>0
posdir=1;
elseif remain.direction(end)<0
posdir=-1;
end;
end;
%---------------------------------对未平仓的订单进行平仓或者调整止损线--------------------------------------------%
for i=1:length(remain_num)
index=remain_num(i);
if remain.direction(i)==1
if close(end)<remain.pivotprice(i)-stoplossratio*remain.pivotprice(i) % 触发止损线
orderID3=traderDirectSell(HandleList(1),targetList(k).Market,targetList(k).Code,remain.unit(i),0,'market','sell');
if orderID3==0
continue;
end;
record{k}.isopen(index)=0;
elseif close(end)>remain.pivotprice(i)+stopearnratio*remain.pivotprice(i) % 触发止盈线
record{k}.pivotprice(index)=close(end);
record{k}.isearn(index)=2;
end;
elseif remain.direction(i)==-1
if close(end)>remain.pivotprice(i)+stoplossratio*remain.pivotprice(i) % 触发止损线
orderID4=traderDirectBuy(HandleList(1),targetList(k).Market,targetList(k).Code,remain.unit(i),0,'market','buy');
if orderID4==0
continue;
end;
record{k}.isopen(index)=0;
elseif close(end)<remain.pivotprice(i)-stopearnratio*remain.pivotprice(i) % 触发止盈线
record{k}.pivotprice(index)=close(end);
record{k}.isearn(index)=2;
end;
end;
end;
%-----------------------------入场条件--------------------------------------------%
con2=isempty(find(remain.isearn==1,1)); % 所有头寸都是盈利的才考虑进新的头寸
upline=Dopen(end)+0.5*ATR(end-1);
dnline=Dopen(end)-0.5*ATR(end-1);
bcon=close(end)>upline;
scon=close(end)<dnline;
buycon=con1 && con2 && bcon && posdir>=0; % 突破ATR轨道做多
sellshortcon=con1 && con2 && scon && posdir<=0; % 突破ATR轨道做空
%---------------------------入场操作--------------------------------%
if buycon
orderID1=traderDirectBuy(HandleList(1),targetList(k).Market,targetList(k).Code,openunit,0,'market','buy');
if orderID1==0
continue;
end;
record{k}.pivotprice=[record{k}.pivotprice,close(end)];
record{k}.isearn=[record{k}.isearn,1];
record{k}.isopen=[record{k}.isopen,1];
record{k}.unit=[record{k}.unit,openunit];
record{k}.entrybar=[record{k}.entrybar,barnum];
record{k}.direction=[record{k}.direction,1];
end;
if sellshortcon
orderID2=traderDirectSell(HandleList(1),targetList(k).Market,targetList(k).Code,openunit,0,'market','sell');
if orderID2==0
continue;
end;
record{k}.pivotprice=[record{k}.pivotprice,close(end)];
record{k}.isearn=[record{k}.isearn,1];
record{k}.isopen=[record{k}.isopen,1];
record{k}.unit=[record{k}.unit,openunit];
record{k}.entrybar=[record{k}.entrybar,barnum];
record{k}.direction=[record{k}.direction,-1];
end;
end
end
function TRvalue=TR(close,high,low)
TRvalue=zeros(length(close),1);
TRvalue(1)=high(1)-low(1);
for i=2:length(close)
TRvalue(i)=max([high(i)-low(i),high(i)-close(i-1),close(i-1)-low(i)]);
end;
end
function aveline=ma(price,len)
aveline=zeros(length(price),1);
for i=1:len-1
aveline(i)=price(i);
end;
for i=len:length(price)
aveline(i)=mean(price(i-len+1:i));
end;
end
策略代码请登录atrader社区-策略服务 下载: www.atrader.com.cn/stra.php?mod=model&pid=63
回测曲线:


雷达卡


京公网安备 11010802022788号







