Summary: 提供完整可编译的MQL4一键平仓脚本源码,支持按订单类型、盈亏状态筛选,支持部分平仓比例。适合手工交易者快速离场。




本文提供一个完整的、可编译的MQL4脚本源码,用于一键管理交易持仓。该脚本可立即关闭所有挂单或根据用户设置的筛选条件关闭特定订单。适合在高波动时段或新闻事件前需要快速离场的手工交易者。

工具功能:
  • 一键平仓所有持仓订单

  • 按订单类型筛选(买单/卖单/全部)

  • 支持部分平仓比例

  • 仅平仓盈利或亏损订单

  • 执行前风险确认提示


  • 参数详解:
  • `CloseBuyOrders` – 是否平仓买单(OP_BUY)

  • `CloseSellOrders` – 是否平仓卖单(OP_SELL)

  • `PartialClosePercent` – 每个订单平仓比例(0=100%全平)

  • `CloseOnlyProfitable` – 仅平仓盈利订单

  • `CloseOnlyLoss` – 仅平仓亏损订单

  • `ShowConfirmDialog` – 执行前显示确认对话框


  • MQL4源码:

    ```mql4
    //+------------------------------------------------------------------+
    //| OneClickCloseAllOrders.mq4 |
    //| |
    //| 自主编译 / Self-compiled |
    //+------------------------------------------------------------------+
    #property copyright "外汇交易工具"
    #property link ""
    #property version "1.00"
    #property strict

    //--- 输入参数
    input bool CloseBuyOrders = true;
    input bool CloseSellOrders = true;
    input int PartialClosePercent = 0; // 0=全平, 1-99=部分平仓比例
    input bool CloseOnlyProfitable = false;
    input bool CloseOnlyLoss = false;
    input bool ShowConfirmDialog = true;

    //+------------------------------------------------------------------+
    //| 脚本启动函数 |
    //+------------------------------------------------------------------+
    void OnStart()
    {
    // 确认对话框
    if(ShowConfirmDialog)
    {
    int confirm = MessageBox("确定要平仓选中的订单吗?",
    "一键平仓 - 确认",
    MB_YESNO | MB_ICONWARNING);
    if(confirm != IDYES)
    {
    Print("用户取消操作");
    return;
    }
    }

    int closedCount = 0;
    int errorCount = 0;
    double totalProfit = 0;

    // 倒序遍历所有订单(安全修改)
    for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
    // 按订单类型筛选
    if(OrderType() == OP_BUY && !CloseBuyOrders) continue;
    if(OrderType() == OP_SELL && !CloseSellOrders) continue;

    // 按盈亏状态筛选
    double orderProfit = OrderProfit() + OrderSwap() + OrderCommission();
    if(CloseOnlyProfitable && orderProfit <= 0) continue;
    if(CloseOnlyLoss && orderProfit >= 0) continue;

    // 执行平仓或部分平仓
    bool result = false;
    if(PartialClosePercent > 0 && PartialClosePercent < 100)
    {
    result = PartialCloseOrder(OrderTicket(), PartialClosePercent);
    }
    else
    {
    result = CloseOrder(OrderTicket(), OrderLots());
    }

    if(result)
    {
    closedCount++;
    totalProfit += orderProfit;
    Print("已平仓订单 #", OrderTicket(), " 盈亏: ", orderProfit);
    }
    else
    {
    errorCount++;
    Print("平仓失败 #", OrderTicket(), " 错误码: ", GetLastError());
    }
    }
    }

    // 汇总报告
    Print("========== 平仓汇总 ==========");
    Print("平仓数量: ", closedCount);
    Print("失败数量: ", errorCount);
    Print("总盈亏: ", totalProfit);
    Print("==============================");

    if(closedCount > 0)
    {
    MessageBox("已平仓 " + string(closedCount) + " 个订单。\n总盈亏: " +
    DoubleToString(totalProfit, 2) + "\n失败: " + string(errorCount),
    "执行完成", MB_OK | MB_ICONINFORMATION);
    }
    }

    //+------------------------------------------------------------------+
    //| 全额平仓函数 |
    //+------------------------------------------------------------------+
    bool CloseOrder(int ticket, double lots)
    {
    if(OrderSelect(ticket, SELECT_BY_TICKET))
    {
    int cmd = OrderType();
    double price = (cmd == OP_BUY) ? Bid : Ask;
    bool result = OrderClose(ticket, lots, price, 3, clrRed);
    return result;
    }
    return false;
    }

    //+------------------------------------------------------------------+
    //| 部分平仓函数 |
    //+------------------------------------------------------------------+
    bool PartialCloseOrder(int ticket, int percent)
    {
    if(percent <= 0 || percent >= 100) return false;

    if(OrderSelect(ticket, SELECT_BY_TICKET))
    {
    double currentLots = OrderLots();
    double closeLots = NormalizeDouble(currentLots * percent / 100.0, 2);
    if(closeLots < 0.01) closeLots = 0.01; // 最小手数限制

    double remainingLots = NormalizeDouble(currentLots - closeLots, 2);
    if(remainingLots < 0.01)
    {
    return CloseOrder(ticket, currentLots);
    }

    int cmd = OrderType();
    double price = (cmd == OP_BUY) ? Bid : Ask;
    bool result = OrderClose(ticket, closeLots, price, 3, clrBlue);

    if(result)
    {
    Print("订单 #", ticket, " 部分平仓 ", closeLots, " / ", currentLots, " 手");
    }
    return result;
    }
    return false;
    }

    //+------------------------------------------------------------------+
    //+------------------------------------------------------------------+
    ```

    安装与使用教程:
    1. 将文件保存为 `OneClickCloseAllOrders.mq4` 到 `MQL4/Scripts/` 文件夹
    2. 在MetaEditor中按F5编译
    3. 从导航器将脚本拖拽到任意图表上
    4. 在弹出的对话框中调整参数
    5. 确认执行

    参数自定义技巧:
  • 设置 `PartialClosePercent=50` 可平仓每个订单的一半仓位

  • 使用 `CloseOnlyProfitable=true` 仅锁定盈利订单

  • 禁用确认对话框可加快执行速度(建议谨慎使用)


  • 风险提示:
    脚本执行前请确保网络稳定,部分平仓功能依赖于经纪商对部分平仓的支持。建议先在模拟账户测试。

    参考来源: 自主编译,实用工具脚本。

    如果需要更高级的半自动交易系统,包含图形化面板、风险管理模块和新闻过滤器,欢迎查看我们的付费EA套装,获取持续更新和技术支持。