открытие нового бара на другом ТФ - страница 2

 
Yerkin Sagandykov:

Здравствуйте !


использую приведенный код для контроля откытия нового бара при ТФ = PERIOD_H1

надо также при некоторых условиях (тог есть не всегда) отслеживать открытие нового бара на меньшем ТФ = PERIOD_5min

как бы это красиво сделать в коде ? 

MqlTick last_tick;//структура тика

int inTft[2];//для двух крайних тиков

double  doTB=60.0//Делитель для минуток как пример

if(SymbolInfoTick(Symbol(),last_tick) )
     {

inTft[1]=inTft[0];
  inTft[0]=(int) MathFloor(last_tick0.time/doTB);// данные типа datetime в ближайшее снизу целое
     }

   if ( inTft[0]- inTft[1]>=1) //бар закрылся

      {

}


"Дата и время

Группа функций, обеспечивающих работу с данными типа datetime (целое число, представляющее собой количество секунд, прошедших с 0 часов 1 января 1970 года)."

Должно работать. Работает точно немного в другой сборке в функции.

 

удобный для работы класс нового бара у Константина Груздева можно посмотреть в статье

не помню редактировал или нет, вот вариант его

//+------------------------------------------------------------------+
//| Расчет Новый бар                                                 |
//+------------------------------------------------------------------+
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) // проверка на появление нового бара (новое время не равно старому и в newtime есть значение(true))
        {
         oldTime=newTime; //обновим время прошлого бара
         return(true); // вернем функции NewBar true, появился новый бар
         if(MQLInfoInteger(MQL_DEBUG)) Print("Новый бар",newTime,"старый бар",oldTime); // в режиме отладки, будет выводится сообщение о значениях времен баров
        }
      //--- иначе, 
      return(false); // нового бара еще нет
     };
   //---- конструктор класса    
                     CNewBar(){oldTime=NULL;}; // вызывается автоматический при создании Объекта проинициализируем m_prevtime в -1
  };

  static CNewBar M1; 

//--- проверим новый ли бар

   if(M1.NewBar(Symbol(),PERIOD_M1))   // проверка на появление нового бара в первом Объекте(Экземпляре класса)

чтобы получать на другом периоде новый бар создаем еще переменную и вызов проверки на этом периоде:

   static CNewBar H1; 
   if(H1.NewBar(Symbol(),PERIOD_H1))   // на часовом графике проверка нового бара
 
Fast235:

удобный для работы класс нового бара у Константина Груздева можно посмотреть в статье

не помню редактировал или нет, вот вариант его

чтобы получать на другом периоде новый бар создаем еще переменную и вызов проверки на этом периоде:

) если мой вариант собрать в функцию/класс то:

достаточно в неё передавать только:

 - произвольный Symbol

 - произвольный делитель в секундах

и получать номер закрытого/открытого тиком бара с  0 часов 1 января 1970 года в произвольной размерности в секундах.

;-)

из номеров конечно выпадут выходные и пр. пропуски тиков.

 
dr.mr.mom:

) если мой вариант собрать в функцию/класс то:

достаточно в неё передавать только:

 - произвольный Symbol

 - произвольный делитель в секундах

и получать номер закрытого/открытого тиком бара с  0 часов 1 января 1970 года в произвольной размерности в секундах.

;-)

из номеров конечно выпадут выходные и пр. пропуски тиков.

что-бы посмотрели ваш код хотя-бы приложите усилия оформить его

и не понятно что вы имели ввиду
 
Fast235:

удобный для работы класс нового бара у Константина Груздева можно посмотреть в статье

не помню редактировал или нет, вот вариант его

чтобы получать на другом периоде новый бар создаем еще переменную и вызов проверки на этом периоде:

Я бы его вот так переписал

//+------------------------------------------------------------------+
//| Расчет Новый бар                                                 |
//+------------------------------------------------------------------+
class CNewBar
  {
private:
   string            m_symbol;
   ENUM_TIMEFRAMES   m_timeframe;
protected:
   datetime          m_oldTime;
public:
   //---- конструктор класса
                     CNewBar(
      const string symbol,
      const ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT) :
                     m_oldTime(NULL)
     {
      m_symbol = symbol;
      m_timeframe = timeframe;
     }

   bool              NewBar(void)
     {
      //--- создаем переменную newtime(тип время), присваиваем в нее из функции SeriesInfoInteger дату открытия последнего бара
      datetime newTime=datetime(SeriesInfoInteger(m_symbol,m_timeframe,SERIES_LASTBAR_DATE));

      if(newTime!=m_oldTime && newTime) // проверка на появление нового бара (новое время не равно старому и в newtime есть значение(true))
        {
         m_oldTime=newTime; //обновим время прошлого бара
         return(true); // вернем функции NewBar true, появился новый бар
         if(MQLInfoInteger(MQL_DEBUG))
            Print("Новый бар",newTime,"старый бар",m_oldTime); // в режиме отладки, будет выводится сообщение о значениях времен баров
        }
      //--- иначе,
      return(false); // нового бара еще нет
     }
  };

Создавать под каждую интересующую пару символ/период свой экземпляр класса. Тогда корректно будет сохраняться время открытия бара в каждом экземпляре класса. Иначе допустим если подряд запросить несколько символов да еще прогнать по периодам. Выдаст не совсем то что есть в реале.

 
Konstantin Nikitin:

Я бы его вот так переписал

Создавать под каждую интересующую пару символ/период свой экземпляр класса. Тогда корректно будет сохраняться время открытия бара в каждом экземпляре класса. Иначе допустим если подряд запросить несколько символов да еще прогнать по периодам. Выдаст не совсем то что есть в реале.

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