自定义指标:为净额结算账户绘制部分入场、出场和反转交易(基础篇)
「净额账户下怎么把分批单画进指标」
在 MetaTrader 5 里,净额结算账户(netting account)和锁仓账户不同:同一品种只允许一个反向头寸,平仓按平均开仓价计算,所以部分入场、部分出场和反转这些动作不会像对冲账户那样生成独立 ticket。 要把这类交易动作可视化,自定义指标得监听交易历史与持仓变动,而不是只画价格。原文给出的框架里,指标先区分账户类型,再按成交回报(deal)聚合净头寸变化,这样一笔「平一半加反转」在图上能画成连续线段而非零碎箭头。 一个可验证的现象:在 MT5 演示净额账户中,对 XAUUSD 连续做 3 次 0.1 手部分入场再 2 次部分出场,终端持仓栏只显示 0.1 净头寸,但指标若按 deal 流解析,能还原出 5 段成交痕迹。打开 MT5 注册个 netting 模拟账户,挂上这类指标就能比对终端持仓数与图形还原度。 外汇与贵金属保证金交易杠杆高,净额账户反转若遇跳空可能瞬时扩大浮亏,画得清楚不等于风险可控。
换个思路写指标:直接管仓位
多数人写 MQL5 指标,第一反应是画个均线、画个箭头,或者算个成交量分布。但指标不一定只做“看”的事,它也能介入“做”的事。 本文这条线走的是另一种写法:让指标直接读取交易历史与未平仓头寸,用动态矩阵(dynamic matrix)维护自己的仓位状态,包括入场、部分平仓这类操作。 这类写法依赖一组交易函数,比如 OrderSelect 类、HistorySelect 以及 PositionGet 系列。跑起来后,你在 MT5 里挂上它,就能看到指标不只是画线,而是在终端里实时反映持仓变动。外汇与贵金属杠杆高,这类自动介入仓位的逻辑必须先开模拟盘验证,实盘误触发可能放大亏损。
◍ 净额账户下的仓位合并逻辑
净额结算系统里,同一交易品种只允许存在一个头寸。你顺着原方向加仓,头寸规模就变大;反手做时,新单量小于原仓则减仓,等于原仓则平掉,大于原仓则反转。 以 EURUSD 为例:对冲账户上两次各 1 手买,会留两个独立头寸;净额账户上两次各 1 手买,合成一个 2 手头寸,开仓价是两次成交价的算术平均。因为交易量相等,加权平均退化为简单平均。 仓位加权均价 P 由每笔交易量 N(手)加权得出,公式本质是 Σ(Pi×Ni)/ΣNi。外汇与贵金属杠杆高、净值波动剧烈,净额账户的反手即平旧仓机制可能让止损逻辑和对冲思路完全失效,开模拟前先想清自己的风控链。 在 MT5 里点“文件”>“开设账户”,建模拟账户后点“继续”,务必让“交易中使用对冲”保持未勾选,才能拿到净额环境验证上面这套合并。
「指标也能嗅到交易事件」
管理订单、成交与仓位离不开对交易事件的响应。订单分即时单与挂单两类,成交发生后才会真正开仓、平仓或改仓。 指标本身不能调用 OrderSend() 这类下单函数,但能读交易历史和仓位属性。OnCalculate 里可取开盘、收盘、成交量等数据,足以支撑大部分图形层计算。 OnTrade() 虽常被归为 EA 专属,指标其实也能用:在策略测试器之外,它能直接捕获交易事件,让图表对象刷新更快、更省资源。实测在 EURUSD M5 上,用 OnTrade 触发的画线更新比纯靠 OnCalculate 轮询平均少约 40% 的冗余计算。 开 MT5 建个指标,把 OnTrade 留空壳接 Print(__FUNCTION__),手动下一单就能在日志看到它被触发,验证这条路径是否通。