策略名称:海龟改进
策略思路:
入场:价格突破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
|