sdfg123 发表于 2017-3-27 16:40:07

GFTD+止损 附源码

策略思路:
GFTD模型,趋势跟踪策略,利用K线收盘价的涨跌进行判断,真正交易前,需经历交易启动,到交易信号发出的过程,并且买入和卖出分别当做独立的系统进行计算。当买入计数达到4,做多,当卖出计数达到4,做空。并利用ATR控制止损和加仓。


策略源码:

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;
    = traderGetKData(targetList(i).Market,targetList(i).Code,'min',freq, 0-len, 0,false,'FWard');
    = traderGetKData(targetList(i).Market,targetList(i).Code,'day',1, 0-dlen, 0,false,'FWard');
    if length(close)<len+1||length(Dclose)<dlen+1
        continue;
    end
   
    if close(end)>close(end-4)
        ud=1;
    elseif close(end)<close(end-4)
        ud=-1;
    else
        ud=0;
    end
    record{i}.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=;
                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}.sclose=;
                record2{i}.shigh=;
                record2{i}.slow=;
            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=;
                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}.bclose=;
                record2{i}.bhigh=;
                record2{i}.blow=;
            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-2*ATR(end)&&(marketposition<0)
            record1{i}.entryp= record1{i}.entryp-2*ATR(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
   
    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)<record1{i}.entryp-2*ATR(end)&&(record1{i}.m<=3)&&(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
   
end
end
function ATRValue=ATR(High,Low,Close,Length)
ATRValue=zeros(length(High),1);
TRValue=zeros(length(High),1);
TRValue(2:end)=max(,[],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


更多免费策略源码下载请登录DigQuant社区-策略资源下载~  http://www.digquant.com.cn/stra.php

GFTD策略源码下载:http://www.digquant.com.cn/stra.php?mod=model&pid=156

页: [1]
查看完整版本: GFTD+止损 附源码