Нужна помощь с iBarShift. - страница 2

 

вот использую давно код, если бы был баг, индикатор выглядел бы странно)

//+------------------------------------------------------------------+
//| основной цикл расчёта индикатора                                 |
//+------------------------------------------------------------------+
   for(bar=start; bar<rates_total && !IsStopped(); bar++)
     {
      //----
      indexD1=iBarShift(Symbol(),PERIOD_D1,time[bar],true);
      if(indexD1<0)
         return(RESET);
      openDay=iOpen(Symbol(),PERIOD_D1,indexD1);
      //----
      //----
      Buffer1[bar]=openDay+UpperLevel*_Point;
      Buffer2[bar]=openDay;
      Buffer3[bar]=openDay-LowerLevel*_Point;
      //--- удалим значения с прошлого бара, чтобы исключить переход линий
      if(Buffer1[bar]!=Buffer1[bar-1]
         ||Buffer2[bar]!=Buffer2[bar-1]
         ||Buffer3[bar]!=Buffer3[bar-1]
        )
        {
         Buffer1[bar-1]=EMPTY_VALUE;
         Buffer2[bar-1]=EMPTY_VALUE;
         Buffer3[bar-1]=EMPTY_VALUE;
        }
     }
//---   
return(rates_total);
  }
 
lynxntech #:

вот использую давно код, если бы был баг, индикатор выглядел бы странно)


  if(indexD1<0)
         return(RESET);

Что в RESET?
 
Sergey Gridnev #:


Что в RESET?

0 false

 
lynxntech #:

0 false

Дык, Сейчас обсуждают проблему, что iBarShift периодически возвращает значение меньше 0.
А у Вас получается, что в этом случае всё пересчитывается заново. Но это не решение проблемы, а обход её.

PS. Так-то оно правильно, если ошибка при вызове iBarShift, то надо всё пересчитать. Неправильно то, что такая ошибка часто возникает.
 
Sergey Gridnev #:
Дык, Сейчас обсуждают проблему, что iBarShift периодически возвращает значение меньше 0.
А у Вас получается, что в этом случае всё пересчитывается заново. Но это не решение проблемы, а обход её.

из Справки 

iBarShift

exact=false

[in]  Возвращаемое значение, если бар на указанное время не найден. При значении exact=false iBarShift возвращает индекс ближайшего бара, у которого время открытия меньше указанного (time_open<time). Если такой бар не найден (нет истории раньше указанного времени), то функция вернет -1. Если exact=true, то ближайший бар не ищется и функция iBarShift сразу возвращает -1.

в Терминале похоже есть проблема со счетчиком времени, в этом можно убедиться в функции NewBar, как его не строй эту самую функцию, все упирается в таймер, 3 робота на одном торговом сервере иногда нет сигнала, принт показывает, что данные взяты дополнительно -1 бар.

2 версии робота сработали, а точно такая же нет. Вот бы калькулятор иногда так же умножал
 
Lilita Bogachkova #:

Не такая я и новичок, но несмотря ни на что, наконец то и вы поняли что проблема существует. 
Я специально опубликовала код, чтобы сразу было видно, что там, а не описывала проблему - подозревая что никто и так нестанет вныкать в суть. Но вы сразу показали свое решение и я признала что оно работает. 

Да, насчет новичка погорячился. Прошу прощения. Там я уже исправил.
Странно, что я не могу воспроизвести подобное поведение iBarShift, кроме как в Вашем индикаторе. 

 

Лилит, когда проверка идет на меньше 0, попробуйте отправить на пересчет, 

пишу с планшета не удобно код вставить

Если тут не поможет, то в заполнение индекса ошибка есть, последнее поле
 
Nikolai Semko #:

Да, насчет новичка погорячился. Прошу прощения. Там я уже исправил.
Странно, что я не могу воспроизвести подобное поведение iBarShift, кроме как в Вашем индикаторе. 

Может, есть смысл те же входные(внешние) параметры попробовать с другим индикатором? 

Например: 

input bool Standard_iBarShift=false; // Standard iBarShift true or false
 
Алексей Тарабанов #:

Может, есть смысл те же входные(внешние) параметры попробовать с другим индикатором? 

Например: 

Дело в том, что если убрать input таймфрейм и все TF заменить на текущий _Period, то проблема сохраняется.
 
Потестирую новый бар, там похоже сперва время бара обрабатывалось, потом цены, результат иногда новый бар с ценой прошлого
Причина обращения: