В одном индикаторе появилась ошибка деления на ноль - страница 4

 

limit в коде интовый, если 1/2=0,5 то видимо теперь округление дает не 1, а 0?

Для проверки гипотезы изменил код

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

Полный трэш - опять получил ошибку деления на ноль

Выкладываю код из ME в виде картинки - может я ослеп, но не понимаю что происходит

Ошибка все в той же строке

Файл тот, так как строка с ошибкой сместилась из-за добавления кода для принта.

Стилизатором нужно пользоваться - сразу бы увидели, что Ваша проблемная строка НЕ ВХОДИТ в зону проверки if(limit==0)

 
Vladimir Karputov:

Стилизатором нужно пользоваться - сразу бы увидели, что Ваша проблемная строка НЕ ВХОДИТ в зону проверки if(limit==0)

Так ей и не надо входить, зачем?

 

Такой код

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

Повесил терминал.

 
Aleksey Vyazmikin:

limit в коде интовый, если 1/2=0,5 то видимо теперь округление дает не 1, а 0?

Для проверки гипотезы изменил код

Код:

//+------------------------------------------------------------------+
//|                                           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, а не ноль.

 
Aleksey Vyazmikin:

В том то и дело, а ранее видимо 1/2 давало 1, а не ноль.

Неа. Всегда так округляло.

 
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 рассчитывается по формуле limit=(int)(stop_time-start_time)/PeriodSeconds(_Period);

то и результат будет = 0.

Теперь нужно смотреть, как образуются стоп и старттайм.

Причина обращения: