OnInit

Вызывается в индикаторах и экспертах при наступлении события Init. Функция предназначена для инициализации запущенной MQL5-программы. Существуют два варианта функции.

Версия с возвратом результата

int  OnInit(void);

Возвращаемое значение

Значение типа int, ноль означает успешную инициализацию.

При возврате значения INIT_FAILED советник будет принудительно  выгружен с графика.

При возврате значения INIT_FAILED индикатор не будет выгружен с графика. При этом оставшийся на графике индикатор является нерабочим — обработчики событий в индикаторе не вызываются.

Приоритетным является использование вызова OnInit() с возвратом результата выполнения, так как этот способ позволяет не только выполнить инициализацию программы, но и вернуть код ошибки в случае досрочного прекращения программы.

Версия без возврата результата оставлена только для совместимости со старыми кодами. Не рекомендуется к использованию

void  OnInit(void);

Примечание

Событие Init генерируется сразу после загрузки эксперта или индикатора, для скриптов это событие не генерируется. Функция OnInit() используется для инициализации программы MQL5. Если OnInit() имеет возвращаемое значение типа int, то ненулевой код возврата означает неудачную инициализацию и генерирует событие Deinit с кодом причины деинициализации REASON_INITFAILED.

Функция OnInit() типа void всегда означает удачную инициализацию и не рекомендуется к использованию.

При оптимизации входных параметров эксперта рекомендуется в качестве кода возврата использовать значения из перечисления ENUM_INIT_RETCODE. Эти значения предназначены для организации управления ходом оптимизации, в том числе для выбора наиболее подходящих агентов тестирования. Прямо при инициализации эксперта еще до запуска самого тестирования можно запросить информацию о конфигурации и ресурсах агента (количество ядер, объем свободной памяти и т.д.) с помощью функции TerminalInfoInteger(). На основе полученной информации можно либо разрешить использовать данный агент тестирования, либо отказаться от него при оптимизации данного эксперта.

Идентификатор

Описание

INIT_SUCCEEDED

Инициализация прошла успешно, тестирование эксперта можно продолжать.

Этот код означает то же самое, что и нулевое значение – инициализация эксперта в тестере прошла успешно.

INIT_FAILED

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

Возврат этого значения означает то же самое, что и возврат значения, отличного от нуля, – инициализация эксперта в тестере прошла неудачно.

INIT_PARAMETERS_INCORRECT

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

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

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

INIT_AGENT_NOT_SUITABLE

Ошибок в работе программы при инициализации не возникло, но по каким-то причинам данный агент не подходит для проведения тестирования. Например, недостаточно оперативной памяти, нет поддержки OpenCL и так далее.

После возврата этого кода агент больше не будет получать заданий до самого конца данной оптимизации.

Использование OnInit() с возвратом INIT_FAILED/INIT_PARAMETERS_INCORRECT в тестере имеет ряд особенностей, которые необходимо учитывать при оптимизации советников:

  • набор параметров, для которого OnInit() вернула INIT_PARAMETERS_INCORRECT считается непригодным для тестирования и не будет использован для получения следующей популяции при генетической оптимизации. Если таких "забракованных" наборов параметров будет слишком много, то это может привести к некорректным результатам поиска оптимальных параметров советника. Алгоритм поиска предполагает, что функция критерия оптимизации является гладкой и не имеет разрывов на всём множестве входных параметров.
  • если OnInit() вернула INIT_FAILED, то это означает, что тестирование нельзя начинать и советник выгружается из памяти агента. Для выполнения следующего прохода на новом наборе параметров будет произведена повтороная загрузка советника. Это потребует намного больше времени для запуска тестирования следующего прохода оптимизации, чем в случае вызова TesterStop().

 

Пример функции OnInit() для эксперта

//--- input parameters
input int      ma_period=20; // период скользящей средней
 
//--- хендл индикатора, который используется в советнике
int indicator_handle;   
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- проверим на корректность значение ma_period
   if(ma_period<=0)
     {
      PrintFormat("Недопустимое значение входного параметра ma_period: %d",ma_period);
      return (INIT_PARAMETERS_INCORRECT);
     }
//--- при оптимизации 
   if(MQLInfoInteger(MQL_OPTIMIZATION))
     {
      //--- проверим объем доступной оперативной памяти для агента
      int available_memory_mb=TerminalInfoInteger(TERMINAL_MEMORY_TOTAL);
      if(available_memory_mb<2000)
        {
         PrintFormat("Недостаточный объем памяти для агента тестирования: %d MB",
                     available_memory_mb);
         return (INIT_AGENT_NOT_SUITABLE);
        }
     }
//--- проверим наличие индикатора
   indicator_handle=iCustom(_Symbol,_Period,"My_Indicator",ma_period);
   if(indicator_handle==INVALID_HANDLE)
     {
      PrintFormat("Не удалось создать хендл индикатора My_Indicator. Код ошибки %d",
                  GetLastError());
      return (INIT_FAILED);
     }
//--- инициализация эксперта прошла удачно 
   return(INIT_SUCCEEDED);
  }

Смотри также

OnDeinit, TesterHideIndicators, Функции обработки событий, Выполнение программ, События клиентского терминала, Инициализация переменных, Создание и уничтожение объектов