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

 
Aleksey Vyazmikin:

Он не должен быть равен нулю по логике вообще - не понятно, почему так получается!

У вас d1 выдает миниатюрные цифры, я избегаю подобных проблем преобразуя price в int, т.е. например int bid=int((tick_array[0].bid+_Point/10)/_Point);, наверняка иногда выдается 0.00000999999 на 5-значке, если расчеты производить в double
 
Aleksey Vyazmikin:

Он не должен быть равен нулю по логике вообще - не понятно, почему так получается!

Запустил в отладчике на Si-9.18. Время в rates почему-то 2016 год. Хотя значение i - 2189. Соответственно, он начинает расчет в начале графика, где ликвидности нет. Первоначальное время между старт и стоп - 1 час. Но за этот час - всего одно значение времени. Он находит его и переменной старт, и стоп. В итоге старт = стоп. Разумеется. если их отнять, получится ноль. Дальше не разбирался пока. 

 
ovak77:
У вас d1 выдает миниатюрные цифры, я избегаю подобных проблем преобразуя price в int, т.е. например int bid=int((tick_array[0].bid+_Point/10)/_Point);, наверняка иногда выдается 0, если расчеты производить в double

Да не будем обсуждать 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. Время в rates почему-то 2016 год. Хотя значение i - 2189. Соответственно, он начинает расчет в начале графика, где ликвидности нет. Первоначальное время между старт и стоп - 1 час. Но за этот час - всего одно значение времени. Он находит его и переменной старт, и стоп. В итоге старт = стоп. Разумеется. если их отнять, получится ноль. Дальше не разбирался пока. 

Поставьте BarsUsed=100 во входящих параметрах.

 
Aleksey Vyazmikin:

Поставьте BarsUsed=100 во входящих параметрах.

Да, так ошибок не возникает. Но если попадете на какой-то малоликвидный инструмент или на неликвидное время - в вечернюю сессию например, то в течение часа запросто может оказаться 1 младший бар. Вот Вам limit = 0 и обеспечен! А если котировки 2 - то limit/2 все равно при округлении 0 даст.

 
Sergey Savinkin:

Да, так ошибок не возникает. Но если попадете на какой-то малоликвидный инструмент или на неликвидное время - в вечернюю сессию например, то в течение часа запросто может оказаться 1 младший бар. Вот Вам limit = 0 и обеспечен! А если котировки 2 - то limit/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

В общем дело не в этом, спасибо.

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