今天的开盘价作为标杆,收盘价上穿做多,下穿做空,并加上由20日ATR控制的止损和加仓。
回测曲线(由Auto-Trader提供回测报告):
策略源码:
- function kptopLossAdd(freq) %
- %freq为输入频率
- %len为计算使用的长度
- %band为波动乘数
- %shareNum为操作的手数
- %%%日内开盘突破策略,改为日内策略
- targetList = traderGetTargetList();
- HandleList = traderGetHandleList();
- global p;
- global record;
- for i=1:length(targetList)
- barnum=traderGetCurrentBar(targetList(i).Market,targetList(i).Code);
- marketposition=traderGetAccountPosition(HandleList(1),targetList(i).Market,targetList(i).Code);
-
- len=20;
- dlen=30;
- [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)<len+1||length(Dclose)<dlen+1
- continue;
- end
- %----------------------------日内策略---------------%
- gettime=datevec(time);
- timenum=gettime(end,4)*100+gettime(end,5);
- if timenum>0900&&timenum<1458||timenum<2100&&timenum>2400||timenum>0000&&timenum<0158
- cont=1;
- else cont=0;
- end
-
- % %每天的第一个bar将state全局变量复原,state的作用是保证每天只买卖一次
- %每天第一个bar,阳线做多,阴线做空
- num=find(time>Dtime(end-1));
- p{i}.scon2=0;
- p{i}.bcon1=0;
- if length(num)==1;
- if close(end)>open(end)
- p{i}.price=open(end);
- p{i}.bcon1=1;
- else
- p{i}.scon2=1;
- p{i}.price=open(end);
- end
- end
- if p{i}.price==0
- continue
- end
- con1=p{i}.bcon1&&close(end)> p{i}.price&&cont;%做多
- con2=p{i}.scon2&&close(end)< p{i}.price&&cont;%做空
- con10=cont==0||close(end)< p{i}.price;%日内平仓,或者收盘价低于今天开盘价,平多
- con20=cont==0||close(end)> p{i}.price;%日内平仓,或收盘价高于今天开盘价,平空
- ATR=ATR(Dhigh,Dlow,Dclose,20);
-
- %-------------------------平仓止损--------------------%
- %做多平仓
- if marketposition>0&&record{i}.m~=0
- if close(end)<record{i}.entryp-ATR(end)||cont==0||con10
- order= traderPositionTo(HandleList(1),targetList(i).Market,targetList(i).Code,0,0,'market','sell');
- if order~=0
- record{i}.m=0;
- record{i}.entryp=close(end);
- end
- end
- end
-
- if marketposition<0&&record{i}.m~=0
- if close(end)>record{i}.entryp+ATR(end)||cont==0||con20
- order= traderPositionTo(HandleList(1),targetList(i).Market,targetList(i).Code,0,0,'market','sell');
- if order~=0
- record{i}.m=0;
- record{i}.entryp=close(end);
-
- end
- end
- end
- [~,~,Multiple,MinMove,~,~,~,LongMargin,~] = traderGetFutureInfo(targetList(i).Market,targetList(i).Code);
- [cash,~,~,~,~] = traderGetAccountInfo(HandleList(1));
- sharenum=cash/close(end)/LongMargin/7/Multiple;
- %---------------入场-------------%
- if con1&&(record{i}.m==0)&&(marketposition==0)
- order=traderBuy(HandleList(1),targetList(i).Market,targetList(i).Code,sharenum,0,'market','buy'); %%%%做多
- if order~=0
- record{i}.m= record{i}.m+1;
- record{i}.entryp=close(end);
-
- end
- end
-
- if con2&&(record{i}.m==0)&&(marketposition==0)
- order=traderSellShort(HandleList(1),targetList(i).Market,targetList(i).Code,sharenum,0,'market','buy'); %%%%做多
- if order~=0
- record{i}.m= record{i}.m+1;
- record{i}.entryp=close(end);
-
- end
- end
-
- %----------------------------加仓---------------------------------%
-
- if close(end)>record{i}.entryp+2*ATR(end)&&(record{i}.m<=4)&&(marketposition>0)
- order=traderBuy(HandleList(1),targetList(i).Market,targetList(i).Code,sharenum,0,'market','buy'); %%%%做多
- if order~=0
- record{i}.m= record{i}.m+1;
- record{i}.entryp=close(end);
-
- end
- end
-
- if close(end)<record{i}.entryp-2*ATR(end)&&(record{i}.m<=4)&&(marketposition<0)
- order=traderSellShort(HandleList(1),targetList(i).Market,targetList(i).Code,sharenum,0,'market','buy'); %%%%做多
- if order~=0
- record{i}.m= record{i}.m+1;
- record{i}.entryp=close(end);
-
- 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
更多免费策略源码下载请登录DigQuant社区-策略资源下载~


雷达卡


楼主的每个贴我都会看~~


京公网安备 11010802022788号







