function atdloss(freq)
targetList = traderGetTargetList();
HandleList = traderGetHandleList();
global record;
global record1;
global record2;
global record3;
for i=1:length(targetList)
marketposition=traderGetAccountPosition(HandleList(1),targetList(i).Market,targetList(i).Code);
barnum=traderGetCurrentBar(targetList(i).Market,targetList(i).Code);
len=30;
dlen=31;
[time,open,high,low,close,volume,turnover,openinterest] = traderGetKData(targetList(i).Market,targetList(i).Code,'min',freq, 0-len, 0,false,'FWard');
[Dtime,Dopen,Dhigh,Dlow,Dclose,Dvolume,Dturnover,Dopeninterest] = traderGetKData(targetList(i).Market,targetList(i).Code,'day',1, 0-dlen, 0,false,'FWard');
if length(close)
continue;
end
if close(end)>close(end-4)
ud=1;
elseif close(end)
ud=-1;
else
ud=0;
end
record{i}.ud=[record{i}.ud,ud];
if length(record{i}.ud)<2
continue
end
%ud为1,开始累加计算卖出启动
if record{i}.ud(end)==1
if record{i}.ud(end)==record{i}.ud(end-1)
if isempty(record2{i}.sud)
record2{i}.sud=[1 2];
record2{i}.sclose=close(end-1:end);
record2{i}.shigh=high(end-1:end);
record2{i}.slow=low(end-1:end);
else
record2{i}.sud=[record2{i}.sud record2{i}.sud(end)+1];
record2{i}.sclose=[record2{i}.sclose ;close(end)];
record2{i}.shigh=[record2{i}.sclose; high(end)];
record2{i}.slow=[record2{i}.sclose; low(end)];
end
else
record2{i}.sud=[];
record2{i}.sclose=[];
record2{i}.shigh=[];
record2{i}.slow=[];
end
end
%ud为-1,累加计算买入启动
if record{i}.ud(end)==-1
if record{i}.ud(end)==record{i}.ud(end-1)
if isempty(record2{i}.bud)
record2{i}.bud=[1 2];
record2{i}.bclose=close(end-1:end);
record2{i}.bhigh=high(end-1:end);
record2{i}.blow=low(end-1:end);
else
record2{i}.bud=[record2{i}.bud record2{i}.bud(end)+1];
record2{i}.bclose=[record2{i}.bclose;close(end)];
record2{i}.bhigh=[record2{i}.bclose;high(end)];
record2{i}.blow=[record2{i}.bclose ;low(end)];
end
else
record2{i}.bud=[];
record2{i}.bclose=[];
record2{i}.bhigh=[];
record2{i}.blow=[];
end
end
%卖出启动计算完毕,进入交叉条件阶段
%交叉之前进行转接,并将原来计算清零,继续计数
if ~isempty(record2{i}.bud)&&record2{i}.bud(end)==4
record3{i}.b=record3{i}.b+1;
record3{i}.bclose=record2{i}.bclose;
record3{i}.bhigh=record2{i}.bhigh;
record3{i}.lbow=record2{i}.blow;
record2{i}.bud=[];
record2{i}.bclose=[];
record2{i}.bhigh=[];
record2{i}.blow=[];
end
%交叉之前进行转接,并将原来计算清零,继续计数
if ~isempty(record2{i}.sud)&&record2{i}.sud(end)==4
record3{i}.s=record3{i}.s+1; %计算满足条件的次数
record3{i}.sclose=record2{i}.sclose;
record3{i}.shigh=record2{i}.shigh;
record3{i}.slow=record2{i}.slow;
record2{i}.sud=[];
record2{i}.sclose=[];
record2{i}.shigh=[];
record2{i}.slow=[];
end
%交叉条件计数
%买入交叉计数
if record3{i}.b==1
if close(end)>=record3{i}.bhigh(2)&&high(end)>record3{i}.bhigh(1)&&close(end)>record3{i}.bclose(1)
record3{i}.bcou=record3{i}.bcou+1;
end
elseif record3{i}.b>1&&record3{i}.bcou<4
record3{i}.bcou=0;
record3{i}.b=0;
end
%卖出交叉计数
if record3{i}.s==1
if close(end)<=record3{i}.slow(2)&&low(end)>record3{i}.slow(1)&&close(end)>record3{i}.sclose(1)
record3{i}.scou=record3{i}.scou+1;
end
elseif record3{i}.s>1&&record3{i}.scou<4
record3{i}.scou=0;
record3{i}.s=0;
end
%判断买入启动是否达成
if record3{i}.bcou==4
con1=1;
record3{i}.b=0;
record3{i}.bcou=0;
record3{i}.bclose=[];
record3{i}.bhigh=[];
record3{i}.blow=[];
else con1=0;
end
if record3{i}.scou==4
con2=1;
record3{i}.s=0;
record3{i}.scou=0;
record3{i}.sclose=[];
record3{i}.shigh=[];
record3{i}.slow=[];
else con2=0;
end
%------------------止损线
ATR=ATR(Dhigh,Dlow,Dclose,20);
%-------------------------------满仓上移--------------%
if record1{i}.m>3
if close(end)>record1{i}.entryp+2*ATR(end)&&(marketposition>0)
record1{i}.entryp= record1{i}.entryp+2*ATR(end);
elseif close(end)
record1{i}.entryp= record1{i}.entryp-2*ATR(end);
end
end
%--------------------------------止损出场---------------%
%做多平仓
if marketposition>0&&record1{i}.m~=0
if close(end)
order= traderPositionTo(HandleList(1),targetList(i).Market,targetList(i).Code,0,0,'market','sell');
if order~=0
record1{i}.m=0;
record1{i}.entryp=close(end);
record1{i}.entrybar=0;
end
end
end
if marketposition<0&&record1{i}.m~=0
if close(end)>record1{i}.entryp+0.5*ATR(end)
order= traderPositionTo(HandleList(1),targetList(i).Market,targetList(i).Code,0,0,'market','sell');
if order~=0
record1{i}.m=0;
record1{i}.entryp=close(end);
record1{i}.entrybar=0;
end
end
end
sharenum=5;
%---------------入场-------------%
if con1&&(record1{i}.m==0)&&(marketposition==0)
order=traderBuy(HandleList(1),targetList(i).Market,targetList(i).Code,sharenum,0,'market','buy'); %%%%做多
if order~=0
record1{i}.m= record1{i}.m+1;
record1{i}.entryp=close(end);
record1{i}.entrybar=barnum;
end
end
if con2&&(record1{i}.m==0)&&(marketposition==0)
order=traderSellShort(HandleList(1),targetList(i).Market,targetList(i).Code,sharenum,0,'market','buy'); %%%%做多
if order~=0
record1{i}.m= record1{i}.m+1;
record1{i}.entryp=close(end);
record1{i}.entrybar=barnum;
end
end
%----------------------------加仓----------------------%
if close(end)>record1{i}.entryp+2*ATR(end)&&(record1{i}.m<=3)&&(marketposition>0)
order=traderBuy(HandleList(1),targetList(i).Market,targetList(i).Code,sharenum,0,'market','buy'); %%%%做多
if order~=0
record1{i}.m= record1{i}.m+1;
record1{i}.entryp=close(end);
record1{i}.entrybar=barnum;
end
end
if close(end)
order=traderSellShort(HandleList(1),targetList(i).Market,targetList(i).Code,sharenum,0,'market','buy'); %%%%做多
if order~=0
record1{i}.m= record1{i}.m+1;
record1{i}.entryp=close(end);
record1{i}.entrybar=barnum;
end
end
end
end
function ATRValue=ATR(High,Low,Close,Length)
ATRValue=zeros(length(High),1);
TRValue=zeros(length(High),1);
TRValue(2:end)=max([High(2:end)-Low(2:end) abs(High(2:end)-Close(1:end-1)) abs(Low(2:end)-Close(1:end-1))],[],2);
ATRValue=MA(TRValue,Length);
end
function MAValue=MA(Price,Length)
MAValue=zeros(length(Price),1);
for i=Length:length(Price)
MAValue(i)=sum(Price(i-Length+1:i))/Length;
end
MAValue(1:Length-1)=Price(1:Length-1);
end