MQL5中如何在持仓平仓后下达新限价单及对应买卖订单
1. 在MQL5中,如何在持仓平仓后下达新的限价订单
核心思路是通过交易事件回调或轮询持仓状态,识别平仓动作后触发限价订单下单逻辑,以下是具体实现:
实现步骤
- 捕获平仓事件:利用MQL5的
OnTrade()回调函数监听交易动作,该函数会在订单状态变更时触发。 - 验证平仓状态:通过
OrderSelect()获取订单详情,判断订单是否已完成平仓(OrderCloseTime()不为0)。 - 下达限价订单:构造
MqlTradeRequest结构体,指定订单类型为ORDER_TYPE_BUY_LIMIT或ORDER_TYPE_SELL_LIMIT,调用OrderSend()发送订单。
代码示例
void OnTrade() { ulong last_ticket = GetLastTradeTicket(); if(last_ticket == INVALID_ORDER) return; if(OrderSelect(last_ticket, SELECT_BY_TICKET)) { // 确认订单已完成平仓 if(OrderCloseTime() != 0) { MqlTradeRequest request = {0}; MqlTradeResult result = {0}; // 配置限价单参数 request.action = TRADE_ACTION_DEAL; request.symbol = _Symbol; request.volume = 0.1; // 下单手数 request.type = ORDER_TYPE_BUY_LIMIT; // 多头限价单,空头改ORDER_TYPE_SELL_LIMIT request.price = _Bid - 10 * _Point; // 限价价格(当前买价下浮10点) request.deviation = 10; // 滑点容忍范围 request.magic = 12345; // 策略魔术号(需唯一) request.comment = "Post-close limit order"; // 发送订单并处理结果 if(!OrderSend(request, result)) { Print("限价单下单失败,错误码: ", GetLastError()); } } } }
2. 在MQL5中,持仓平仓后提交同方向新订单
需要先识别原持仓的方向,再对应下达同类型的限价订单,具体实现如下:
实现步骤
- 识别平仓方向:在
OnTrade()中判断原持仓是多头还是空头平仓(通过订单类型或原持仓方向字段)。 - 匹配同方向订单:根据原持仓方向,分别下达
ORDER_TYPE_BUY_LIMIT(多头平仓后)或ORDER_TYPE_SELL_LIMIT(空头平仓后)。
代码示例
void OnTrade() { ulong last_ticket = GetLastTradeTicket(); if(last_ticket == INVALID_ORDER) return; if(OrderSelect(last_ticket, SELECT_BY_TICKET)) { if(OrderCloseTime() != 0) { ENUM_POSITION_TYPE original_pos_type = POSITION_TYPE_NONE; // 判断原持仓方向 if(OrderType() == ORDER_TYPE_SELL || (OrderType() == ORDER_TYPE_CLOSE_BY && OrderPositionType() == POSITION_TYPE_BUY)) { original_pos_type = POSITION_TYPE_BUY; // 原持仓为多头,已平仓 } else if(OrderType() == ORDER_TYPE_BUY || (OrderType() == ORDER_TYPE_CLOSE_BY && OrderPositionType() == POSITION_TYPE_SELL)) { original_pos_type = POSITION_TYPE_SELL; // 原持仓为空头,已平仓 } // 下达同方向限价单 if(original_pos_type != POSITION_TYPE_NONE) { MqlTradeRequest request = {0}; MqlTradeResult result = {0}; request.action = TRADE_ACTION_DEAL; request.symbol = _Symbol; request.volume = 0.1; request.magic = 12345; request.deviation = 10; request.comment = "Same-direction post-close order"; if(original_pos_type == POSITION_TYPE_BUY) { request.type = ORDER_TYPE_BUY_LIMIT; request.price = _Bid - 10 * _Point; } else { request.type = ORDER_TYPE_SELL_LIMIT; request.price = _Ask + 10 * _Point; } if(!OrderSend(request, result)) { Print("同方向限价单下单失败,错误码: ", GetLastError()); } } } } }
注意事项
- 魔术号
magic需设置为唯一值,避免与其他策略订单冲突; - 滑点
deviation需根据平台规则合理调整; - 可补充
OnTick()轮询逻辑,作为OnTrade()回调的冗余保障; - 需处理订单发送失败的场景(如余额不足、价格无效等)。
内容的提问来源于stack exchange,提问作者jad
相关产品推荐
相关产品推荐

