在 MetaTrader 5 里使用 HedgeTerminal (对冲终端) 面板进行双向交易和仓位对冲, 第一部分·进阶篇
⚖️

在 MetaTrader 5 里使用 HedgeTerminal (对冲终端) 面板进行双向交易和仓位对冲, 第一部分·进阶篇

(2/3)· MT5 原生净持仓模型下,如何借面板实现类 MT4 的双向仓位与对冲管理

含代码示例实战向 第 2/3 篇
很多人在 MT5 里硬套 MT4 的双向开仓习惯,结果净持仓把多空抵消,止损逻辑全乱。以为装个面板就能自动对冲,却没搞清订单配对和 OCO 约束,反而把风险敞口算错。外汇贵金属高杠杆下,这种误用可能直接放大亏损概率。

「给 EA 起别名与终端内部参数边界」

想把 MT5 里一堆魔法数字认清楚,可以在 ExpertsAliases.xml 的 <Expert-Aliases> 节点里写映射:EA 名叫 ExPro 1.1、魔幻数字 123847,配好之后开新仓时 Magic 列直接显示名字。数字和别名数量没有上限,唯一硬条件是魔幻数字彼此不能重复,否则映射会乱。 HedgeTerminal 的 <Other-Settings> 控制的是终端内部运行机制,EA 可用 Set.../Get... 函数实时改值和读值。其中「极端偏离」按最小价格变动单位算:五位报价 EURUSD 是 0.0003 点,RTS 期货指数对应 300 点(步长 10 点)。价格偏太远时平仓或改价会被拒,用来挡不利滑点。 异步模式下的等待超时默认 180 秒。终端发单不阻塞等回执,靠事件序列确认挂单成功;若超时无响应就解锁仓位继续跑。实盘里这限制基本碰不到——多数信号回执在 150–200 毫秒内就回来了。 面板刷新间隔默认 200 毫秒,调低更跟手但吃 CPU;老机器可改到 500 甚至 1000 毫秒,负荷会明显降。别低于 100 毫秒,且刷新频率越高 CPU 占用非线性涨,这间隔也决定了终端动作的离散度。 未实现但规划中的能力里,正则控制台最值得等:在活动/历史表上方输表达式过滤仓位。比如 Symbol 格填 AUDCAD 只显该品种;填 >10106825 | =10106833 显示订单号大于前者或等于后者的仓。Volume 格将来支持输 50% 平半仓、输 1% 按入场价 1% 距离挂止损止盈、输 200p 挂 200 点、输 -0.3 减仓 0.3。外汇与贵金属保证金交易高风险,这类半自动管理功能上线后也先开模拟验证再上实盘。

MQL5 / C++
<!--This settings valid for HedgeTerminal only. For settings HedgeTerminalAPI class="kw">using API function and special parameters.-->
<Hedge-Terminal-Settings>
    <!--This section defines what columns will be showed on the panel.-->
    <Show-Columns>
        <!--You can change the order of columns or comment not class="kw">using columns.-->
        <!--You can change the value of &class="macro">#x27;Width&class="macro">#x27; for a better scaling of visual table.-->
        <!--You can change the value of &class="macro">#x27;Name&class="macro">#x27; to install your column name.-->

        <!--This columns for tab &class="macro">#x27;Active&class="macro">#x27;-->
        <Active-Position>

持仓面板的列定义怎么改

在 MQL5 的自定义持仓面板里,每一列都由一段 Column 节点声明,ID 决定取哪类数据,Width 以像素控制显示宽度。下面这段配置直接决定了交易者在面板里能一眼看到什么。 默认已展开的列包括 CollapsePos.(宽20)、Symbol(宽70)、Entry ID(宽80)、Entry Date(宽110)、Type(宽80)、Vol.(宽30)、EntryPrice(宽50)、TralSL(宽20)、S/L(宽50)、T/P(宽50)、Price(宽50)、Comm.(宽40),合计 12 列、总宽 660 像素左右。 Magic 列被注释掉了,意思是默认不显示 EA 的魔术码。若你跑自动交易且想在面板里直接分辨不同策略的订单,把那段注释取消,Name 显示成 Magic、宽 100 即可。外汇和贵金属波动剧烈,面板列宽太窄容易看错价位,建议按自己屏幕实测微调。

MQL5 / C++
<Column ID="CollapsePosition" Name="CollapsePos." Width="class="num">20"/>
<!-- Unset this comment if you want auto trading and want see name of your expert:
<Column ID="Magic" Name="Magic" Width="class="num">100"/>-->
<Column ID="Symbol" Name="Symbol" Width="class="num">70"/>
<Column ID="EntryID" Name="Entry ID" Width="class="num">80"/>
<Column ID="EntryDate" Name="Entry Date" Width="class="num">110"/>
<Column ID="Type" Name="Type" Width="class="num">80"/>
<Column ID="Volume" Name="Vol." Width="class="num">30"/>
<Column ID="EntryPrice" Name="EntryPrice" Width="class="num">50"/>
<Column ID="TralStopLoss" Name="TralSL" Width="class="num">20"/>
<Column ID="StopLoss" Name="S/L" Width="class="num">50"/>
<Column ID="TakeProfit" Name="T/P" Width="class="num">50"/>
<Column ID="CurrentPrice" Name="Price" Width="class="num">50"/>
<Column ID="Commission" Name="Comm." Width="class="num">40"/>

◍ 历史持仓面板的列定义怎么配

MT5 自定义交易面板里,History-Position 节点管的是「历史」标签页显示哪些列。上面这段配置给出了 9 个列:从 CollapsePos.(宽20)到 Exit Price(宽50),每列用 ID 绑定数据源、Name 控制表头文字、Width 控制像素宽度。 注意那个被注释掉的 Magic 列:默认不显示,因为常规手动交易用不到 EA 的魔法号。如果你跑自动化策略又想在 history 里直接看 EA 名,把那行注释取消即可,宽度设 100 像素比较够用。 外汇和贵金属杠杆高、滑点跳空频繁,历史成交的 Entry/Exit 价格差和实际损益要自己核对,面板只负责展示,不替你算风险。

MQL5 / C++
<History-Position>
  <Column ID="CollapsePosition" Name="CollapsePos." Width="class="num">20"/>
  <!-- Unset this comment if you want auto trading and want see name of your expert:
  <Column ID="Magic" Name="Magic" Width="class="num">100"/>-->
  <Column ID="Symbol" Name="Symbol" Width="class="num">70"/>
  <Column ID="EntryID" Name="Entry ID" Width="class="num">80"/>
  <Column ID="EntryDate" Name="Entry Date" Width="class="num">110"/>
  <Column ID="Type" Name="Type" Width="class="num">40"/>
  <Column ID="EntryPrice" Name="Entry Price" Width="class="num">50"/>
  <Column ID="Volume" Name="Vol." Width="class="num">30"/>
  <Column ID="ExitPrice" Name="Exit Price" Width="class="num">50"/>
</History-Position>

「回测面板的列与执行参数怎么配」

在历史成交面板里,列定义直接决定你事后能复盘到什么粒度。下面这段配置给 ExitDate 留了 110 像素宽、ExitID 80、S/L 和 T/P 各 50,Comm. 压到 40——窄列适合一眼扫过,宽列留给带时间戳的退出原因。 History-Position 块下的 Show-Columns 把 EntryComment 和 ExitComment 都设成 90 宽,意味着开平仓备注能完整显示,而不是被截断成「...」。如果你用 EA 批量挂单,把 Magic 列取消注释(原配置里默认注释掉)就能直接看到哪笔是哪个魔术号干的。 Other-Settings 里 Deviation=30 是允许的报价偏移点数,Timeout 设 180 秒防止下单指令卡死。RefreshRates 的 Milliseconds=200 控制行情刷新频率;注释里明说,机器不够快就把这个值调到 500 甚至 1000,否则可能拖垮终端响应。外汇和贵金属杠杆高,回测参数和实际滑点偏差会放大风险,上线前务必在 MT5 用真实点差跑一遍。

MQL5 / C++
<Column ID="ExitDate" Name="Exit Date" Width="class="num">110"/>
<Column ID="ExitID" Name="Exit ID" Width="class="num">80"/>
<Column ID="StopLoss" Name="S/L" Width="class="num">50"/>
<Column ID="TakeProfit" Name="T/P" Width="class="num">50"/>
<Column ID="Commission" Name="Comm." Width="class="num">40"/>
<Column ID="Profit" Name="Profit" Width="class="num">50"/>
<Column ID="EntryComment" Name="Entry Comment" Width="class="num">90"/>
<Column ID="ExitComment" Name="Exit Comment" Width="class="num">90"/>
</History-Position>
</Show-Columns>
<Other-Settings>
<Deviation Value="class="num">30"/>
<Timeout Seconds="class="num">180"/>
<!-- If your computer is not fast enough - set a value &class="macro">#x27;Milliseconds&class="macro">#x27; greater than class="num">200, such as class="num">500 or class="num">1000. -->
<RefreshRates Milliseconds="class="num">200"/>
</Other-Settings>
</Hedge-Terminal-Settings>
<Column ID="Symbol" Name="Symbol" Width="class="num">70"/>
<Column ID="CollapsePosition" Name="CollapsePos." Width="class="num">20"/>
<!-- 如果您要自动交易并查看 EA 名称, 则取消注释:
<Column ID="Magic" Name="Magic" Width="class="num">100"/>-->

用 XML 给交易面板定字段与超时

MT5 里的自定义交易面板常用一段 XML 描述界面列与执行参数,直接决定你在盯盘时能看到哪些字段、EA 如何挂单。上面这段配置把 Entry ID 列宽设为 80、Magic 列宽 100,并绑定了 Magic=123847 的 ExPro 1.1 专家。 Deviation 设 30 点、Timeout 180 秒、RefreshRates 200 毫秒,意味着报价偏差超过 30 点就拒单,挂单等待上限 3 分钟,行情刷新最快每 0.2 秒一次。外汇与贵金属波动大,这种偏差和超时设定需要根据点差环境手动调,否则可能在跳空时连续拒单。 开 MT5 把这段贴进对应配置文件,改一下 Magic 和 Deviation,就能验证不同滑点容忍度下面板的成交表现。

MQL5 / C++
<!--<Column ID="Symbol" Name="Symbol" Width="class="num">70"/>-->
<Column ID="EntryID" Name="Entry ID" Width="class="num">80"/>
<Column ID="Magic" Name="Magic" Width="class="num">100"/>
<Expert Magic="class="num">123847" Name="ExPro class="num">1.1"></Expert>
<Deviation Value="class="num">30"/>
<Timeout Seconds="class="num">180"/>
<RefreshRates Milliseconds="class="num">200"/>

◍ 本地与全局轮廓如何隔离多EA并发风险

HedgeTerminal 把 MT5 的净持仓环境虚拟成类 MT4 的双向仓位面板,核心靠两套信息通道:全局轮廓走交易服务器,本地轮廓走本机 ActivePositions.xml。前者承载订单、成交、账户等所有人可见的数据,后者只在本机传递阻塞标签与虚拟止盈等私有属性。 当账户里同时跑多个机器人,异步下单极易在「订单发出」到「环境变化被检测到」之间发生重复平仓。HedgeTerminal 让每个副本在发单前先当书写器,往 xml 写阻塞标签,其余副本作监听器周期读文件并锁仓,把冲突挡在本地轮廓内。 效率差异很直观:读写 ActivePositions.xml 一般不到 1 毫秒,而经全局轮廓发单加执行要 150–200 毫秒。绿色本地矩形几乎是一条竖线,蓝色全局耗时是它的百倍以上,这正是分布式高频协作能成立的前提。 本地存储也意味着私有性——你在一台电脑给活动持仓设的虚拟止盈,只存在本机 HistoryPositions.xml 和 ActivePositions.xml,别的终端看不到这个价位。全局数据如平仓动作则跨机一致:某终端平掉双向仓,其他电脑上的副本也同步平掉。 MT5 原生不支持 OCO,净持仓机制又让常规止损止盈无法直接套用双向仓。HedgeTerminal 的折衷是真实 BuyStop/SellStop 扛止损,虚拟止盈仅本机级生效;真止损优先保命,虚止盈失效也不过少赚。若日后有需求,尾随算法也可在真实/虚拟间切换。 即便如此,真 OCO 也救不了部分成交:10 份多仓止盈吃掉 7 份后,链接止损被取消,剩 3 份裸奔。要彻底复刻 MT4 逻辑,每对订单得互调交易量、互认初始单进度、再加双向触发链接——复杂度会反噬可靠性。

让小布替你跑这套
这些诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到双向仓位净敞口与掉期成本估算,把重复劳动交给小布,你专注决策。

常见问题

MT5 核心按净持仓记账,HedgeTerminal 在本地维护配对订单映射,把双向成交虚拟化为独立仓位,两者存储层分离,所以数字会不同。
目前小布盯盘读取的是经纪商成交与持仓流,虚拟化隐藏订单若未上送成交则不可见,但净敞口与掉期仍可按配对规则推算并提示。
原生 MT5 不支持 OCO,HedgeTerminal 用本地虚拟订单模拟,但成交回传前存在竞态,只能倾向降低误触概率,不是绝对隔离。
多因未授予 DLL 调用或图表对象权限,重跑安装三步并勾选对应选项,重启终端通常可恢复。
底行模块按品种掉期率与持仓方向估算隔夜费,多空配对时净掉期倾向接近零,未配对部分才真实计入成本。