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

 

代码中的限制,如果1/2=0.5,那么显然现在的四舍五入给出的是0而不是1?

为了测试这个假设,我改变了代码

         double d1=(delta_price_high-center_line_point)/((double)limit/2);
         double d2=(center_line_point-delta_price_low)/((double)limit/2);
 
Aleksey Vyazmikin:

完全是垃圾--又出现了除以0的错误

来自ME的代码作为一张图片--也许我是瞎子,但我不明白这是怎么回事

错误仍然出现在同一行。

文件是一样的,由于增加了打印的代码,错误行发生了偏移。

你应该使用一个样式器--你会立即看到你的问题字符串不在检查区域内 if(limit==0)

 
Vladimir Karputov:

你应该使用一个样式器--你会立即看到你的问题字符串不在检查区域内 if(limit==0)

所以它不需要进入,为什么?

 

这个代码。

         int a=1;
         double test=1/(a/2);

挂上终端。

 
Aleksey Vyazmikin:

代码中的限制,如果1/2=0.5,那么显然现在的四舍五入给出的是0而不是1?

为了测试这个假设,我改变了代码

代码。

//+------------------------------------------------------------------+
//|                                           writeSpicifiedType.mq5 |
//|                                                              hoz |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""
#property version   "1.00"
//---
double high=-1.0;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   for(int limit=0;limit<4;limit++)
     {
      Print("limit (",limit,")/2 ",limit/2);
     }
  }
//+------------------------------------------------------------------+


结果。

Test_en (EURUSD,M30)    limit (0)/2 0
Test_en (EURUSD,M30)    limit (1)/2 0
Test_en (EURUSD,M30)    limit (2)/2 1
Test_en (EURUSD,M30)    limit (3)/2 1
 
Vladimir Karputov:

代码。


结果。

这就是问题所在,先前显然1/2的人给了1,而不是0。

 
Aleksey Vyazmikin:

这就是问题所在,以前,1/2一定是1而不是0。

不,它总是像那样四舍五入。

 
Vladimir Karputov:

不,它总是这样四舍五入的。

所以它毕竟是别的东西...

 

改变了打印的代码

         if(limit/2==0)
         {
         limit=2;
         Print("start_time - ",TimeToString(start_time,TIME_DATE|TIME_MINUTES)," stop_time - ",TimeToString(stop_time,TIME_DATE|TIME_MINUTES));
         Print("start_index=",start_index, " stop_index=",stop_index);
         }

现在我得到...

2018.07.04 15:47:07.959 IndDrafter (Si-9.18,H1) start_time - 2017.08.10 11:00 stop_time - 2017.08.10 11:00
2018.07.04 15:47:07.959 IndDrafter (Si-9.18,H1) start_index=2012 stop_index=2012

怎么会呢?

 
Aleksey Vyazmikin:

改变了打印的代码

现在我得到...

怎么说呢?

一切都是正确的。如果用公式limit=(int)(stop_time-start_time)/PeriodSeconds(_Period) 来计算极限

那么结果将是=0。

现在我们需要看看停止和开始时间是如何形成的。

原因: