# 一键平仓脚本 - 完整MQL4源码
本文提供一个实用的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",只平欧元美元的所有订单。
编译注意事项
重要提示
先在模拟账户测试。本脚本只平市价单(不含挂单)。如需平挂单,请使用`OrderDelete()`函数。盈亏计算已包含隔夜利息和手续费。
参考来源
自主编译。基于MQL4标准OrderSend和OrderClose函数实现订单平仓逻辑。
*如需更多高级交易工具,包括自动风控、移动止损EA、批量平仓管理器等,欢迎查看我们的精品脚本合集,永久免费更新。*