Нужна Помощь

 

Я новичок в программировании на MQL4. Написал простого советника, но он дает сигнал о паттерне каждый тик, пока не закроется нулевой бар. А нужно, чтоб 1 раз. Я уже перебрал ОЧЕНЬ много вариантов обработчиков события "Новый Бар", но НИ ОДИН не решает эту проблему. 

Есть один момент: я, когда перебирал разные варианты обработчиков события "новый бар", тестировал советник ТОЛЬКО в тестере стратегий. И журнал событий получается просто огромным из-за большого количества оповещений.

Может в тестере стратегий есть какие-то ограничения по событию "Новый Бар"? 

 
Ermak1243:

Я новичок в программировании на MQL4. Написал простого советника, но он дает сигнал о паттерне каждый тик, пока не закроется нулевой бар. А нужно, чтоб 1 раз. Я уже перебрал ОЧЕНЬ много вариантов обработчиков события "Новый Бар", но НИ ОДИН не решает эту проблему. 

Есть один момент: я, когда перебирал разные варианты обработчиков события "новый бар", тестировал советник ТОЛЬКО в тестере стратегий. И журнал событий получается просто огромным из-за большого количества оповещений.

Может в тестере стратегий есть какие-то ограничения по событию "Новый Бар"? 

А статью Обработчик события "новый бар" - смотрели? Определение нового бара с помощью статической переменной:

//+------------------------------------------------------------------+
//| Возвращает true, если появился новый бар для пары символ/период  |
//+------------------------------------------------------------------+
bool isNewBar()
  {
//--- в статической переменной будем помнить время открытия последнего бара
   static datetime last_time=0;
//--- текущее время
   datetime lastbar_time=SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE);

//--- если это первый вызов функции
   if(last_time==0)
     {
      //--- установим время и выйдем 
      last_time=lastbar_time;
      return(false);
     }

//--- если время отличается
   if(last_time!=lastbar_time)
     {
      //--- запомним время и вернем true
      last_time=lastbar_time;
      return(true);
     }
//--- дошли до этого места - значит бар не новый, вернем false
   return(false);
  }
 
barabashkakvn:

А статью Обработчик события "новый бар" - смотрели? Определение нового бара с помощью статической переменной:

Да. Я его вставлял в код таким образом:

int start()

{

if(isNewBar()==false) return(0);

... 

return(0);

Поправьте, если что-то не так.

Я уже даже специально создавал такие условия, чтоб советник не работал вообще. А функция return(): что есть, что нету ее.  :) Советник выполняется каждый тик.

 
Ermak1243:

Да. Я его вставлял в код таким образом:

int start()

{

if(isNewBar()==false) return(0);

... 

return(0);

Поправьте, если что-то не так.

Я уже даже специально создавал такие условия, чтоб советник не работал вообще. А функция return(): что есть, что нету ее.  :) Советник выполняется каждый тик.

Начните с получение шаблона эксперта с помощью Мастера MQL. Также справка - раздел "Выполнение программ".

Start

Событие Start – это специальное событие для активизации скрипта после его загрузки. Это событие обрабатывается функцией OnStart. Событие Start экспертам и пользовательским индикаторам не посылается.

Также о вставке кода в сообщение форума: Правильно вставляем код на форуме
 
Если я правильно понял, весь код надо выполнять внутри функции void OnTick(), а не int Start()?
 
Ermak1243:
Если я правильно понял, весь код надо выполнять внутри функции void OnTick(), а не int Start()?
Да. В OnTick(). А Start() вообще не должно быть. 
 

Функция start() использовалась в старых версиях MQL (MT4 build до 600). Сейчас для этих целей OnTick().

условие можно и так написать: if (!IsNewBar()) return; но это дело вкуса.

Однако учтите, что Вам может понадобится производить некоторые операции когда бар формируется (отслеживание цены/профита, закрытие позиций, трейлинг).

Поэтому лучше делать примерно так:

void OnTick()
{
 if (IsNewBar()) 
    {
     // выполняем что необходимо при открытии бара
    } 
 // выполняем общие проверки, не зависящие от открытия бара.
 ...
}

Я бы еще делал подтверждение того, что по открытию бара операция прошла успешно. Т.к. если речь идет об открытии ордера на новом баре и по каким-либо причинам не удалось его открыть, то на следующем тике можно попытаться еще раз... если оно надо.

 
barabashkakvn:
Да. В OnTick(). А Start() вообще не должно быть. 
Зачем же так категорично? start() (с маленькой буквы!!!) в mql4 оставлен для совместимости и прекрасно компилируется даже с #property strict

 
abolk:
Зачем же так категорично? Start() в mql4 оставлен для совместимости и прекрасно работает
Да, именно в старом коде. Человек же только начинает изучение. Уж лучше сразу учится на новом коде. Т.к. думаю старый код может и когда-то лишится поддержки компилятором.
 

Столько ответов!!! :) Спасибо ВСЕМ за помощь! Буду разбираться. 

Я только сейчас заметил, что написал на форуме MQL 5, а не MQL 4 :)

Может, в силу того, что я пытаюсь написать советник в MQL 4, есть смысл перенаправить на форум MQL 4? 

 
Ermak1243:

Столько ответов!!! :) Спасибо ВСЕМ за помощь! Буду разбираться. 

Я только сейчас заметил, что написал на форуме MQL 5, а не MQL 4 :)

Может, в силу того, что я пытаюсь написать советник в MQL 4, есть смысл перенаправить на форум MQL 4? 

Нет, форумы становятся одним целым. "Четвёртый" форум будет переведён в режим чтения.
Причина обращения: