量化交易策略matlab交易方案,【每日一策】Matlab量化交易策略之 GFTD+止损

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值