策略思路:
入场:价格突破50日高点,或者跌破50日低点
被动出场:多头情况下跌破20日低点
空头情况下突破20日高点
主动出场:每个加仓点单独出场,以每个加仓点下的N倍ATR出场,且每次调整对每个止损点调整N
回测曲线:
策略代码:
%加仓逻辑:加仓间隔逐渐扩大,每次扩大1倍ATR
%止损逻辑:止损间隔逐渐扩大,每次扩大1倍ATR
function Turtle3(len1,len2,len3,Freq,ShareNum,multi)
targetList = traderGetTargetList();
HandleList = traderGetHandleList();
global s;
lens=60;
n=length(targetList);
PsnLimit=4;
for j=1:n
[time,open,high,low,close,volume,turnover,openinterest] = traderGetKData(targetList(j).Market,targetList(j).Code,'day',1, 0-lens, 0,false,'FWard');
[mp,~,AvgPrice] = traderGetAccountPosition(HandleList,targetList(j).Market,targetList(j).Code);
%---------------------策略计算与基本逻辑---------------%
if length(close)<lens+1 || volume(end)==0
continue;
end
value1 = high(end-lens+1:end) - low(end-lens+1:end);% 当日最高价减去当日最低价
value2 = abs(high(end-lens+1:end)-close(end-lens:end-1));% 当日最高价减去前日收盘价的绝对值
value3 = abs(low(end-lens+1:end)-close(end-lens:end-1));% 当日最低价减去前日收盘价的绝对值
TRlist=max(value1,max(value2,value3));
ATR_len3=mean(TRlist(end-len3+1:end));
% 四条轨道
High_len1=max(high(end-len1:end-1));
Low_len1=min(low(end-len1:end-1));
High_len2=max(high(end-len2:end-1));
Low_len2=min(low(end-len2:end-1));
% ValidCash = traderGetAccountInfo(HandleList);
%
% s(j).Cap=ValidCash/n+mp*close(end);
% PsnLimit=floor(s(j).Cap*0.01*plus/(ATR_len3*s(j).Multiple));
con1=close(end)>High_len1;
con2=close(end)<Low_len1;
con3=close(end)>High_len2;
con4=close(end)<Low_len2;
%% 出场
if mp>0
if con4
OrderID=traderPositionTo(HandleList(1),targetList(j).Market,targetList(j).Code,0,0,'market','close');
if OrderID~=0
s(j).openprice=[];
s(j).stoploss=[];
s(j).addprice=0;
end
else
for i=1:length(s(j).stoploss)
if ~isempty(s(j).stoploss) && close(end)<s(j).stoploss(end)
OrderID=traderDirectSell(HandleList(1),targetList(j).Market,targetList(j).Code,ShareNum,0,'market','close');
if OrderID~=0
s(j).stoploss(end)=[];
s(j).openprice(end)=[];
end
end
end
end
end
if mp<0
if con3
OrderID=traderPositionTo(HandleList(1),targetList(j).Market,targetList(j).Code,0,0,'market','close');
if OrderID~=0
s(j).openprice=[];
s(j).stoploss=[];
s(j).addprice=0;
end
else
for i=1:length(s(j).stoploss)
if ~isempty(s(j).stoploss) && close(end)>s(j).stoploss(end)
OrderID=traderDirectBuy(HandleList(1),targetList(j).Market,targetList(j).Code,ShareNum,0,'market','close');
if OrderID~=0
s(j).stoploss(end)=[];
s(j).openprice(end)=[];
end
end
end
end
end
mp = traderGetAccountPosition(HandleList,targetList(j).Market,targetList(j).Code);
%% 进场
if mp==0
if con1
OrderID=traderDirectBuy(HandleList(1),targetList(j).Market,targetList(j).Code,ShareNum,0,'market','buy');
if OrderID~=0
s(j).openprice(1)=traderOrderFilledPrice(HandleList(1),OrderID);
s(j).addprice=s(j).openprice+multi*ATR_len3;
s(j).stoploss(1)=s(j).openprice(1)-0.5*multi*ATR_len3;
end
elseif con2
OrderID=traderDirectSell(HandleList(1),targetList(j).Market,targetList(j).Code,ShareNum,0,'market','buy');
if OrderID~=0
s(j).openprice(1)=traderOrderFilledPrice(HandleList(1),OrderID);
s(j).addprice=s(j).openprice-multi*ATR_len3;
s(j).stoploss(1)=s(j).openprice(1)+0.5*multi*ATR_len3;
end
end
end
%% 加仓
if mp>0 && mp< PsnLimit
if close(end)>=(s(j).addprice)
OrderID=traderDirectBuy(HandleList(1),targetList(j).Market,targetList(j).Code,ShareNum,0,'market','buy');
if OrderID~=0
s(j).openprice(end+1)=traderOrderFilledPrice(HandleList(1),OrderID);
N=length(s(j).openprice);
s(j).addprice=s(j).openprice(end)+N*multi*ATR_len3;
stoploss=s(j).openprice(end)-(N-1)*multi*ATR_len3;
s(j).stoploss(end+1)=stoploss;
end
end
end
if mp<0 && abs(mp)< PsnLimit
if close(end)<=(s(j).addprice)
OrderID=traderDirectSell(HandleList(1),targetList(j).Market,targetList(j).Code,ShareNum,0,'market','buy');
if OrderID~=0
s(j).openprice(end+1)=traderOrderFilledPrice(HandleList(1),OrderID);
N=length(s(j).openprice);
s(j).addprice=s(j).openprice(end)-N*multi*ATR_len3;
stoploss=s(j).openprice(end)+(N-1)*multi*ATR_len3;
s(j).stoploss(end+1)=stoploss;
end
end
end
end
更多免费策略源码下载请登录atrader社区-策略服务,http://www.atrader.com.cn/stra.php