持仓限制控制器 - 自动风控系统
实时显示持仓统计,自动监控总手数,达到限制后禁止新开仓并自动平掉超限订单,提供一键平仓、移动止盈、固定止损、挂单价止盈功能
效果示意图 · AI 根据源码绘制,仅示意画了哪些元素,细节以实际运行为准
#property copyright "XAUOF 指标工坊"
#property version "1.40"
#property strict
#include <Trade\Trade.mqh>
//--- 可调参数
input double MaxTotalLots = 10.0; // 最大总手数限制(0=不限制)
input bool AutoCloseLimitExcess = true; // 超限自动平仓(true=自动平,false=仅警告)
input int TrailingStopPoints = 300; // 移动止盈点数(0=不启用)
input int FixedStopLossPoints = 500; // 固定止损点数(用于一键设置)
input int BreakEvenPoints = 200; // 挂单价止盈点数(盈利超过此值移动到开仓价)
input int InitPanelX = 20; // 面板初始左边距(像素)
input int InitPanelY = 30; // 面板初始上边距(像素)
input int PanelWidth = 340; // 面板宽度(像素)
input int PanelHeight = 360; // 面板高度(像素)
input color PanelBgColor = clrDarkSlateGray; // 面板背景色
input color TitleBgColor = clrNavy; // 标题栏背景色
input color TextColor = clrWhite; // 文字颜色
input color BuyColor = clrLime; // 多头数据颜色
input color SellColor = clrRed; // 空头数据颜色
input color ProfitColor = clrGold; // 盈亏数据颜色
input int FontSize = 10; // 字体大小
input int RefreshMS = 500; // 刷新间隔(毫秒)
//--- 全局变量
CTrade trade;
uint lastRefreshTime = 0;
datetime lastCheckTime = 0;
bool trailingStopEnabled = false; // 移动止盈开关
// 面板位置和大小
int panelX, panelY;
int panelW, panelH;
已显示前 35 行,共 1068 行。完整源码仅对 xauusd.team VIP 开放查看与复制。
开通 VIP 查看完整源码作品说明
使用说明
1. 安装方法
- 将代码保存为
PositionLimitController.mq5,放入MQL5/Experts文件夹 - 在 MetaEditor 中编译(F7)
- 在 MT5 图表上拖入该 EA,勾选"允许自动交易"
2. 持仓统计显示(每项单独一行)
面板显示以下信息:
- 多头手数:所有多头持仓的总手数(绿色)
- 多头订单:多头订单数量(绿色)
- 空头手数:所有空头持仓的总手数(红色)
- 空头订单:空头订单数量(红色)
- 总手数:多空合计的总手数(白色)
- 总盈亏:所有持仓的盈亏总和,含隔夜利息(盈利绿色,亏损红色)
- 手数限制警告:实时显示手数限制状态
3. 总手数限制功能
- MaxTotalLots:设置最大总手数(例如 10.0 手)
- AutoCloseLimitExcess:超限是否自动平仓
- true:自动平掉最新的订单直到符合限制
- false:仅警告提示
- 三种状态显示:
- 灰色:正常状态
- 黄色:已使用 80% 以上手数
- 红色:已达到或超过限制
4. 平仓按钮(第一行)
- 一键平仓:关闭当前品种所有持仓(多空都平)
- 一键平多:只关闭所有多头持仓
- 一键平空:只关闭所有空头持仓
所有平仓操作都需要二次确认,防止误操作。
5. 止盈止损按钮(第二行)
- 移动止盈:
- 点击启用/停用移动止盈功能
- 启用后按钮变亮绿色并显示 ●
- 自动追踪价格,持续将止损向有利方向移动
- 移动距离由
TrailingStopPoints参数控制(默认 300 点) - 只会向保护浮盈的方向移动,不会放宽止损
- 固定止损:
- 一键为所有持仓设置固定止损
- 距离开仓价
FixedStopLossPoints点(默认 500 点) - 多单:开仓价 - 500 点
- 空单:开仓价 + 500 点
- 挂单价止盈:
- 将盈利订单的止损移至开仓价(保本)
- 只处理盈利超过
BreakEvenPoints点的订单(默认 200 点) - 锁定利润,避免盈利回吐为亏损
6. 参数设置
- MaxTotalLots:最大总手数限制(0 = 不限制)
- AutoCloseLimitExcess:超限是否自动平仓
- TrailingStopPoints:移动止盈点数(0 = 不启用)
- FixedStopLossPoints:固定止损点数
- BreakEvenPoints:挂单价止盈触发点数
- InitPanelX/Y:面板初始位置
- PanelWidth/Height:面板初始大小
- RefreshMS:刷新间隔(毫秒)
7. 操作提示
- 面板可拖动标题栏移动位置
- 右下角可拖动调整大小
- 所有操作都有日志记录在 MT5 的"专家"选项卡
- 移动止盈启用时会在每个 Tick 自动执行
- 固定止损和挂单价止盈需手动点击执行
8. 注意事项
- 只统计和操作当前图表品种的持仓
- 手数限制功能在
OnTrade()事件中监控,新订单触发时立即检查 - 移动止盈只会向有利方向移动止损,不会放宽
- 挂单价止盈只处理达到盈利阈值且未设置保本的订单
- 所有修改操作都有二次确认对话框,防止误操作
AI 解读根据源码逐行分析写成,供参考,以实际运行为准
这是什么
这是一个为 MT5 设计的持仓管理和风控工具,以面板形式显示当前品种的多空持仓统计(手数、订单数、总盈亏),并能设定总手数上限。当持仓手数超过限制时,EA 自动按开仓时间从新到旧平掉超限订单,防止过度持仓。同时提供一键平仓、移动止盈、固定止损、挂单价止盈等快捷操作,适合需要严格控制风险敞口或同时运行多个策略的交易者。
逻辑原理
持仓统计:每隔 500 毫秒(可调)扫描一次当前品种的所有持仓,分别统计多头手数、空头手数、订单数量和总盈亏(含隔夜利息),在面板上实时显示。
手数限制监控:在每次交易事件(OnTrade)和每秒 Tick 检查时,计算当前总手数。若超过 MaxTotalLots 设定值,根据 AutoCloseLimitExcess 参数决定是仅警告还是自动平仓。自动平仓时,EA 按开仓时间从新到旧排序所有订单,逐个平仓直到手数回到限制以下。
移动止盈:点击按钮启用后,每个 Tick 检查所有持仓,对多单将止损向上移至「当前买价 - TrailingStopPoints 点」,对空单向下移至「当前卖价 + TrailingStopPoints 点」。新止损必须比当前止损更有利且高于(多单)或低于(空单)开仓价,确保只锁定浮盈。
固定止损:点击后一次性为所有持仓设置距离开仓价 FixedStopLossPoints 点的止损(多单在下方,空单在上方)。
挂单价止盈(保本):扫描所有持仓,对盈利超过 BreakEvenPoints 点的订单,将止损移至开仓价,锁定保本。
参数说明
- MaxTotalLots(默认 10.0):允许的最大总手数。设为 0 表示不限制。
- AutoCloseLimitExcess(默认 true):超限时是否自动平仓。false 时只在日志中警告。
- TrailingStopPoints(默认 300):移动止盈的跟踪点数。设为 0 则该功能不可用。
- FixedStopLossPoints(默认 500):一键固定止损距离开仓价的点数。
- BreakEvenPoints(默认 200):触发挂单价止盈的最小盈利点数。
- InitPanelX / InitPanelY(默认 20 / 30):面板初始位置的左上角坐标(像素)。
- PanelWidth / PanelHeight(默认 340 / 360):面板初始宽度和高度(像素),运行时可拖动右下角调整。
- PanelBgColor / TitleBgColor / TextColor / BuyColor / SellColor / ProfitColor:面板和文字的颜色设置。
- FontSize(默认 10):面板文字大小。
- RefreshMS(默认 500):面板刷新间隔,单位毫秒。
怎么用
将代码保存为 .mq5 文件,放入 MT5 的 MQL5/Experts 文件夹,用 MetaEditor 编译后拖到任意图表上(只操作拖入图表对应的品种),勾选"允许自动交易"。面板会显示在图表左上角,拖动标题栏可移动,拖动右下角手柄可调整大小。
- 查看统计:面板实时显示当前品种的多空手数、订单数、总盈亏和手数限制状态(灰色正常,黄色接近限制,红色超限)。
- 一键平仓:点击「一键平仓」「一键平多」「一键平空」按钮,弹窗二次确认后执行。
- 移动止盈:点击「移动止盈」按钮启用(按钮变亮绿色并显示 ●),EA 自动追踪价格调整止损;再次点击停用。
- 固定止损:点击后弹窗确认,为所有持仓设置固定点数止损。
- 挂单价止盈:点击后弹窗确认,对盈利订单将止损移至开仓价。
EA 只统计和操作挂载图表的品种,其他品种不受影响。
适用场景
- 多策略叠加交易:同时运行多个 EA 或手动加仓时,用总手数限制防止仓位失控。
- 日内短线或剥头皮:快速开平仓时,用移动止盈和一键平仓提高操作效率。
- 品种不限:适用于任何 MT5 交易品种,但点数参数需根据品种和周期调整(如外汇、黄金、指数的点值差异大)。
- 周期不限:EA 不依赖 K 线数据,任意周期图表均可使用。
不适合无法容忍自动平仓的场景(如长线持仓、网格策略希望保留所有订单)。若需手动控制每笔平仓,将 AutoCloseLimitExcess 设为 false。
风险提示
- 自动平仓不可逆:启用
AutoCloseLimitExcess后,超限订单会立即被平掉,无法恢复。建议初次使用时先在模拟盘测试限制值是否合理。 - 按时间平仓可能不是最优:代码按开仓时间从新到旧平仓,不考虑盈亏或品种。如果需要按盈亏或其他规则平仓,需修改
CloseExcessPositions函数。 - 移动止盈可能过早平仓:
TrailingStopPoints设置过小会导致价格小幅回撤时触发止损,截断盈利。根据品种波动性和交易周期调整点数(波动大的品种如黄金可能需要更大的跟踪距离)。 - 点数参数需校准:外汇 5 位报价品种(如 EURUSD)的 1 点是 0.00001,4 位品种(如 USDJPY)是 0.01,黄金可能是 0.01 或 0.1。参数中的"点"是 MT5 的 Point 单位,不同品种含义不同,需根据实际报价调整数值。
- 滑点和延迟:一键平仓和自动超限平仓都使用市价单,在快速行情或流动性差的品种上可能产生滑点。
- 仅操作当前品种:EA 只统计和平仓挂载图表的品种,不管理账户内其他品种的持仓。如果需要全账户手数限制,需修改代码去掉品种过滤。
- 不保证订单一定能平:平仓操作可能因网络延迟、经纪商限制、流动性不足等原因失败,代码会在日志中记录失败订单但不会重试。
常见问题
- 这个 EA 会自动开仓吗
- 不会。它只负责监控和管理现有持仓,不会主动开新单。所有开仓由用户手动操作或其他 EA 执行。
- 手数限制功能会限制其他品种吗
- 不会。EA 只统计和限制挂载图表对应品种的持仓,账户中其他品种不受影响。如果需要限制全账户手数,需修改代码去掉 `POSITION_SYMBOL != _Symbol` 的过滤。
- 移动止盈会重绘或取消已设置的止损吗
- 移动止盈只会向保护浮盈的方向移动止损(多单向上,空单向下),不会放宽或取消止损。如果当前止损已经比新计算的更有利,EA 不会修改。
- 默认参数适合什么品种和周期
- 默认值(移动止盈 300 点、固定止损 500 点)以 5 位报价的外汇品种(如 EURUSD)为参考,大致对应 30 / 50 个基点。黄金等波动大的品种需要成倍增加点数,4 位报价品种需要除以 10。周期不限,但日内短线建议缩小点数,长线则放大。
- 超限自动平仓后能恢复订单吗
- 不能。平仓操作不可逆,被平掉的订单无法恢复。建议先在模拟账户测试 MaxTotalLots 和 AutoCloseLimitExcess 的组合,确认符合预期再用于实盘。
Position Limit Controller EA for MT5
An EA that displays real-time position statistics, monitors total lot size, automatically closes excess positions when limits are reached, and provides one-click close, trailing stop, fixed stop-loss, and break-even functions for MT5 multi-strategy risk management.
A short source preview is shown above for visitors; full source, copy and compiled EX5 files are available to VIP members.
基于本作的二次创作1
移动止盈改成追踪止盈;刚才这份代码用 MetaEditor 编译没通过,报了 8 个错误: 第 1 行第 1 列:unexpected end of program 出错的那行代码:// 第 863 行第 1 列:unbalanced parentheses 出错的那行代码:{ 第 142 行第 7 列:undeclared identifier 'UpdatePanel' 出错的那行代码:UpdatePanel(); 第 142 行第 19 列:')' - expression expected 出错的那行代码:UpdatePanel(); 第 521 行第 10 列:undeclared
评论
还没有人评论,来抢个沙发。