You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 19:32:41