OnInit

Init事件发生时在指标和EA中调用这个函数。它被用于初始化运行中的MQL5程序。有两种函数类型。

返回结果的版本

int  OnInit(void);

返回值

int类型值,0意味着成功初始化。

当返回INIT_FAILED时,EA会从图表中强制卸载。

返回INIT_FAILED时,指标不会从图表中卸载。图表上保留的指标无法运行 ― 事件处理程序不会在指标中调用。

建议使用返回执行结果的OnInit()调用,因为它不仅可以程序初始化,还可以在早期程序终止的情况下返回一个错误代码。

没有结果返回的版本只为与旧代码兼容而保留。不建议使用

void  OnInit(void);

注意

加载EA或指标之后会立即生成Init事件。不为脚本生成该事件。OnInit()函数被用来初始化MQL5程序。如果OnInit()有一个int类型的返回值,那么非零的返回代码意味着初始化失败,且生成REASON_INITFAILED去初始化原因代码的Deinit事件。

void类型的OnInit()函数始终表示初始化成功,且不建议使用。

为了优化EA 输入,建议使用来自ENUM_INIT_RETCODE枚举值作为返回代码。 这些值旨在建立优化过程管理,包括选择最合适的测试代理。在启动测试之前,在EA初始化过程中,可以使用TerminalInfoInteger()函数请求关于代理配置和资源(核心数量、空闲内存量等)的数据。根据所获得的数据,您既可以允许使用测试代理,也可以禁止它优化EA。

ID

描述

INIT_SUCCEEDED

初始化成功,EA测试可以继续。

这个代码意同零值――测试中的EA初始化成功。

INIT_FAILED

初始化失败。由于不可避免的错误,因此继续测试没有意义。例如,不能创建EA操作所需的指标。

这个值返回意同返回非零的值――测试中的EA初始化失败。

INIT_PARAMETERS_INCORRECT

旨在表示程序员一组不正确的输入参数。在通用的优化表格中,该返回代码的结果字符串以红色突出显示。

不执行这组EA输入的测试。代理已准备好接收新任务。

当收到该值时,策略测试不将此任务传递到另一个代理重复执行。

INIT_AGENT_NOT_SUITABLE

在初始化过程中没有程序执行错误。然而,出于某些原因,代理不适合进行测试。例如,没有乳沟的RAM,没有OpenCL support等。

返回该代码之后,直至这个优化结束,代理才会再接收任务。

使用OnInit()在测试中返回INIT_FAILED/INIT_PARAMETERS_INCORRECT有一些再优化EA时需要考虑的特性:

  • OnInit()返回INIT_PARAMETERS_INCORRECT的参数集被认为不适合进行测试,并且在遗传优化期间不用于获取下一个群集。在寻找最佳EA参数时,太多“废弃”参数集可能导致错误的结果。搜索EA假设优化准则函数平滑,在整个输入参数上没有间隙。
  • 如果OnInit()返回INIT_FAILED,这意味着测试无法启动,EA从代理内存中卸载。再次加载EA,以使用一组新参数执行下一个传递。与调用TesterStop()相比,启动下一次优化传递需要更多的时间。

 

EA的OnInit()样例函数

//--- 输入参数
input int      ma_period=20; //移动平均线周期
 
//--- 在EA中使用的指标句柄
int indicator_handle;   
//+------------------------------------------------------------------+
//| EA交易初始化函数                                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 检查ma_period有效性
   if(ma_period<=0)
     {
      PrintFormat("Invalid ma_period input value: %d",ma_period);
      return (INIT_PARAMETERS_INCORRECT);
     }
//--- 优化过程中
   if(MQLInfoInteger(MQL_OPTIMIZATION))
     {
      //--- 为代理检查可用的RAM
      int available_memory_mb=TerminalInfoInteger(TERMINAL_MEMORY_TOTAL);
      if(available_memory_mb<2000)
        {
         PrintFormat("Insufficient memory for the test agent: %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("Failed to generate My_Indicator handle. Error code %d",
                  GetLastError());
      return (INIT_FAILED);
     }
//--- EA初始化成功
   return(INIT_SUCCEEDED);
  }

另见

OnDeinit事件处理函数程序运行客户端事件变量的初始化创建和删除对象