MQL4 Прослушивание события Candle Bar Open

Я действительно новичок в MQL4 и все еще пытаюсь понять концепцию. Я хотел бы иметь обработчик событий для обнаружения каждого открытия бара свечи (или закрытия каждого предыдущего бара свечи). Попытка обернуть это вокруг моей головы, но это не работает:

Итак, у меня есть функция для проверки галочки:

bool checkingFirstTick(){
   datetime currentTime = iTime(Symbol(), Period(), 0);

   if(currentTime - lastCandle > 0){
      lastCandle = currentTime;
      return true;
   }
   return false;
}

где lastCandle — глобальная переменная.

Теперь, когда я помещаю его в событие OnTick():

void OnTick(){

  Print("Ticking");
   if(checkingFirstTick()){
      Print("It's an opening!");
   }
}

Оператор It's an opening! никогда не печатается.

введите здесь описание изображения

Я делаю что-то принципиально неправильное? Или есть более эффективный способ прослушивания открытия свечного бара, независимо от того, какой период я ​​установил?


person CozyAzure    schedule 11.04.2018    source источник
comment
Все в порядке, но имейте в виду, что вы запускаете его на H4, поэтому никаких событий до 0:00:00 или 4:00:00 и т. д.   -  person Daniel Kniaz    schedule 11.04.2018
comment
@DanielKniaz да, но потом вы посмотрите на журнал, он тикает почти каждую секунду! что не должно быть правильно? разве он не должен регистрироваться каждые 4 часа?   -  person CozyAzure    schedule 11.04.2018
comment
«Тик» на каждом тике, «Открывается» один новый бар». Скройте строку «Ticking», чтобы увидеть, появляются ли новые бары, я думаю, у вас есть миллионы «Ticking» и вы не видите строку «new bar» в журналах.   -  person Daniel Kniaz    schedule 13.04.2018


Ответы (1)


Попробуй это:

// --- Global Variable ----
datetime ArrayTime[], LastTime;

void OnTick() {
   if(NewBar(PERIOD_H1)) {
       // insert your program here
   }
}

bool NewBar(int period) {
    bool firstRun = false, newBar = false;

    ArraySetAsSeries(ArrayTime,true);
    CopyTime(Symbol(),period,0,2,ArrayTime);

    if(LastTime == 0) firstRun = true;
    if(ArrayTime[0] > LastTime) {
        if(firstRun == false) newBar = true;
        LastTime = ArrayTime[0];
    }
    return newBar;   
}
person Hairi    schedule 24.04.2018