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

 
tito.vinicius:

В настоящее время мой советник открывает несколько ордеров на одной и той же свече. Думаю, материал в этой статье мне поможет.

Как мне его реализовать?


Вы можете вынести логику входа в сделку из события OnTick() и поместить ее в функцию OnNewBar(). Таким образом, она будет выполняться только при появлении нового бара, не нужно будет входить несколько раз на одной и той же свече, потому что после выполнения она снова будет выполняться только на следующей свече.

 
Большое спасибо за эту очень красивую бумагу - ваши усилия очень ценятся!
 

Хорошая статья.

Спасибо!

 

Очень приятно, спасибо,

Я надеялся на функцию библиотек MQL5, но, похоже, ее нет? У меня модульная торговая библиотека и я столкнулся с проблемой, когда сигнальный модуль устанавливал свой флаг IsNewBar и переопределял prevCandleTime, а когда модуль TrailingSL должен был оценить ту же функцию, он возвращал false, потому что prevCandleTime совпадает с текущим.

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

 
Очень информативная статья, спасибо большое
 
Спасибо, лучший способ обнаружить новый бар! :)
 
На мой взгляд, иногда мы неоправданно усложняем вещи. Из практических соображений ничто, даже с точки зрения производительности, не превзойдет системное время (windows time). В начале следующей минуты, или, чтобы быть уверенным, через несколько секунд, мы можем предположить, что будет новый бар для каждого символа. Скажем, через минуту... пять минут... пятнадцать минут, или любой другой таймфрейм. Чтобы быть уверенным, можно проверить, совпадают ли время бара и системное время.

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


 
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