Summary: 完整的MT4一键平仓脚本源码,支持平仓前显示总盈亏、按魔术号筛选、按品种筛选。适用于紧急平仓或批量管理订单。




# 一键平仓脚本 - 完整MQL4源码

本文提供一个实用的MT4脚本源码,可一键平掉所有持仓订单。相比基础平仓脚本,本工具在平仓前会显示总盈亏汇总,并支持按魔术号或品种筛选。

脚本功能特点



  • 一键平仓所有市价单

  • 平仓前显示总盈亏

  • 可按EA魔术号筛选

  • 可按货币对筛选

  • 带确认对话框

  • 兼容所有MT4平台


  • 完整MQL4代码



    ```mql4
    //+------------------------------------------------------------------+
    //| CloseAllOrders.mq4 |
    //| 由AI助手自动生成编译 |
    //| |
    //+------------------------------------------------------------------+
    #property copyright "AI助手"
    #property link ""
    #property version "1.00"
    #property strict
    #property show_inputs

    //+------------------------------------------------------------------+
    //| 输入参数 |
    //+------------------------------------------------------------------+
    input bool CloseAll = true; // 平仓所有订单(忽略下方筛选)
    input int FilterMagic = 0; // 按魔术号筛选(0=全部)
    input string FilterSymbol = ""; // 按品种筛选(留空=当前图表)
    input bool ShowConfirmation = true; // 显示确认对话框

    //+------------------------------------------------------------------+
    //| 脚本主函数 |
    //+------------------------------------------------------------------+
    void OnStart()
    {
    string targetSymbol = (FilterSymbol == "") ? Symbol() : FilterSymbol;
    int totalOrders = OrdersTotal();

    if(totalOrders == 0)
    {
    Alert("没有找到需要平仓的订单");
    return;
    }

    // 首先计算总盈亏
    double totalProfit = 0;
    int orderCount = 0;

    for(int i = 0; i < totalOrders; i++)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
    bool matchSymbol = (CloseAll || OrderSymbol() == targetSymbol);
    bool matchMagic = (CloseAll || FilterMagic == 0 || OrderMagicNumber() == FilterMagic);

    if(matchSymbol && matchMagic)
    {
    totalProfit += OrderProfit() + OrderSwap() + OrderCommission();
    orderCount++;
    }
    }
    }

    if(orderCount == 0)
    {
    Alert("没有找到符合筛选条件的订单");
    return;
    }

    // 构建确认消息
    string msg = "找到 " + string(orderCount) + " 个待平仓订单\n";
    msg += "总盈亏: " + DoubleToStr(totalProfit, 2) + " " + AccountCurrency() + "\n";
    msg += "品种: " + targetSymbol + "\n";
    if(FilterMagic != 0 && !CloseAll)
    msg += "魔术号: " + string(FilterMagic) + "\n";
    msg += "\n确认平仓吗?";

    if(ShowConfirmation && MessageBox(msg, "平仓确认", MB_YESNO | MB_ICONQUESTION) != IDYES)
    {
    Print("用户取消平仓操作");
    return;
    }

    // 执行平仓
    int closed = 0;
    int errors = 0;

    for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
    bool matchSymbol = (CloseAll || OrderSymbol() == targetSymbol);
    bool matchMagic = (CloseAll || FilterMagic == 0 || OrderMagicNumber() == FilterMagic);

    if(matchSymbol && matchMagic)
    {
    bool result = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 3, clrRed);
    if(result)
    {
    closed++;
    Print("已平仓订单 #", OrderTicket(), " | 盈亏: ", OrderProfit() + OrderSwap() + OrderCommission());
    }
    else
    {
    errors++;
    Print("平仓失败 #", OrderTicket(), " | 错误码: ", GetLastError());
    }
    }
    }
    }

    // 最终报告
    Print("===== 平仓汇总 =====");
    Print("成功: ", closed, " | 失败: ", errors);
    Print("总盈亏: ", DoubleToStr(totalProfit, 2), " ", AccountCurrency());

    if(closed > 0)
    Alert("成功平仓 ", closed, " 个订单。总盈亏: ", DoubleToStr(totalProfit, 2), " ", AccountCurrency());
    else if(errors > 0)
    Alert("平仓失败,请查看专家日志了解详情");
    }

    //+------------------------------------------------------------------+
    //| 辅助函数:获取订单平仓价 |
    //+------------------------------------------------------------------+
    double OrderClosePrice()
    {
    if(OrderType() == OP_BUY)
    return Bid;
    else if(OrderType() == OP_SELL)
    return Ask;
    else
    return 0;
    }
    //+------------------------------------------------------------------+
    ```

    参数详解



    | 参数 | 说明 |
    |------|------|
    | 平仓所有订单 | True=平仓全部,忽略下方筛选条件 |
    | 魔术号筛选 | 指定EA的魔术号,0表示全部 |
    | 品种筛选 | 指定货币对,留空则使用当前图表品种 |
    | 显示确认对话框 | 执行前是否弹出确认框 |

    安装与使用方法



    1. 复制代码到MT4的MetaEditor(按F4打开)
    2. 点击编译按钮(F7)- 确保无错误
    3. 从导航器将脚本拖拽到任意图表
    4. 在弹出窗口中调整参数
    5. 确认对话框后执行平仓

    实用场景



    场景一 - 紧急平仓:行情突然反向,拖拽脚本到图表→确认→瞬间全部平仓。

    场景二 - 平指定EA:将FilterMagic设为EA的魔术号,只平该EA的订单,保留手动单。

    场景三 - 平单一品种:设置FilterSymbol为"EURUSD",只平欧元美元的所有订单。

    编译注意事项



  • 脚本执行一次即结束,不同于EA

  • 不需要`OnTick()`或`OnInit()`函数

  • `#property show_inputs`用于显示参数对话框

  • 平仓时必须倒序循环(i--)


  • 重要提示



    先在模拟账户测试。本脚本只平市价单(不含挂单)。如需平挂单,请使用`OrderDelete()`函数。盈亏计算已包含隔夜利息和手续费。

    参考来源



    自主编译。基于MQL4标准OrderSend和OrderClose函数实现订单平仓逻辑。

    *如需更多高级交易工具,包括自动风控、移动止损EA、批量平仓管理器等,欢迎查看我们的精品脚本合集,永久免费更新。*