Summary: 完整MT4一键平仓脚本源码,点击即可平掉所有持仓。支持按魔术号和注释过滤,实时计算盈亏统计,安全易用。




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

本实用脚本允许交易者一键平掉所有持仓订单。执行前会显示总盈亏统计,支持按魔术号和订单注释进行过滤。

脚本功能



  • 一键平掉所有市价单(买单和卖单)

  • 平仓前显示总盈亏统计

  • 支持按魔术号或自定义注释过滤

  • 可选择只平买单或只平卖单

  • 支持全品种平仓或仅当前品种


  • 完整MQL4代码



    ```mql4
    //+------------------------------------------------------------------+
    //| CloseAll.mq4 |
    //| Version 2.0 |
    //| |
    //+------------------------------------------------------------------+
    #property copyright "外汇工具实验室"
    #property link ""
    #property version "2.00"
    #property strict
    #property script_show_inputs

    //--- 输入参数
    input bool CloseAllSymbols = true; // 平所有品种订单
    input bool CloseBuys = true; // 平买单
    input bool CloseSells = true; // 平卖单
    input int FilterMagic = 0; // 魔术号过滤(0=全部)
    input string FilterComment = ""; // 注释过滤(空=全部)
    input bool ShowConfirmation = true; // 显示确认对话框
    input int Slippage = 30; // 滑点点数

    //+------------------------------------------------------------------+
    //| 脚本入口函数 |
    //+------------------------------------------------------------------+
    void OnStart()
    {
    int closedCount = 0;
    double totalProfit = 0;
    int buyCount = 0, sellCount = 0;
    double buyProfit = 0, sellProfit = 0;

    // 第一遍遍历:收集订单信息
    for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
    if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    continue;

    // 检查魔术号过滤
    if(FilterMagic != 0 && OrderMagicNumber() != FilterMagic)
    continue;

    // 检查注释过滤
    if(StringLen(FilterComment) > 0 && StringFind(OrderComment(), FilterComment) == -1)
    continue;

    // 检查品种过滤
    if(!CloseAllSymbols && OrderSymbol() != Symbol())
    continue;

    // 按订单类型统计
    if(OrderType() == OP_BUY)
    {
    buyCount++;
    buyProfit += OrderProfit() + OrderSwap() + OrderCommission();
    }
    else if(OrderType() == OP_SELL)
    {
    sellCount++;
    sellProfit += OrderProfit() + OrderSwap() + OrderCommission();
    }
    }

    totalProfit = buyProfit + sellProfit;

    // 显示确认对话框
    if(ShowConfirmation)
    {
    string msg = "=== 订单汇总 ===\n";
    msg += "买单数量: " + IntegerToString(buyCount) + "\n";
    msg += "卖单数量: " + IntegerToString(sellCount) + "\n";
    msg += "买单盈亏: " + DoubleToStr(buyProfit, 2) + "\n";
    msg += "卖单盈亏: " + DoubleToStr(sellProfit, 2) + "\n";
    msg += "总盈亏: " + DoubleToStr(totalProfit, 2) + "\n\n";
    msg += "确认平掉所有订单?";

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

    // 第二遍遍历:平仓
    for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
    if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    continue;

    // 重新应用过滤条件
    if(FilterMagic != 0 && OrderMagicNumber() != FilterMagic)
    continue;

    if(StringLen(FilterComment) > 0 && StringFind(OrderComment(), FilterComment) == -1)
    continue;

    if(!CloseAllSymbols && OrderSymbol() != Symbol())
    continue;

    bool shouldClose = false;
    if(OrderType() == OP_BUY && CloseBuys)
    shouldClose = true;
    if(OrderType() == OP_SELL && CloseSells)
    shouldClose = true;

    if(shouldClose)
    {
    double closePrice = (OrderType() == OP_BUY) ? Bid : Ask;
    bool result = OrderClose(OrderTicket(), OrderLots(), closePrice, Slippage, clrRed);

    if(result)
    {
    closedCount++;
    Print("已平仓订单 #", OrderTicket(), " | 盈亏: ", OrderProfit() + OrderSwap() + OrderCommission());
    }
    else
    {
    Print("平仓失败 #", OrderTicket(), " 错误码: ", GetLastError());
    }
    }
    }

    Print("=== 一键平仓脚本执行完毕 ===");
    Print("共平仓: ", closedCount, " 个订单");
    Print("总盈亏: ", DoubleToStr(totalProfit, 2));
    MessageBox("已平仓 " + IntegerToString(closedCount) + " 个订单\n总盈亏: " + DoubleToStr(totalProfit, 2), "执行完成", MB_OK);
    }

    //+------------------------------------------------------------------+
    //| 获取订单类型文本 |
    //+------------------------------------------------------------------+
    string OrderTypeToString(int type)
    {
    switch(type)
    {
    case OP_BUY: return "买单";
    case OP_SELL: return "卖单";
    case OP_BUYLIMIT: return "限价买单";
    case OP_SELLLIMIT: return "限价卖单";
    case OP_BUYSTOP: return "止损买单";
    case OP_SELLSTOP: return "止损卖单";
    default: return "未知";
    }
    }
    //+------------------------------------------------------------------+
    ```

    参数详解



    | 参数 | 说明 |
    |------|------|
    | 平所有品种订单 | True=平所有品种订单,False=仅平当前图表品种 |
    | 平买单 | 是否允许平掉买单(OP_BUY) |
    | 平卖单 | 是否允许平掉卖单(OP_SELL) |
    | 魔术号过滤 | 仅平此魔术号的订单(0=全部) |
    | 注释过滤 | 仅平注释中包含此文本的订单(空=全部) |
    | 显示确认对话框 | 平仓前显示盈亏统计确认 |
    | 滑点点数 | 平仓时允许的最大滑点 |

    安装步骤



    1. 在MT4中打开MetaEditor(按F4)
    2. 点击 文件 > 新建 > 脚本
    3. 删除默认代码,粘贴上述完整代码
    4. 点击编译按钮(F7)- 确认无错误
    5. 在MT4导航器中找到该脚本(脚本文件夹下)
    6. 将脚本拖拽到任意图表上
    7. 在弹出的窗口中调整输入参数
    8. 点击确定执行

    使用示例



    示例1: 平掉所有品种的所有订单(带确认)
  • 设置 平所有品种订单 = true

  • 设置 显示确认对话框 = true

  • 拖拽脚本到任意图表


  • 示例2: 仅平当前品种的卖单
  • 设置 平所有品种订单 = false

  • 设置 平买单 = false

  • 设置 平卖单 = true


  • 示例3: 仅平特定EA的订单(魔术号12345)
  • 设置 魔术号过滤 = 12345

  • 设置 注释过滤 = 留空


  • 编译注意事项



  • 需要MT4 build 600或更高版本

  • 脚本使用标准OrderClose函数

  • 对于ECN经纪商,建议将滑点参数增加到50-100

  • 脚本执行后立即结束,不会留在图表上


  • 安全提示



    建议先在模拟账户测试该脚本。确认对话框提供了额外的安全保护。使用魔术号过滤可以避免误平其他EA的订单。

    参考来源



    本脚本为自主编译测试。基于MetaQuotes文档中的标准MQL4订单管理函数。

    *如需更多专业交易工具,包括部分平仓工具、移动止损管理器和自动化风险管理脚本,欢迎查看我们的专业工具合集。*