一个指标出现了除以零的错误 - 页 6

 
Aleksey Vyazmikin:

从逻辑上讲,它根本不应该等于零--不清楚为什么会出现这种情况!

你的d1给出的数字很小,我通过将价格转换为int来避免这种问题,例如int bid=int((tick_array[0].bid+_Point/10)/_Point);当然,有时它给出的5位数字是0.00000999999,如果以双数计算的话。
 
Aleksey Vyazmikin:

按照逻辑,它根本不应该是零--我不明白它为什么会这样做!?

在Si-9.18的调试器中运行。 由于某种原因,速率中的时间是2016年。虽然i的值是2189。因此,它从图表的开头 开始计算,那里没有流动资金。启动和停止之间的初始时间为1小时。但对于那一小时,只有一个时间值。它用开始和停止两个变量找到它。因此,开始=停止。当然,如果你减去它们,你会得到零。我还没有想出其他的办法。

 
ovak77:
你的d1有很小的数字,我避免了这种问题,将价格转换为int,即例如int bid=int((tick_array[0].bid+_Point/10)/_Point);当然,如果用双数计算,有时会返回0。

我们不要讨论d1--如果它是必要的,那么它就是必要的,一切都在那里被正确计算。问题是,为什么我们的start_time和stop_time,以及start_index和stop_index的值都一样?

 
Aleksey Vyazmikin:

我们不要讨论d1--如果它是必要的,那么它就是必要的,一切都在那里被正确计算。问题是,为什么我们得到的start_time和stop_time的值与start_index和stop_index的值相同?

这取决于你,试着用0.0000099999除以2,例如
 

再次挂断后,终端停止工作....我怎样才能在不重新安装的情况下复活它?

结果发现在内存中被挂起--强行杀了这个进程--它开始了。

 
Aleksey Vyazmikin:

时间怎么可能变得相等呢?半年来,一切都在正常工作......。

void CreateFigure(int i,const datetime &Time[],const double &Open[],const double &High[],const double &Low[],const double &Close[],MqlRates &rates[])
  {                                                              //i = 2189 
   datetime start_time=rates[i].time;                            //start_time=rates[i].time = D'2016.10.06 12:00:00'
   datetime stop_time=(start_time+PeriodSeconds(TimeFrames));    //stop_time = D'2016.10.06 13:00:00'
//---                                                            //Time[38572] = D'2016.10.05 19:23:00'
   int start_index,stop_index,limit;                             //Time[38571] = D'2016.10.06 12:35:00'
   datetime vertical_line_time;                                  //Time[38570] = D'2016.10.06 19:05:00'
//---
   start_index=ArrayBsearch(Time,start_time);                    //start_index = 38571
   if(Time[start_index]<start_time) start_index=(start_index>0?start_index-1:start_index);
   start_time=Time[start_index];                                 //start_time = D'2016.10.06 12:35:00'
   if(i>0)
     {
      stop_index=ArrayBsearch(Time,stop_time);                   //stop_index = 38571
      if(Time[stop_index]>stop_time) stop_index++;
      stop_time=Time[stop_index];                                //stop_time  = D'2016.10.06 12:35:00'
      limit=start_index-stop_index+1;
      vertical_line_time=Time[start_index-(limit>>1)];
你首先有limit=start_index-stop_index+1,即limit==1,然后在除以2的地方,limit=(int)(stop_time-start_time)/PeriodSeconds(_Period)一个是不加。零除以周期。
 
Sergey Savinkin:

在Si-9.18的调试器中运行。 由于某种原因,速率中的时间是2016年。虽然i的值是2189。因此,它从图表的开头 开始计算,那里没有流动资金。启动和停止之间的初始时间为1小时。但对于那一小时,只有一个时间值。它用开始和停止两个变量找到它。因此,开始=停止。当然,如果你减去它们,你会得到零。我还没有想出其他的办法。

把BarsUsed=100放在传入参数中。

 
Aleksey Vyazmikin:

把BarsUsed=100放在传入参数中。

是的,这样就不会发生错误。但是,如果你进入一些非流动性的工具或非流动性的时间--例如晚间时段,那么你可以很容易地在一小时内得到一个低点。因此,极限=0对你来说是有保证的!而如果报价是2 - 那么limit/2在四舍五入后仍然会给出0。

 
Sergey Savinkin:

是的,这不是一个错误。但如果你进入一些非流动性的工具或非流动性的时间--例如,在晚间时段,你可能很容易在一个小时内得到一个低点。因此,极限=0对你来说是有保证的!而如果引号是2--那么极限/2在四舍五入后仍将是0。

也许,我会考虑一下,谢谢你。但全球问题是另一回事....问题是,它并不稳定。

 
ovak77:
这取决于你,试着用0.0000099999除以2,例如

打印的d1--就我的目的而言,它是

2018.07.04 19:38:06.404 IndDrafter_Test (Si-9.18,M1)    d1=35.71428571428572
2018.07.04 19:38:06.404 IndDrafter_Test (Si-9.18,M1)    d1=32.78688524590164
2018.07.04 19:38:06.404 IndDrafter_Test (Si-9.18,M1)    d1=32.78688524590164
2018.07.04 19:38:06.404 IndDrafter_Test (Si-9.18,M1)    d1=32.78688524590164
2018.07.04 19:38:06.404 IndDrafter_Test (Si-9.18,M1)    d1=43.47826086956522

总之,这不是重点,谢谢。