Обсуждение статьи "Обработчик события "новый бар"" - страница 3

 
Andrey Khatimlianskii:

Андрей, спасибо. Скажите почему сейчас используют iTime, раньше помню во всех функциях и примерах, большинство строилось на iBars.

iTime более точнее работает?

 
Pavel Komarovsky:

Андрей, спасибо. Скажите почему сейчас используют iTime, раньше помню во всех функциях и примерах, большинство строилось на iBars.

iTime более точнее работает?

Я iBars не использовал никогда для этих целей, не знаю.
 
Интересно, почему данный пример не может получить данных таймсерий? Copy... всегда -1 и Bars() всегда 0. Т.е Доступа к данным из класса нет
 
На ренко не пойдет, там часто время баров одинаковое, особенно при повышенном размере кирпичика.
 
double Old_open, New_open;
bool  NewBar = false;

int OnInit()
  {
        //----------            

        Old_open = iOpen(Symbol(),PERIOD_CURRENT,0);
        
        //----------    

        return(INIT_SUCCEEDED);
  }
void OnTick()
  {
        //---
        New_open = iOpen(Symbol(),PERIOD_CURRENT,0);
        if (New_open != Old_open)
           {
               Print(" Пришел новый бар, ", TimeCurrent());
               NewBar = true;
               Old_open = New_open;
           }
        else NewBar = false;
         
  }

Здравствуйте, я исхожу из того, что как только пришла котировка Open(), значит пришел новый бар. ИМХО это проще или я что-то упускаю?

 
Max Go #:

...как только пришла котировка Open(), значит пришел новый бар. ИМХО это проще или я что-то упускаю?

А представьте себе ситуацию, что цена открытия нового бара равна цене открытия бара предыдущего... Высокая вероятность поймать такую ситуацию на мелких ТФ. 

 

Проще данного метода у меня нет.
Отслеживает время открытия текущего бара и при каждом тике сравнивает их.

// Проще данного метода у меня нет.
// Отслеживает время открытия текущего бара и при каждом тике сравнивает их.

double lastTime = 0;

void OnTick() {

   if(isNewBar()){

      Print("New Bar");

     }

}



bool isNewBar() {

   double thisTime= NormalizeDouble(iTime(_Symbol, PERIOD_CURRENT, 0), _Digits);

   if(lastTime != thisTime) {

      lastTime = thisTime;

      return true;

     }

   return false;

  }

Документация по MQL5: Преобразование данных / NormalizeDouble
Документация по MQL5: Преобразование данных / NormalizeDouble
  • www.mql5.com
NormalizeDouble - Преобразование данных - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Всем доброго дня и хорошего настроения!

Интересно, а такой код:

bool IsNewBar()
  {
   static datetime TimeOld;
   datetime TimeNew[1];
   CopyTime(_Symbol,PERIOD_CURRENT,0,1,TimeNew);
   if(TimeNew[0]!=TimeOld)
     {
      TimeOld=TimeNew[0];
      return(true);
     }
   return(false);
  }

будет работать? Нашёл его на сайте MQL5 очень давно и уже не помню у кого скопировал.

С уважением, Владимир.

 
MrBrooklin #:

Всем доброго дня и хорошего настроения!

Интересно, а такой код:

будет работать? Нашёл его на сайте MQL5 очень давно и уже не помню у кого скопировал.

С уважением, Владимир.

Кстати да я то же использую этот код и вполне работает, только он у меня чуть шире, можно использовать для любого ТФ!

bool isNewBar(string INST,int K, ENUM_TIMEFRAMES timeFrame)
  {
//----
   bool res=false;               // переменная результата анализа  
   int  i=0;                     // номер ячейки массива old_Times[]     
   datetime new_Time[1];         // время нового бара

   switch(K)
     {
      case 0:  i= 0; break;
      case 1:  i= 1; break;
      case 2:  i= 2; break;
      case 3:  i= 3; break;
      case 4:  i= 4; break;
      case 5:  i= 5; break;
      case 6: i= 6; break;
      case 7: i= 7; break;
      case 8: i= 8; break;
      case 9: i= 9; break;
      case 10: i=10; break;
      case 11:  i=11; break;
      case 12:  i=12; break;
      case 13:  i=13; break;
     }
   // скопируем время последнего бара в ячейку new_Time[0]   
   int copied=CopyTime(INST,timeFrame,0,1,new_Time);
   
   if(copied>0) // все ок. данные скопированы
      {
      if(old_Times[i]!=new_Time[0])       // если старое время бара не равно новому
         {
         if(old_Times[i]!=0) res=true;    // если это не первый запуск, то истина = новый бар
         old_Times[i]=new_Time[0];        // запоминаем время бара          
         }
      }      
//----
   return(res);
  }
 
switch(K)
     {
      case 0:  i= 0; break;
      case 1:  i= 1; break;
      case 2:  i= 2; break;
      case 3:  i= 3; break;
      case 4:  i= 4; break;
      case 5:  i= 5; break;
      case 6: i= 6; break;
      case 7: i= 7; break;
      case 8: i= 8; break;
      case 9: i= 9; break;
      case 10: i=10; break;
      case 11:  i=11; break;
      case 12:  i=12; break;
      case 13:  i=13; break;
     }

ну вааще))

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