- 精华
- 0
- 在线时间
- 1983 小时
- UID
- 113966
- 积分
- 1033
- 帖子
- 642
- 阅读权限
- 60
- 注册时间
- 2012-12-9
- 最后登录
- 2021-2-18
- 精华
- 0
- UID
- 113966
- 积分
- 1033
- 帖子
- 642
- 主题
- 207
- 阅读权限
- 60
- 注册时间
- 2012-12-9
- 最后登录
- 2021-2-18
|
本帖最后由 wwr_5817 于 2012-12-23 18:48 编辑
按9楼nopain管理员的办法,新建一个用户函数NthConT,加fileappend,定位了问题,但不知如何解决,说明如下:
1.我的超级图表商品为IF1112的1分钟线,样本数300;
2.用户函数和公式应用,
(1)公式应用(MyMA):收过MA5画笑脸,收破画哭脸
01.Params
02. Numeric Length(5);
03.Vars
04. Bool boolvalueCrossOver(False);
05. Bool boolvalueCrossUnder(False);
06.Begin
07. boolvalueCrossOver=CrossOver(Close,AverageFC(Close,Length));
08. boolvalueCrossUnder=CrossUnder(Close,AverageFC(Close,Length));
09. If (boolvalueCrossOver)
10. { PlotBool("BoolvalueCrossOver",boolvalueCrossOver,H);
11. }
12. If (boolvalueCrossUnder)
13. { PlotBool("BoolvalueCrossUnder",!boolvalueCrossUnder,L);
14. }
15. PlotNumeric("MyMA",AverageFC(Close,Length));
16. Commentary("MyMA:"+Text(Length));
17. Commentary("当前Bar索引值"+Text(CurrentBar));
18.End
//------------------------------------------------------------------------
(2)用户函数(NthConT)
// 简称: NthConT
// 名称: 可测回溯第N个满足条件的Bar距当前的Bar数目
// 类别: 用户函数
// 类型: 用户函数
// 输出: 数值型
//------------------------------------------------------------------------
Params
Bool Con(false);
Numeric N(1);
Vars
NumericSeries PreConIndex;//回溯第i(i>1)个满足条件的Bar距当前的Bar数目
NumericSeries BarNums;//回溯第1个满足条件的Bar距当前的Bar数目
Numeric i(0);
Numeric ReBars(0);//回溯第N个满足条件的Bar距当前的Bar数目
Begin
FileAppend("C:\\Tpro.log","NthConT CurrentBar="+Text(CurrentBar)+",N="+Text(N)+",BarNums="+Text(BarNums)+",PreConIndex="+Text(PreConIndex));
If(Con)
{
BarNums = 0;//当前Bar满足条件,回溯第1个满足条件的Bar距当前的Bar数目置0
PreConIndex = BarNums[1] + 1;//当前Bar满足条件,回溯第2个满足条件的Bar距当前的Bar数目+1
FileAppend("C:\\Tpro.log","NthConT If N="+Text(N)+",BarNums="+Text(BarNums)+",PreConIndex="+Text(PreConIndex));
}Else
{
BarNums = BarNums + 1;//当前Bar不满足条件,回溯第1个满足条件的Bar距当前的Bar数目+1
PreConIndex = BarNums;//当前Bar不满足条件,回溯第1个满足条件的Bar距当前的Bar数目+1
FileAppend("C:\\Tpro.log","NthConT Else N="+Text(N)+",BarNums="+Text(BarNums)+",PreConIndex="+Text(PreConIndex));
}
ReBars = BarNums;//回溯第1个满足条件的Bar距当前的Bar数目
For i = 2 To N
{
ReBars = ReBars + PreConIndex[ReBars];//回溯第i(i>1)个满足条件的Bar距当前的Bar数目
FileAppend("C:\\Tpro.log","NthConT For N="+Text(N)+",i="+Text(i)+",ReBars="+Text(ReBars));
}
FileAppend("C:\\Tpro.log","NthConT end");
Return ReBars;
End
//------------------------------------------------------------------------
(3)用户函数(NthCrossUpMAHighOverBarPos)
// 简称: NthCrossUpMAHighOverBarPos
// 名称: 回溯第N个上缠绕MA顶值、收过MABar索引值
// 类别: 用户函数
// 类型: 用户函数
// 输出: 数值型
//------------------------------------------------------------------------
Params
Numeric N(1);
Numeric Length(5);
NumericRef CrossUpMAOverBarPos;//回溯第N个上缠绕MA之收过MABar索引值
Vars
Numeric ReBarsCrossOverMA(0);//回溯第N个收过MABar回溯索引值
Numeric ReBarsCrossOverMAplus(0);//回溯第(N+1)个收过MABar回溯索引值
Numeric ReBarsCrossUnderMA(0);//回溯第N个收破MABar回溯索引值
Numeric i;
Numeric CrossUpMAHigh(0);//回溯第N个上缠绕MA顶值
Begin
FileAppend("C:\\Tpro.log","Cross CurrentBar="+Text(CurrentBar));
ReBarsCrossOverMA=NthConT(CrossOver(C,AverageFC(C,Length)),N);//回溯第N个收过MABar回溯索引值
ReBarsCrossOverMAplus=NthConT(CrossOver(C,AverageFC(C,Length)),N+1);//回溯第(N+1)个收过MABar回溯索引值
ReBarsCrossUnderMA=NthConT(CrossUnder(C,AverageFC(C,Length)),N);//回溯第N个收破MABar回溯索引值
FileAppend("C:\\Tpro.log","Cross N="+Text(N)+",ReBarsCrossOverMA="+Text(ReBarsCrossOverMA)+",ReBarsCrossOverMAplus="+Text(ReBarsCrossOverMAplus)+",ReBarsCrossUnderMA="+Text(ReBarsCrossUnderMA));
If ((ReBarsCrossOverMA<ReBarsCrossUnderMA)&&((CurrentBar-ReBarsCrossOverMAplus)>(Length-1)))
{For i=ReBarsCrossOverMAplus DownTo ReBarsCrossUnderMA
{FileAppend("C:\\Tpro.log","Cross for step,i="+Text(i));
If (H > CrossUpMAHigh)
CrossUpMAHigh = H;//回溯第N个上缠绕MA顶值
}
CrossUpMAOverBarPos=CurrentBar-ReBarsCrossOverMAplus;//回溯第N个上缠绕MA之收过MABar索引值
FileAppend("C:\\Tpro.log","Cross for end,CrossUpMAHigh="+Text(CrossUpMAHigh)+",CrossUpMAOverBarPos="+Text(CrossUpMAOverBarPos));
}Else
{CrossUpMAHigh=0;//回溯第N个上缠绕MA顶值置0
CrossUpMAOverBarPos=0;//回溯第N个上缠绕MA之收过MABar索引值置0
}
FileAppend("C:\\Tpro.log","Cross end,CrossUpMAHigh="+Text(CrossUpMAHigh)+",CrossUpMAOverBarPos="+Text(CrossUpMAOverBarPos));
Return CrossUpMAHigh;
End
//------------------------------------------------------------------------
(4)公式应用(TproNthCrossUpMAHighOverBarPos)
// 简称: TproNthCrossUpMAHighOverBarPos
// 名称: 验证回溯递增第N个上缠绕MA顶值、收过MABar索引值
// 类别: 公式应用
// 类型: 用户应用
// 输出:
//------------------------------------------------------------------------
Params
Numeric N(2);
Numeric Length(5);
Vars
Numeric everCrossUpMAHigh;//回溯递增第N个上缠绕MA顶值
Numeric everCrossUpMAOverBarPos;//回溯递增第N个收过MABar索引值
Numeric i;
Numeric j;
Numeric MyHigh;//回溯第i个上缠绕MA顶值
Begin
FileAppend("C:\\Tpro.log","Tpro CurrentBar="+Text(CurrentBar)+",N="+Text(N));
i=2;
j=1;
everCrossUpMAHigh=NthCrossUpMAHighOverBarPos(1,Length,everCrossUpMAOverBarPos);//回溯第1个上缠绕MA顶值
While ((j<N)&&(everCrossUpMAOverBarPos>0))
{FileAppend("C:\\Tpro.log","TproWhile begin ,i="+Text(i)+",j="+Text(j)+",everCrossUpMAHigh="+Text(everCrossUpMAHigh)+",everCrossUpMAOverBarPos="+Text(everCrossUpMAOverBarPos));
MyHigh=NthCrossUpMAHighOverBarPos(i,Length,everCrossUpMAOverBarPos);//回溯第i个上缠绕MA顶值
i=i+1;
If (MyHigh>everCrossUpMAHigh)
{everCrossUpMAHigh=MyHigh;
j=j+1;
}
FileAppend("C:\\Tpro.log","TproWhile end j="+Text(j)+",i="+Text(i)+",everCrossUpMAHigh="+Text(everCrossUpMAHigh)+",everCrossUpMAOverBarPos="+Text(everCrossUpMAOverBarPos));
}
If (everCrossUpMAOverBarPos==0)
{everCrossUpMAHigh=0;
}
FileAppend("C:\\Tpro.log","Tpro回溯递增第"+Text(N)+"个上缠绕MA顶值"+Text(everCrossUpMAHigh));
FileAppend("C:\\Tpro.log","Tpro回溯递增第"+Text(N)+"个上缠绕MA收过MABar索引值"+Text(everCrossUpMAOverBarPos));
End
//------------------------------------------------------------------------
3.发现问题出在超级图表中索引值为26的收过MA5之Bar(截图见8楼附件,FileAppend文件无法上传,烦请插入公式应用后获得)
FileAppend文件中索引值为26的收过MA5之Bar,公式应用(TproNthCrossUpMAHighOverBarPos)首次执行While:
TproWhile begin ,i=2,j=1,everCrossUpMAHigh=2368,everCrossUpMAOverBarPos=14
Cross CurrentBar=26
NthConT CurrentBar=26,N=2,BarNums=0,PreConIndex=0
NthConT Else N=2,BarNums=1,PreConIndex=1
NthConT For N=2,i=2,ReBars=1
NthConT end
NthConT CurrentBar=26,N=3,BarNums=0,PreConIndex=0
NthConT Else N=3,BarNums=1,PreConIndex=1
NthConT For N=3,i=2,ReBars=1
NthConT For N=3,i=3,ReBars=1
NthConT end
NthConT CurrentBar=26,N=2,BarNums=0,PreConIndex=0
NthConT Else N=2,BarNums=1,PreConIndex=1
NthConT For N=2,i=2,ReBars=1
NthConT end
Cross N=2,ReBarsCrossOverMA=1,ReBarsCrossOverMAplus=1,ReBarsCrossUnderMA=1
Cross end,CrossUpMAHigh=0,CrossUpMAOverBarPos=0
Length=5,N=2,CurrentBar=26,在求回溯第2、3个收过MABar回溯索引值时,NthConT的条件在该Bar上满足,应执行NthConT的If却执行了Else,结果ReBarsCrossOverMA=1,即回溯第2个上缠绕MA5之收过MA5Bar回溯索引值为1(应为12);
出错,不得其解!
我已尽量简化、注释并定位了问题。按各位TB管理员的办法检测4天了,我仍然无能为力,恳请nopain管理员仔细看过本帖,一步到位给出解决办法!我实在担心,何时才能实现程序化交易?
多谢! |
|