Summary: 本文提供完整的MQL4实用脚本源码,可根据固定的每日时间或存款货币的全局利润目标平仓所有持仓。包含完整源码、编译步骤和参数说明。




管理交易风险通常需要在特定时间(如重大新闻前)或达到每日利润目标时平仓所有头寸。此MT4自动平仓脚本同时实现了这两种场景。它轻量、易于修改,非常适合需要一个可靠的自动平仓工具而又不想运行完整EA的交易者。

核心功能


  • 当终端时间达到用户定义的时/分时,平仓所有市价单。

  • 另一种模式:当总浮动盈亏(含库存费/佣金)达到存款货币目标时平仓。

  • 适用于任何交易品种和任何账户类型。

  • 包含确认弹窗和详细的日志信息。


  • 完整MQL4源码


    ```cpp
    //+------------------------------------------------------------------+
    //| Auto_Close_Profit_V1.mq4 |
    //| Generated by AutoCompile AI |
    //| |
    //+------------------------------------------------------------------+
    #property copyright "AutoCompile AI"
    #property link ""
    #property version "1.00"
    #property script_show_inputs

    //--- 模式选择
    enum ENUM_CLOSE_MODE
    {
    CLOSE_BY_TIME, // 按指定时间平仓
    CLOSE_BY_PROFIT // 按利润目标平仓
    };

    //--- 输入参数
    input ENUM_CLOSE_MODE CloseMode = CLOSE_BY_TIME; // 平仓模式
    input int CloseHour = 22; // 平仓小时 (0-23,经纪商时间)
    input int CloseMinute = 0; // 平仓分钟 (0-59)
    input double ProfitTarget = 50.0; // 利润目标(存款货币)
    input bool ShowConfirm = true; // 平仓前显示确认对话框

    //+------------------------------------------------------------------+
    //| 脚本程序启动函数 |
    //+------------------------------------------------------------------+
    void OnStart()
    {
    //--- 等待下一个报价以避免竞态条件
    Sleep(100);

    bool shouldClose = false;
    string reason = "";

    //--- 判断是否满足平仓条件
    if(CloseMode == CLOSE_BY_TIME)
    {
    datetime now = TimeCurrent();
    MqlDateTime dt;
    TimeToStruct(now, dt);
    if(dt.hour >= CloseHour && dt.min >= CloseMinute)
    {
    shouldClose = true;
    reason = StringFormat("已达到时间阈值: %02d:%02d", CloseHour, CloseMinute);
    }
    }
    else // CLOSE_BY_PROFIT
    {
    double totalProfit = CalculateTotalProfit();
    if(totalProfit >= ProfitTarget)
    {
    shouldClose = true;
    reason = StringFormat("已达到利润目标: %.2f %s", totalProfit, AccountInfoString(ACCOUNT_CURRENCY));
    }
    }

    //--- 如果条件满足则执行平仓
    if(shouldClose)
    {
    if(ShowConfirm)
    {
    int answer = MessageBox(StringFormat("平仓所有头寸?\n原因: %s", reason),
    "自动平仓脚本", MB_OKCANCEL | MB_ICONQUESTION);
    if(answer != IDOK)
    {
    Print("用户手动取消。");
    return;
    }
    }
    CloseAllOrders();
    Print("自动平仓已执行: ", reason);
    }
    else
    {
    string modeDesc = (CloseMode == CLOSE_BY_TIME) ? "时间模式" : "利润模式";
    Print("条件未满足 (", modeDesc, ")。脚本将空闲并退出。");
    }
    }

    //+------------------------------------------------------------------+
    //| 计算所有市价单的总盈亏(含库存费) |
    //+------------------------------------------------------------------+
    double CalculateTotalProfit()
    {
    double total = 0.0;
    for(int i=OrdersTotal()-1; i>=0; i--)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
    if(OrderType() == OP_BUY || OrderType() == OP_SELL)
    {
    total += OrderProfit() + OrderSwap() + OrderCommission();
    }
    }
    }
    return total;
    }

    //+------------------------------------------------------------------+
    //| 平仓所有市价单 |
    //+------------------------------------------------------------------+
    void CloseAllOrders()
    {
    int closed = 0;
    int errors = 0;

    for(int i=OrdersTotal()-1; i>=0; i--)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
    int type = OrderType();
    if(type == OP_BUY || type == OP_SELL)
    {
    bool result = false;
    if(type == OP_BUY)
    result = OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrNONE);
    else // OP_SELL
    result = OrderClose(OrderTicket(), OrderLots(), Ask, 3, clrNONE);

    if(result)
    {
    closed++;
    Print("已平仓订单 #", OrderTicket(), " 价格 ", (type==OP_BUY?DoubleToString(Bid,Digits()):DoubleToString(Ask,Digits())));
    }
    else
    {
    errors++;
    Print("平仓订单 #", OrderTicket(), " 失败,错误码: ", GetLastError());
    }
    Sleep(50); // 小延迟以避免经纪商限制
    }
    }
    }

    Print("自动平仓完成。已平仓: ", closed, ",错误: ", errors);
    if(closed > 0 && errors == 0)
    Alert("成功平仓 ", closed, " 个订单。");
    }

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

    如何编译与使用


    1. 将代码保存为 `Auto_Close_Profit_V1.mq4`,放入MT4的 `Scripts` 文件夹。
    2. 使用MetaEditor编译(F7)。应无错误。
    3. 将脚本拖放到图表上。会弹出输入参数对话框。
    4. 选择模式:CLOSE_BY_TIME(例如经纪商时间22:00)或 CLOSE_BY_PROFIT(例如50美元)。
    5. 脚本检查一次条件后即退出。如需持续监控,可使用计划任务或通过辅助EA每隔一分钟重复运行。

    参数说明


  • CloseMode:在基于时间或基于利润的平仓模式之间切换。

  • CloseHour / CloseMinute:经纪商终端时间(非本地电脑时间)。使用24小时制。

  • ProfitTarget:以账户货币(如USD、EUR)为单位的最小总浮动利润目标。包含库存费和佣金。

  • ShowConfirm:平仓前弹出确认对话框。设为 `false` 可实现全自动(如在VPS上运行)。


  • 修改技巧(EA编程入门)


    要改造此实用脚本,您可以:
  • 添加 `extern bool CloseOnLoss = false;` 并反转利润检查以实现止损平仓。

  • 修改为仅平仓特定品种:在 `OrderSelect` 内部检查 `OrderSymbol() == _Symbol`。

  • 转换为循环脚本:添加 `while(!IsStopped()) { ... Sleep(1000); }` 以实现持续监控。


  • 免费EA下载为您学习MQL4编译与修改提供了坚实基础。如需高级多条件风险管理(移动止损、保本止损、部分平仓),请考虑我们的高级版RiskGuard EA套件。订阅以每周获取更多EA源码教程。

    参考来源:AutoCompile AI - 原创MQL4风险管理实用脚本,2025年。
    ```