Ошибки, баги, вопросы - страница 3298

 
lynxntech #:

разве проверка условий для открытия это не обращение к индикатору?

единственный момент что если на H1 и реже проверять новый бар, а там индикатор действительно заснул, то будет пропуск, на новом баре будут данные прошлого, редко но встречается, решение забыть раз и навсегда newbar

Есть базовая стратегия с одним условием, а есть дополнительная фильтрация, и если нет сигнала от базового условия, то и индикаторы фильтры не опрашиваются.

Т.е. опрашивать надо не реже, чем раз в час?

 
Aleksey Vyazmikin #:

Есть базовая стратегия с одним условием, а есть дополнительная фильтрация, и если нет сигнала от базового условия, то и индикаторы фильтры не опрашиваются.

Т.е. опрашивать надо не реже, чем раз в час?

нет, это просто примерно, у меня нет таких проблем, если индикатор(график) проспал и бар не обновился в таблице, то один тик пропустится, на втором/третьем точно сработает..., если использовать newbar, то пропуск будет уже до следующего newbar...

 
lynxntech #:

нет, это просто примерно, у меня нет таких проблем, если индикатор(график) проспал и бар не обновился в таблице, то один тик пропустится, на втором/третьем точно сработает..., если использовать newbar, то пропуск будет уже до следующего newbar...

Я использую проверку на новый бар, иначе слишком большая нагрузка.

 
Aleksey Vyazmikin #:

Я использую проверку на новый бар, иначе слишком большая нагрузка.

у меня на одном компе, 3 копии терминала на разных счетах были пропуски сигнала то, на одном, то на другом терминале, принт показал что в момент newbar были данные прошлого бара, по этому сигнала не было, перепробовал все варианты newbar

помогло только вообще убрать newbar

пропускать часть тиков можно через static переменную и GetTickCount();

 
lynxntech #:

у меня на одном компе, 3 копии терминала на разных счетах были пропуски сигнала то, на одном, то на другом терминале, принт показал что в момент newbar были данные прошлого бара, по этому сигнала не было, перепробовал все варианты newbar

помогло только вообще убрать newbar

пропускать часть тиков можно через static переменную и GetTickCount();

Можно посмотреть такую функцию определения нового бара, которая так криво работает?

 
lynxntech #:

 в момент newbar


Что за момент?
 
Sergey Gridnev #:

Что за момент?

момент образования бара

один из вариантов newbar, остальные удалил вроде, еще 2-3 разных было

class CNewBar
  {
protected:
   datetime          oldTime;
public:
   bool              NewBar(string symbol,ENUM_TIMEFRAMES timeframe)
     {
      //--- создаем переменную newtime(тип время), присваиваем в нее из функции SeriesInfoInteger дату открытия последнего бара
      datetime newTime=datetime(SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE));
      if(newTime!=oldTime && newTime)
        {
         oldTime=newTime; //обновим время прошлого бара
         return(true); // вернем функции NewBar true, появился новый бар
         if(MQLInfoInteger(MQL_DEBUG))
            Print("Новый бар",newTime,"старый бар",oldTime); // в режиме отладки, будет выводится сообщение о значениях времен баров
        }
      //--- иначе,
      return(false); // нового бара еще нет
     };
   //---- конструктор класса
                     CNewBar() {oldTime=NULL;}; // вызывается автоматический при создании Объекта проинициализируем m_prevtime в -1
  };
 
lynxntech #:

момент образования бара

один из вариантов newbar, остальные удалил вроде, еще 2-3 разных было

Ну, так класс криво написан. Чего же Вы от него ждёте?
 
Sergey Gridnev #:
Ну, так класс криво написан. Чего же Вы от него ждёте?

Как это криво, пол дня все 3 терминала исправно открывают, и тут раз да проскочит бар, больше года не пользуюсь, сейчас может и поменялось что-то.

покажите где,

еще было несколько других вариантов и без, и из статей... и из форума примеры.

и с

SERIES_LASTBAR_DATE

и просто по времени, разные были.

на рейтинг участника пожалуйста не смотрите)

 
lynxntech #:

у меня на одном компе, 3 копии терминала на разных счетах были пропуски сигнала то, на одном, то на другом терминале, принт показал что в момент newbar были данные прошлого бара, по этому сигнала не было, перепробовал все варианты newbar

помогло только вообще убрать newbar

пропускать часть тиков можно через static переменную и GetTickCount();

У меня конструкция попроще, но тестировал - на неделю ставил - проблем не выявил с этим - данные каждую минуту писал.

//+-----------------------------------------------------------------+
//| Возвращает TRUE, если появился новый бар на текущем ТФ - для стратегии
//+-----------------------------------------------------------------+
bool isNewBar_TF(ENUM_TIMEFRAMES TF)
{
   datetime tm[];
   static datetime prevBarTime_TF=0;

   if(CopyTime(Symbol(),TF,0,1,tm)<0)
   {
      Print("%s CopyTime error = %d",__FUNCTION__,GetLastError());
   }
   else
   {
      if(prevBarTime_TF!=tm[0])
      {
         prevBarTime_TF=tm[0];
         return true;
      }
      return false;
   }
   return true;
}


Есть другое дело - индикаторы, которые никогда не рассчитываются на первом баре, и их я проверяю отдельно и, если данные не готовы - пропускаю тик.

А счетчик  GetTickCount() - надо как то синхронизировать с открытием бара и он имеет свойство переполняться, т.е. работать будет не более 50 дней - потом компьютер надо перезагружать - не очень удобно для работы советников на выделенном компьютере - можно забыть это сделать.