求开发MT5平台挂单成交触发提醒功能的指标/EA(Expert Advisor)
MT5挂单成交提醒EA实现方案
核心实现逻辑
你需要的功能属于订单状态监控类EA,无需绑定K线指标逻辑,全程在EA的事件回调中完成监听即可,核心实现步骤如下:
- 首先在EA初始化阶段,遍历当前账户所有未成交的Pending类型挂单,缓存所有符合触发条件的挂单ticket编号,避免遗漏程序启动前已经创建的挂单
- 注册
OnTrade交易事件回调,MT5平台每发生一笔订单状态变动都会触发该回调,你只需要在回调中判断变动的订单是否是从「待成交挂单」状态转为「已成交」状态即可 - 订单状态判断逻辑:
- 先通过
OrderGetInteger(ORDER_TICKET)获取变动订单的ticket - 用
OrderGetInteger(ORDER_TYPE)判断订单类型是否属于以下4种挂单类型:ORDER_TYPE_BUY_LIMIT、ORDER_TYPE_SELL_LIMIT、ORDER_TYPE_BUY_STOP、ORDER_TYPE_SELL_STOP - 再用
OrderGetInteger(ORDER_STATE)判断状态是否为ORDER_STATE_FILLED,满足以上条件即可判定为目标挂单成交
- 先通过
- 提醒模块实现:
- 弹窗提示直接调用
Alert()函数即可,会自动弹出MT5系统提示窗并触发默认提示音 - 要做有声/无声开关的话,可以在EA的输入参数里加一个布尔类型的开关变量,触发提醒时先判断开关状态:如果开启有声模式调用
PlaySound()函数播放自定义wav音频,无声模式就只弹窗或者打印日志即可
- 弹窗提示直接调用
- 可选优化:可以在EA参数里加提醒内容自定义配置,支持自定义显示成交订单的品种、手数、成交价格等信息
核心代码片段参考
// 输入参数 input bool EnableSound = true; // 开启声音提醒 input string SoundFileName = "alert.wav"; // 提醒音频文件名 input bool EnablePopup = true; // 开启弹窗提醒 // 交易事件回调 void OnTrade() { // 遍历最新的订单变动 for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { ENUM_ORDER_TYPE order_type = (ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE); // 判断是否为目标挂单类型 bool is_target_pending = (order_type == ORDER_TYPE_BUY_LIMIT || order_type == ORDER_TYPE_SELL_LIMIT || order_type == ORDER_TYPE_BUY_STOP || order_type == ORDER_TYPE_SELL_STOP); if(is_target_pending && OrderGetInteger(ORDER_STATE) == ORDER_STATE_FILLED) { string symbol = OrderGetString(ORDER_SYMBOL); double volume = OrderGetDouble(ORDER_VOLUME); double price = OrderGetDouble(ORDER_PRICE_OPEN); string alert_text = StringFormat("挂单已成交:%s %s 手数:%.2f 成交价格:%.2f", EnumToString(order_type), symbol, volume, price); // 触发提醒 if(EnablePopup) Alert(alert_text); if(EnableSound) PlaySound(SoundFileName); // 无声模式下可选择仅打印日志 Print(alert_text); } } } }
注意事项
- 音频文件需要放到MT5安装目录下的
Sounds文件夹中,否则PlaySound函数会调用失败 - EA需要开启自动交易权限,否则无法捕获交易事件回调
- 如果需要监控所有历史挂单的成交状态,可以在初始化阶段遍历
ORDER_HISTORY模式下的历史订单做匹配
内容的提问来源于stack exchange,提问作者Abhishek Pandey
相关产品推荐
相关产品推荐

