失败指标算法
20100105
前几天整理期货交易记录,发现一个问题,”失败指标”计算太麻烦了。这个指标我去年做了6个月,都是每个月月底的时候,花半天来算这个指标,还有月度总结和计划之类的,虽然用了excel+vba,但是数据计算量大,每个数据源还要手动导入导出,最后打印出来,再看图逐一分析。8个品种我都觉得麻烦了,要是10年再增加品种或者是用它来作为其他市场的机会捕捉,这样的技术条件实在费时费力,做不了。
去年底由于研究自动交易,对amibroker里的编程比较熟悉了,打算把这个excel里的26列公式编的指标改编成AB公式,AB计算速度比excel快多了。这样一来,就有望解决下面三个问题:1节省精力 2让指标动态更新 3市场扫描
这里的思路就是找一个趋势跟踪系统,写好买卖条件,然后算出现的连续亏损次数,时间,幅度,同是统计历史上这三个值的范围,然后综合起来成为一个指标。指标高就是低风险开始趋势跟踪的机会,大致是这样的,代码放下面了,就是excel里的改编(没有加入market scan 和 alter)。里面XXX是买入条件,YYY是卖出条件,根据自己的策略写一下(我这里是20日单线跟踪),就能得到该系统下的“失败指标”。另外,dtsyl是动态收益率,dmc是动态回撤,某系统的连续亏损次数、幅度、时间也都可以加个plot函数自行画出参照。这里收益率和回撤是动态的,但是失败指标还是离散的数据(因为要一次交易完成之后,才能判断是不是连续失败),要考虑动态的话,就是把目前持仓的信息也算进去。(暂告一段落,过一阵再继续完善。)
_SECTION_BEGIN("Price");
mma=IIf(IsEmpty(MA(C,20)),0,MA(C,20));
xxx=Cross(C,mma) AND Ref(C,-1)!=Ref(mma,-1);
yyy=Cross(mma,C) AND Ref(C,-1)!=Ref(mma,-1);
aa=BarsSince( xxx )+1;
bb=BarsSince( yyy)+1;
aaa=IIf(IsEmpty(aa),0,aa);
bbb=IIf(IsEmpty(bb),0,bb);
c2=IIf(aaa>bbb,-bbb,aaa);
c1=IIf(IsEmpty(c2),0,IIf(C2>0,1,-1));
C5=IIf(xxx+yyy,1,0);
C6=BarsSince( C5 );
C7=Ref(C,-C6);
dbsyl1=IIf(C1==-1&&Ref(C1,-1)==1,C7/Ref(C7,-1)-1,0);
dbsyl2=IIf(C1==1&&Ref(C1,-1)==-1,Ref(C7,-1)/C7-1,0);
dbsyl=dbsyl1+dbsyl2;
syl[0]=1;
Lxkscs[0]=0;
Lxkssj1[0]=0;
Lxkssj2[0]=0;
Lxkssj3[0]=0;
Lxkssj4[0]=0;
Lxkssj5[0]=0;
Lxksfd1[0]=1;
Lxksfd3[0]=0;
CLxkscs1[0]=0;
CLxkscs2[0]=0;
CLxkscs3[0]=0;
C9=IIf(dbsyl>0,2,IIf((c5==1 AND dbsyl==0) OR dbsyl<0,1,0));
for(i=1;i<=EndValue(BarIndex());i++)
{
syl=syl[i-1]*(dbsyl+1);
if(C9==1)Lxkscs=Lxkscs[i-1]+C9;
if(C9==2)Lxkscs=0;
if(C9==0)Lxkscs=Lxkscs[i-1];
//——–Lxkscs shi lian xu kui sun ci shu
if((Lxkscs==1 AND Lxkscs[i-1]==0))Lxkssj1=i;
else if(Lxkscs>0)Lxkssj1=Lxkssj1[i-1];
if(Lxkssj1>0 AND Lxkssj1[i-1]>0)Lxkssj2=Lxkssj2[i-1]+1;
if(Lxkscs==Lxkscs[i-1])Lxkssj3=Lxkssj3[i-1]+1;
if(Lxkssj1[1]>0)Lxkssj4=Lxkssj2-Lxkssj3;
if(Lxkssj4>0)Lxkssj5=Lxkssj4;
//————Lxkssj5 shi lian xu kui sun tian shu
if(dbsyl==0)Lxksfd1=Lxksfd1[i-1];
if(dbsyl<0)Lxksfd1=Lxksfd1[i-1]*(1+dbsyl);
if(dbsyl>0)Lxksfd1=1;
Lxksfd2=Lxksfd1-1;
if(Lxksfd2[i-1]!=0 AND Lxksfd2==0 )Lxksfd3=Lxksfd2[i-1];
//————Lxksfd3 shi mei ci de lian xu kui sun fudu tong ji
if(Lxksfd3<0)CLxkscs1=CLxkscs1[i-1]+1;
if(Lxksfd3==0)CLxkscs1=CLxkscs1[i-1];
if(Lxksfd3>0)CLxkscs1=CLxkscs1[i-1];
//————CLxkscs1 shi you duoshao ci lian xu kuisun
if(Lxksfd3<0)CLxkscs2=Lxkscs[i-1];
if(Lxksfd3==0)CLxkscs2=0;
if(Lxksfd3>0)CLxkscs2=0;
//————CLxkscs2 shi mei ci de lian xu kui sun cishu tongji
if(Lxksfd3<0)CLxkscs3=Lxkssj5[i-1]-1;
if(Lxksfd3==0)CLxkscs3=0;
if(Lxksfd3>0)CLxkscs3=0;
//————CLxkscs3 shi mei ci de lian xu kui sun tian shu tongji
}
pjlxkscs1=Cum(CLxkscs2);
pjlxkssj1=Cum(CLxkscs3);
pjlxksfd1=Cum(Lxksfd3);
pjlxkscs2=LastValue(pjlxkscs1)/LastValue(CLxkscs1);
pjlxkssj2=LastValue(pjlxkssj1)/LastValue(CLxkscs1);
pjlxksfd2=LastValue(pjlxksfd1)/LastValue(CLxkscs1);
pjlxkscs3=(CLxkscs2/pjlxkscs2-1)*0.2;
pjlxkssj3=(CLxkscs3/pjlxkssj2-1)*0.3;
pjlxksfd3=(Lxksfd3/pjlxksfd2-1)*0.5;
sbzb1=pjlxkscs3+pjlxkssj3+pjlxksfd3;
sbzb2=IIf(sbzb1>0,sbzb1,0);
dtsyl=IIf(C1==1,C/C7*syl,C7/C*syl);
DMC=(Highest(dtsyl)-dtsyl)/Highest(dtsyl)*100;
for( i = 0; i < BarCount; i++ )
if( CLxkscs3 AND sbzb2>0.05 ) PlotText( "" +int(sbzb2*100000/10000)/10, i, sbzb2+0.2, colorGreen );
Plot(int(LastValue(Highest(sbzb2))+1.5) ,"",colorBlack,styleLine);
Plot(-1,"",colorBlack,styleLine);
Buy=Sell=0;
zxg=Ref(sbzb2,-BarsSince(sbzb2))>1;
AddToComposite( sbzb2, "~sbzb", "sbzb" );
AddToComposite( DMC, "~DMC", "DMC" );
AddToComposite( dtsyl, "~dtsyl", "dtsyl" );
图是什么品种的数据我也忘记了,反正是国内哪个期货的文华连续指数。
图一价格+均线,图二动态回撤,图三动态收益率(可能该用对数图),图4失败指标(还只是离散的数据点)