Как лучше узнать что пришел новый бар?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114514
Forex Trader  
В эксперте необходимо перемещать трейлингстоп по появлению нового бара, как лучше всего узнать о появлении нового бара?
Сам додумался только до того, что запоминаю количество баров через Bars в переменную и сравниваю её с Bars. Но проблема в том, что если перекючить таймфрейм или подкачать историю, то Bars тоже меняется.
Forex Trader
114514
Forex Trader  
Вставь дполонительно проверку периода.
Forex Trader
114514
Forex Trader  
В эксперте необходимо перемещать трейлингстоп по появлению нового бара, как лучше всего узнать о появлении нового бара?
Сам додумался только до того, что запоминаю количество баров через Bars в переменную и сравниваю её с Bars. Но проблема в том, что если перекючить таймфрейм или подкачать историю, то Bars тоже меняется.

Если переключить таймфрейм, то не только bars меняется, но и эксперт перепускается, с инициализацией всех переменных.
Я для такого случая (запоминать последний бар) делал:
1. В параметры эксперта указывал для какого таймфрейма необходимо следить за барами
2. В процедуре deinit создавал гл.переменную <имя экперта+символ+отслеживаемый таймфрейм> = время последнего запомненного бара
3. В Процедуре init() проверял наличие гл.переменной и восстанавливал время последнего отслеженного бара.
4. В процедуре эксперта пользовался iTime для 0 (или 1, как удобнее) бара.

Есть один минус: несогласованность нескольких одинаковых экспертов по одному символу и бару, но имхо это врядли в встретится. :-)
Forex Trader
114514
Forex Trader  
А пока я на другом таймфрейме, на торгующем может ситуация изменится, а нет ли функции определяющей количество баров на нужном таймфрейме?
Forex Trader
114514
Forex Trader  
А пока я на другом таймфрейме, на торгующем может ситуация изменится, а нет ли функции определяющей количество баров на нужном таймфрейме?

iBars
Forex Trader
114514
Forex Trader  
А пока я на другом таймфрейме, на торгующем может ситуация изменится, а нет ли функции определяющей количество баров на нужном таймфрейме?

"Особенности написания экспертов"
setborg
158
setborg  
Forex Trader:

Если переключить таймфрейм, то не только bars меняется, но и эксперт перепускается, с инициализацией всех переменных.
Я для такого случая (запоминать последний бар) делал:
1. В параметры эксперта указывал для какого таймфрейма необходимо следить за барами
2. В процедуре deinit создавал гл.переменную <имя экперта+символ+отслеживаемый таймфрейм> = время последнего запомненного бара
3. В Процедуре init() проверял наличие гл.переменной и восстанавливал время последнего отслеженного бара.
4. В процедуре эксперта пользовался iTime для 0 (или 1, как удобнее) бара.

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


Добрый день. У вас есть пример кода по новому бару ?

Буду благодарен.

Aliaksandr Yemialyanau
2187
Aliaksandr Yemialyanau  
datetime Tm[1];

void OnTick()
  {
   datetime NTm[1];

   CopyTime(_Symbol,_Period,0,1,NTm);

   if(Tm[0]!=NTm[0])
     {
      //Выполняется на новом баре

      Tm[0]=NTm[0];
     }
   return;
  }  
setborg
158
setborg  
Aliaksandr Yemialyanau:

Спасибо

Georgiy Merts
9181
Georgiy Merts  

Я всегда делаю иначе, без всяких запросов таймсерий.

datetime dtCompleteBarTime = MIN_DATETIME;      // На глобальном уровне объявляем момент обработанного бара

//........................

// Получаем время бара из текущего момента
datetime dCurBarMoment = CTimeSeriesT::GetStartMomentOfBar(TimeCurrent,GetWorkTimeframe());

// Если момент бара не больше чем запомненное - значит, бар уже обработан, ничего не делаем
if(dCurSetMoment  <= dtCompleteBarTime)
   return; 

// Если мы здесь, значит, бар еще не обработан. 
// Обновляем время обработки
dtCompleteBarTime = dCurBarMoment;

// И обрабатываем бар

//.... здесь код, анализа ситуации и выдачи приказов

Используется функция, которая по переданному времени и таймфрейму - возвращает начало времени бара. У меня эта функция - часть класса CTimeSeriesT, но ее вполне можно использовать и не включая в класс:

#define START_EPOCHA_DAYS 4                        // Текущая эпоха времени начинается не с понедельника, есть еще 4 дня.

datetime CTimeSeriesT::GetStartMomentOfBar(datetime dtCurTime,ENUM_TIMEFRAMES etBarSize)
{
   datetime dtTmp;
   MqlDateTime mdtCurTime;
   uint uiSecsInBar;

   switch(etBarSize)
      {
      case PERIOD_M1:
      case PERIOD_M2:
      case PERIOD_M3:
      case PERIOD_M4:
      case PERIOD_M5:
      case PERIOD_M6:
      case PERIOD_M10:
      case PERIOD_M12:
      case PERIOD_M15:
      case PERIOD_M20:
      case PERIOD_M30:
      case PERIOD_H1:
      case PERIOD_H2:
      case PERIOD_H3:
      case PERIOD_H4:
      case PERIOD_H6:
      case PERIOD_H8:
      case PERIOD_H12:
      case PERIOD_D1:
         uiSecsInBar = PeriodSeconds(etBarSize);
         return((dtCurTime/uiSecsInBar)*uiSecsInBar);

      case PERIOD_W1:
         // Для вычисления времени начала недели используем функцию из статьи "Основы программирования на MQL5 - Время"
         dtTmp = dtCurTime;
         dtTmp += SECS_IN_DAY*START_EPOCHA_DAYS;
         dtTmp = (dtTmp/SECS_IN_WEEK)*SECS_IN_WEEK;
         dtTmp -= SECS_IN_DAY*START_EPOCHA_DAYS;
         return(dtTmp);

      case PERIOD_MN1:
         TimeToStruct(dtCurTime,mdtCurTime);   
         mdtCurTime.sec = 0;
         mdtCurTime.min = 0;
         mdtCurTime.hour = 0;
         mdtCurTime.day = 1;
         return(StructToTime(mdtCurTime));      
      
      default:
         ASSERT(false);
      };

   return(dtCurTime);
};
Yuriy Asaulenko
9360
Yuriy Asaulenko  
Че-то не пойму проблемы. У бара есть метка времени. Проверяй метку времени последнего бара, и когда она изменилась - вот и начало нового бара. Один оператор if (T1 != T0).
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий