# 一键平仓脚本 - 完整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: 平掉所有品种的所有订单(带确认)
示例2: 仅平当前品种的卖单
示例3: 仅平特定EA的订单(魔术号12345)
编译注意事项
安全提示
建议先在模拟账户测试该脚本。确认对话框提供了额外的安全保护。使用魔术号过滤可以避免误平其他EA的订单。
参考来源
本脚本为自主编译测试。基于MetaQuotes文档中的标准MQL4订单管理函数。
*如需更多专业交易工具,包括部分平仓工具、移动止损管理器和自动化风险管理脚本,欢迎查看我们的专业工具合集。*