Summary: 完整的MT4脚本源码,可按最小盈亏、魔术号、订单类型等条件一键平仓所有持仓和挂单。专业级风控工具,编译即用。




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

本文提供一个专业的MT4实用脚本,支持按高级过滤条件一键平仓所有持仓和删除挂单。相比手动平仓,本脚本可设置盈亏阈值、魔术号过滤、订单类型选择,实现精准风控。

脚本功能特点



支持按最小盈亏点数过滤(正负均可)、按魔术号选择性平仓、分别处理市价单和挂单、执行前弹出确认对话框防止误操作。

完整MQL4代码



```mql4
//+------------------------------------------------------------------+
//| CloseAllOrders.mq4 |
//| 自主编译 版权所有 |
//| |
//+------------------------------------------------------------------+
#property copyright "AI助手"
#property link ""
#property version "1.00"
#property strict
#property show_inputs

//--- 输入参数
input bool CloseMarketOrders = true; // 平仓市价单(多/空)
input bool ClosePendingOrders = true; // 删除挂单(限价/止损)
input int MagicFilter = 0; // 魔术号过滤(0=全部)
input double MinProfitPips = -9999; // 最小盈亏点数(负数允许亏损)
input double MaxProfitPips = 9999; // 最大盈亏点数(在此范围内平仓)
input bool CloseOnlyProfitable = false; // 仅平仓盈利订单
input bool CloseOnlyLoss = false; // 仅平仓亏损订单
input bool ConfirmBeforeClose = true; // 执行前显示确认对话框
input string CloseComment = "Auto Close"; // 平仓备注

//+------------------------------------------------------------------+
//| 脚本主函数 |
//+------------------------------------------------------------------+
void OnStart()
{
// 计算点数乘数
double pipMultiplier = GetPipMultiplier();

// 如启用确认则显示对话框
if(ConfirmBeforeClose)
{
string msg = "确定要平仓所有订单吗?\n\n";
msg += "市价单: " + (CloseMarketOrders ? "是" : "否") + "\n";
msg += "挂单: " + (ClosePendingOrders ? "是" : "否") + "\n";
msg += "魔术号过滤: " + (MagicFilter == 0 ? "全部EA" : string(MagicFilter)) + "\n";
if(CloseOnlyProfitable) msg += "仅平仓盈利持仓\n";
if(CloseOnlyLoss) msg += "仅平仓亏损持仓\n";

int response = MessageBox(msg, "确认平仓所有订单", MB_YESNO | MB_ICONQUESTION);
if(response != IDYES)
{
Print("用户取消执行");
return;
}
}

int closedMarket = 0;
int closedPending = 0;
double totalProfit = 0;

// 平仓市价单
if(CloseMarketOrders)
{
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() != Symbol()) continue;
if(MagicFilter != 0 && OrderMagicNumber() != MagicFilter) continue;
if(OrderType() > OP_SELL) continue; // 跳过挂单
if(!ShouldCloseByProfit(OrderProfit(), OrderOpenPrice(), OrderType())) continue;

bool closed = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 30, clrRed);
if(closed)
{
closedMarket++;
totalProfit += OrderProfit();
Print("已平仓市价单 #", OrderTicket(), " | 盈亏: ", OrderProfit());
}
else
{
Print("平仓失败 #", OrderTicket(), " | 错误码: ", GetLastError());
}
}
}
}

// 删除挂单
if(ClosePendingOrders)
{
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() != Symbol()) continue;
if(MagicFilter != 0 && OrderMagicNumber() != MagicFilter) continue;
if(OrderType() <= OP_SELL) continue; // 跳过市价单

bool deleted = OrderDelete(OrderTicket(), clrRed);
if(deleted)
{
closedPending++;
Print("已删除挂单 #", OrderTicket());
}
else
{
Print("删除失败 #", OrderTicket(), " | 错误码: ", GetLastError());
}
}
}
}

// 输出汇总报告
Print("========== 平仓汇总 ==========");
Print("市价单平仓数量: ", closedMarket);
Print("挂单删除数量: ", closedPending);
Print("平仓总盈亏: ", totalProfit);
Print("==============================");

if(closedMarket > 0 || closedPending > 0)
{
MessageBox("已平仓 " + string(closedMarket) + " 笔市价单\n" +
"已删除 " + string(closedPending) + " 笔挂单\n" +
"总盈亏: " + DoubleToStr(totalProfit, 2),
"平仓完成", MB_OK | MB_ICONINFORMATION);
}
else
{
MessageBox("未找到符合过滤条件的订单", "无订单平仓", MB_OK | MB_ICONINFORMATION);
}
}

//+------------------------------------------------------------------+
//| 根据盈亏过滤判断是否平仓 |
//+------------------------------------------------------------------+
bool ShouldCloseByProfit(double orderProfit, double openPrice, int orderType)
{
if(CloseOnlyProfitable && orderProfit <= 0)
return false;
if(CloseOnlyLoss && orderProfit >= 0)
return false;

// 将盈亏转换为点数进行比较
double profitPips = ProfitToPips(orderProfit, openPrice, orderType);

if(profitPips < MinProfitPips)
return false;
if(profitPips > MaxProfitPips)
return false;

return true;
}

//+------------------------------------------------------------------+
//| 将美元盈亏转换为点数 |
//+------------------------------------------------------------------+
double ProfitToPips(double profit, double openPrice, int orderType)
{
double pipValue = MarketInfo(Symbol(), MODE_TICKVALUE);
double point = Point * 10;

if(pipValue == 0) return 0;

double pips = profit / pipValue;
return NormalizeDouble(pips, 1);
}

//+------------------------------------------------------------------+
//| 获取点数乘数(适配5位报价) |
//+------------------------------------------------------------------+
double GetPipMultiplier()
{
int digits = (int)MarketInfo(Symbol(), MODE_DIGITS);
if(digits == 5 || digits == 3)
return 10;
else
return 1;
}

//+------------------------------------------------------------------+
//| 计算指定订单的盈亏点数 |
//+------------------------------------------------------------------+
double CalculateProfitPips(int ticket)
{
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
{
double openPrice = OrderOpenPrice();
double closePrice = OrderClosePrice();
int orderType = OrderType();
double pipMultiplier = GetPipMultiplier();

if(orderType == OP_BUY)
{
return (closePrice - openPrice) / Point / pipMultiplier;
}
else if(orderType == OP_SELL)
{
return (openPrice - closePrice) / Point / pipMultiplier;
}
}
return 0;
}
//+------------------------------------------------------------------+
```

参数详解



| 参数 | 说明 |
|------|------|
| 平仓市价单 | 平仓所有已成交的多单和空单 |
| 删除挂单 | 删除所有未成交的限价单和止损单 |
| 魔术号过滤 | 仅平仓指定EA的订单(0=全部) |
| 最小盈亏点数 | 平仓所需的最小盈亏点数(负数允许亏损) |
| 最大盈亏点数 | 平仓允许的最大盈亏点数(上限) |
| 仅平仓盈利订单 | 为true时只平仓盈利的单子 |
| 仅平仓亏损订单 | 为true时只平仓亏损的单子 |
| 执行前确认 | 执行前弹出确认对话框 |
| 平仓备注 | 自定义备注信息 |

安装与使用说明



1. 复制代码到MT4的MetaEditor(按F4)
2. 文件 > 新建 > 脚本 > 下一步 > 完成
3. 粘贴代码,替换默认内容
4. 点击编译(F7)- 确保0错误
5. 将脚本从导航器拖动到任意图表
6. 在弹出的对话框中调整参数
7. 确认执行

使用示例



  • 仅平仓亏损单:设置仅平仓亏损订单=true,仅平仓盈利订单=false

  • 仅平仓盈利超过20点的单子:设置最小盈亏点数=20,最大盈亏点数=9999

  • 仅平仓指定EA的订单:设置魔术号过滤=你的EA魔术号

  • 紧急全部平仓:所有参数保持默认直接运行


  • 编译修改技巧



  • 脚本必须保存为.mq4文件并放在Scripts文件夹

  • 编译时确保`#property strict`已启用

  • 先在模拟账户测试

  • 脚本仅对当前图表品种生效


  • 安全提示



    在实盘交易前务必在模拟账户测试本脚本。确认对话框可防止误执行,但确认前请仔细核对过滤条件。

    参考来源



    本文脚本源码为自主编译测试。脚本结构遵循标准MQL4实用脚本规范。

    *如需更多专业交易工具,包括自动止盈器、移动止损管理器和多周期分析工具,欢迎查看我们的专业脚本合集,附赠终身使用权限。*