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

 
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 дней - потом компьютер надо перезагружать - не очень удобно для работы советников на выделенном компьютере - можно забыть это сделать.

 
lynxntech #:

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

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

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

и с

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

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

У Вас метод класса принимает в качестве параметров имя инструмента и таймфрейм. Очевидно, что если вы обращаетесь к методу объекта для разных таймфреймов и/или инструментов, то он будет возвращать неверные результаты.
 
Aleksey Vyazmikin #:

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

Бары не использую, но делал бы так.

bool IsNeBar()
{
  static datetime NextTime = 0;
  
  const datetime NowTime = (datetime)SymbolInfoInteger(_Symbol, SYMBOL_TIME); // Максимально дешево.
  const bool Res = NowTime >= NextTime;
  
  if (Res)
  {
    NextTime = (NowTime / PeriodSeconds() + 1) * PeriodSeconds();
    
    // Сюда можно вставить проверку CopyTime, если хочется совсем перестраховаться.
  }
    
  return(Res);  
}
 
Sergey Gridnev #:
У Вас метод класса принимает в качестве параметров имя инструмента и таймфрейм. Очевидно, что если вы обращаетесь к методу объекта для разных таймфреймов и/или инструментов, то он будет возвращать неверные результаты.
   static CNewBar M1,H1; // Создадим Объекты - 2 экземпляра класса  M1,H1 (тут же запускает Конструктор)
//--- проверим новый ли бар
   if(M1.NewBar(Symbol(),PERIOD_M1))   // проверка на появление нового бара в первом Объекте(Экземпляре класса)
      Print("Новый бар ",TimeToString(TimeCurrent(),TIME_SECONDS));

все там нормально.

 в рабочей версии вместо Symbol() из Структуры номер символа приходил, у меня через индикатор шпион приход тиков на каждый символ отдельно

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