Пропустить первый тик бара. [РЕШЕНО]

 

Может кто-то уже решал подобную задачу? В индикаторе надо выполнить определённые действия только на втором тике. Первый пропускаем, на втором работаем и спим до появления нового бара.

С новым баром всё предельно просто

if(rates_total > prev_calculated)
 // Новый бар есть

Но на втором тике сюда уже не зайдёт. А надо. Подкачка пропущенных баров истории не интересует.

Мыслей много, все перепутались и ни одна до конца не складывается.

 

Счетчик на каждом вызове OnCalculate увеличивается. На условии выше - обнуляется.

Когда счетчик равен двум - запуск логики.

 
fxsaber:

Счетчик на каждом вызове OnCalculate увеличивается. На условии выше - обнуляется.

Когда счетчик равен двум - запуск логики.

Не вариант. Как-то проверял принтами старт индикатора. Так он с ходу при запуске терминала выдавал ~10 вызовов OnCalculate (простое подключение индикатора на работающем терминале, не помню поведение). Тут надо что-то другое думать. Может задержку стоит дать 1-2 секунды.
 
Konstantin Nikitin:
Не вариант. Как-то проверял принтами старт индикатора. Так он с ходу при запуске терминала выдавал ~10 вызовов OnCalculate (простое подключение индикатора на работающем терминале, не помню поведение). Тут надо что-то другое думать. Может задержку стоит дать 1-2 секунды.

К чему это занудство? При желании любые нестандартные ситуации обходятся. Основная идея - выше.

 

Alexey Viktorov:

if(rates_total > prev_calculated)
 // Новый бар есть

это не новый бар, это новый бар ИЛИ подкачка истории ИЛИ обрыв связи...

новый бар лучше классически определять:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   static datetime lastbar=0;
      if(prev_calculated==0)
        {
         limit=rates_total-1;   //--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
         lastbar=0;
        }
   if(lastbar!=time[1]
     {
      lastbar=time[1];  // новый бар
      }
 
Konstantin Nikitin:
Не вариант. Как-то проверял принтами старт индикатора. Так он с ходу при запуске терминала выдавал ~10 вызовов OnCalculate (простое подключение индикатора на работающем терминале, не помню поведение). Тут надо что-то другое думать. Может задержку стоит дать 1-2 секунды.

К сожалению Sleep в индикаторах не работает.

 
Igor Makanu:

это не новый бар, это новый бар ИЛИ подкачка истории ИЛИ обрыв связи...

новый бар лучше классически определять:

Игорь, читайте пожалуйста внимательно

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Пропустить первый тик бара.

Alexey Viktorov, 2019.06.08 07:49

Может кто-то уже решал подобную задачу? В индикаторе надо выполнить определённые действия только на втором тике. Первый пропускаем, на втором работаем и спим до появления нового бара.

С новым баром всё предельно просто

if(rates_total > prev_calculated)
 // Новый бар есть

Но на втором тике сюда уже не зайдёт. А надо. Подкачка пропущенных баров истории не интересует.

Мыслей много, все перепутались и ни одна до конца не складывается.


 
fxsaber:

К чему это занудство? При желании любые нестандартные ситуации обходятся. Основная идея - выше.

intOnCalculate(constint rates_total,
                constint prev_calculated,
                constdatetime &time[],
                constdouble &open[],
                constdouble &high[],
                constdouble &low[],
                constdouble &close[],
                constlong &tick_volume[],
                constlong &volume[],
                constint &spread[])
  {
//---
   staticint i = 1;
   Print("Вызов OnCalculate: ", i);
   i++;
//--- return value of prev_calculated for next call
   return(rates_total);
  }
При старте на работающем терминале, 1 проход. При перезагрузке терминала 2. А вроде ни чего особенного нет. И сейчас рынок закрыт. Уж точно новых тиков не было.


Так что это не занудство, а просто наблюдение поведения терминала.
 
fxsaber:

Счетчик на каждом вызове OnCalculate увеличивается. На условии выше - обнуляется.

Когда счетчик равен двум - запуск логики.

Не сложились у меня все эти кубики.

Первый тик бара. rates_total > prev_calculated входим. Счётчик++

Второй тик бара. Счётчик == 1 входим. Работаем. Счётчик++

Дальше??? Где сбросить счётчик?

Или заклинило где-то в микросхеме моего процессора...

 
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])

Добавьте условие    tick_volume[0]>1

 
Igor Zakharov:

Добавьте условие    tick_volume[0]>1

Таким образом пропустим первый тик, на втором отработаем. А как пропустить остальные тики до появления следующего бара?