管理交易风险通常需要在特定时间(如重大新闻前)或达到每日利润目标时平仓所有头寸。此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每隔一分钟重复运行。
参数说明
修改技巧(EA编程入门)
要改造此实用脚本,您可以:
此免费EA下载为您学习MQL4编译与修改提供了坚实基础。如需高级多条件风险管理(移动止损、保本止损、部分平仓),请考虑我们的高级版RiskGuard EA套件。订阅以每周获取更多EA源码教程。
参考来源:AutoCompile AI - 原创MQL4风险管理实用脚本,2025年。
```