Skip to content

EA主要3大结构

OnInit()OnTick()OnDeinit()。这三个方法是EA运行的基石,相当于房子的三大支柱,支撑起整个自动化交易逻辑。

一、EA三大核心方法总览

方法名触发时机核心作用执行次数
OnInit()EA加载到图表时初始化环境准备、参数设置、资源加载仅1次(加载时)
OnTick()每产生一个新报价时实时行情处理、交易逻辑执行高频触发(实时)
OnDeinit()EA从图表卸载时资源释放、清理工作仅1次(卸载时)

二、OnInit():初始化准备

作用:在EA启动时完成初始设置,确保交易前的所有准备工作就绪。

  • 典型操作
    1. 参数初始化:设置交易品种、杠杆、初始资金等全局参数。
    2. 指标加载:初始化技术指标(如MA、MACD),获取指标句柄。
    3. 图表配置:修改K线显示样式(蜡烛图/竹节图)、颜色、时间周期。
    4. 权限校验:检查账户余额、保证金、算法交易权限。

代码示例

cpp
int OnInit()  
{  
   Print("【OnInit】EA加载,开始准备工作...");  
   
   return(INIT_SUCCEEDED);  // 初始化成功,EA开始运行  
}

关键返回值

  • INIT_SUCCEEDED:初始化成功,EA进入OnTick()循环。
  • INIT_FAILED/INIT_PARAMETERS_INCORRECT:初始化失败,EA不执行任何交易。

三、OnTick():实时交易逻辑

作用:每当市场产生新报价(Tick)时触发,是EA的核心逻辑执行区。

  • 典型操作
    1. 数据获取:读取实时价格、成交量、指标值(如当前买价Bid、卖价Ask)。
    2. 条件判断:根据策略逻辑(如RSI超买超卖、均线交叉)决定开仓/平仓。
    3. 交易操作:执行下单、止损止盈设置、仓位管理。
    4. 风险控制:检查账户净值、保证金使用率,触发强制平仓逻辑。

代码示例

cpp
void OnTick()  
{  
   // 示例:获取当前交易品种与买价  
   string symbol = Symbol();  
   double bidPrice = SymbolInfoDouble(symbol, SYMBOL_BID);  
   Print("【OnTick】品种 新报价:", symbol, " Bid=", bidPrice);  
}

高频触发机制

  • 每收到一个Tick(报价更新)就执行一次,可能每秒触发多次(取决于市场活跃度)。
  • 逻辑需高效,避免耗时操作(如复杂计算)导致卡顿。

四、OnDeinit():资源释放

作用:EA卸载时释放占用的资源,确保程序优雅退出。

  • 典型操作
    1. 指标句柄释放:关闭OnInit中加载的指标,避免内存泄漏。
    2. 临时文件删除:清理EA运行中生成的日志文件、缓存数据。
    3. 交易停止:平仓所有持仓,停止未完成的订单。

代码示例

cpp
void OnDeinit(const int reason)  
{  
   Print("【OnDeinit】EA卸载,开始清理资源...");  
}

参数reason

  • 卸载原因(如用户手动移除、MT5关闭),通常无需特殊处理,统一释放资源即可。