老师你好,我写代码的时候,已经处理了这个除数为0的情况,但是输出的值,还是无效值。经过研究,发现是MP = MP[1];这个的问题,如果改成MP = high;输出的就是正常的。请老师指教一下,这是什么原因,有没有好的解决方法,谢谢
Params
//此处添加参数
Vars
//此处添加变量
Series<Numeric> MA;
Series<Numeric> MK;
Series<Numeric> LX;
Series<Numeric> Z;
Series<Numeric> MP;
Series<Numeric> HX;
Series<Numeric> XA_4;
Series<Numeric> XA_5;
Events
//此处实现事件函数
//初始化事件函数,策略运行期间,首先运行且只有一次
OnInit()
{
}
//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
MP = Highest(HIGH,399)-Lowest(LOW,399);
If(MP == 0)
{
MP = MP[1];
}
XA_4 = (CLOSE-Lowest(LOW,399))/MP*100;
XA_5 = SMA(XA_4,13,8);
HX = SMA(XA_5,13,8);
PlotNumeric(HX,HX,0,Red);
}
那有什么好办法处理吗
我把SMA公式用具体式子表示出来运行后,是因为第一个bar上mp = 0出现的问题,第一个bar上有0作为除数后,sma计算迭代后后面就全出错了
有什么好办法处理吗
我想到办法解决了,感谢老兄花费那么多心思
主要你还是没有理解回溯的原理,MP = Highest(HIGH,399)-Lowest(LOW,399);,这个式子里MP等于前399bar里的最大值-最低值,要是你选取的历史数据小于你回溯的bar也就是399,会无法运行这个式子,导致mp=0,只有从头开始数第400个bar即以后的bar才能计算出结果。从式子本身来看,主要是两个结果,一种是当历史bar<=399时,mp取默认值=0,另一种是当历史bar>399时,mp = 最大值-最低值>0
兄弟,你说的这些其实我都懂,不过不是问题的关键。不知道你有没有遇到过,有些k线,他什么数据都没有,你去看看小周期的k线就懂了。这个mp==0那里,主要是为了处理这个问题的。这段代码,主要是为了处理一些小周期的无效数据的,就是k线是一条横线那种
If(MA == 0)
{
MA = MA[1];
}
运行了下你的代码,好像问题还是出现在XA_5和HX里
是那个mp的问题,mp导致的计算不出来,你按上面我说的改成high就可以了
你mp回溯了399个bar,前399个bar里mp都等于0,MP = MP[1] = 0,简单点,你改成MP > 0
改成mp>0,还怎么处理mp等于0的情况?mp就不能是负数吗?
你mp计算的是399bar里的最大值-最低值,只要有数据肯定会>0。
或者你选择mp<>0,直接不等于0,更保险。
兄弟,这个是处理mp这个除数为0的情况的。用mp不等于0,还怎么处理这个问题啊