根据品种和 EA 的 ORDER_MAGIC 分析余额/净值图形(基础篇)
按魔法码拆开净值曲线
在 MT5 里跑多个 EA 时,账户净值曲线是混在一起的,看不出哪个策略在拖后腿。把 ORDER_MAGIC 作为过滤维度,就能把同一品种、同一 EA 的成交单独拎出来,重画它的余额/净值走势。 具体做法是在历史回放或实盘统计里,按品种名 + magic number 双条件筛成交。比如 magic=888 的黄金 EA 在 2023 年 Q1 共成交 214 笔,其净值曲线最大回撤 11.3%,而整账户同期回撤只有 8.7%——说明该 EA 是账户波动的主要来源。 这种拆分不依赖第三方插件,MT5 标准报表的导出 CSV 里就带 magic 字段,用 Excel 透视表或 Python 读一遍就能复现。下次怀疑某个 EA 在偷吃利润,先按 magic 切一刀再看图。
「先把账单算清楚再谈界面」
做这套 MT5 分析面板,第一步不是画按钮,而是把账户真实成本结构钉死:每笔佣金的收取方式、库存费(swap)的按日计提规则、以及净利润在扣除这两者后的落点。很多自制 EA 回测漂亮,实盘亏在忽略库存费,尤其贵金属跨周持仓成本可能吃掉 30% 以上的毛利润。 历史余额和净值的还原是核心难点。需要从『持仓』清单出发,用浮动盈利方程反推每个时刻的净值,而不是只信账户历史里的平仓记录。这里有个坑:并非所有交易品种在任意历史时刻都有可用 tick 或报价,强行用缺失数据插值会扭曲浮盈曲线。 处理历史开平仓时,必须按成交时间戳严格排序,再叠加对应品种的实时(或历史回放)价格算浮盈。EA 集成进对话框面板后,正常视图要显示上述指标,交互上允许手动选魔幻数字(magic number)过滤特定策略仓位——这是小调整但直接影响统计口径。 MFE(最大有利偏移)和 MAE(最大不利偏移)的分布图形放在末段做。会计原则很简单:每笔仓位从开仓到平仓,记录价格朝盈利和亏损方向走过的最远峰值。对话框需支持按品种或魔法数修改筛选,否则分布会被无关仓位污染。
◍ 账户内多策略贡献度怎么拆
MetaTrader 5 引入对冲后,单一交易账户内能同时跑多个 EA 或策略,还能整体接入信号服务拿统计。但麻烦在于:图形上看总余额和总净值,根本分不清哪段曲线是谁贡献的。 实战里一个策略盈利、另一个浮亏太常见,两个一抵消,总权益就贴在零轴附近晃。这时候如果不为每个策略单独拉出余额和净值曲线,你连“该不该停掉哪个 EA”都判断不了。 把每套策略的权益轨迹拆开画,是账户内组合交易的第一道可验证动作——开 MT5 用不同 magic number 区分订单,就能在策略测试器或自建脚本里分头统计。外汇与贵金属组合策略叠加杠杆,回撤放大属高风险,拆曲线只是看清风险暴露的起点。
把佣金、库存费和利润拆开看
一笔交易的最终财务结果,其实是三个字段加起来的:成交佣金、收盘时累计的库存费(swap)、以及成交利润。等式就是 结果 = 佣金 + 库存费 + 利润,三者都是 double 类型,从交易历史里用 HistoryDealGetDouble() 按 ID 取。 对应的字段 ID 分别是 DEAL_COMMISSION(佣金)、DEAL_SWAP(库存费)、DEAL_PROFIT(利润)。注意要排除 DEAL_ENTRY_IN 类型的成交,这类建仓流水本身没有财务结果,拉进来会污染汇总。 库存费和利润在账户里都可能带正号或负号,所以总体方程里统一用加法,符号自带方向。下面这段脚本输出能直接说明问题:2017.02.15 一笔 NZDUSD 卖单 0.01 手,swap +0.02、profit +1.52;同日下午 EURUSD 多单里,有的 swap -0.03 但 profit +8.96,也有一笔 swap -0.48 且 profit -21.07。 开 MT5 跑一遍 HistoryDealGetTicket 思路的脚本,把一段时间内的 DEAL_SWAP 和 DEAL_PROFIT 分别求和,就能看清你账户里到底是头寸赚钱还是被隔夜费吃掉了。外汇和贵金属杠杆高,库存费在单边扛单时可能反吞利润,属正常高风险现象。
class="num">4: deal #class="num">36774600 at class="num">2017.02.class="num">15 class="num">10:class="num">17:class="num">50 Entry out, sell vol: class="num">0.01 comm: class="num">0 swap: class="num">0.02 profit: class="num">1.52 NZDUSD.m(order #class="num">47802989, position ID class="num">47770449) class="num">12: deal #class="num">36798157 at class="num">2017.02.class="num">15 class="num">16:class="num">44:class="num">17 Entry out, buy vol: class="num">0.01 comm: class="num">0 swap: -class="num">0.01 profit: class="num">2.98 EURUSD.m(order #class="num">47827771, position ID class="num">47685190) class="num">13: deal #class="num">36798161 at class="num">2017.02.class="num">15 class="num">16:class="num">44:class="num">17 Entry out, buy vol: class="num">0.01 comm: class="num">0 swap: -class="num">0.02 profit: class="num">5.99 EURUSD.m(order #class="num">47827785, position ID class="num">47665575) class="num">14: deal #class="num">36798176 at class="num">2017.02.class="num">15 class="num">16:class="num">44:class="num">17 Entry out, buy vol: class="num">0.01 comm: class="num">0 swap: -class="num">0.02 profit: class="num">5.93 EURUSD.m(order #class="num">47827805, position ID class="num">47605603) class="num">15: deal #class="num">36798185 at class="num">2017.02.class="num">15 class="num">16:class="num">44:class="num">18 Entry out, buy vol: class="num">0.01 comm: class="num">0 swap: -class="num">0.03 profit: class="num">5.98 EURUSD.m(order #class="num">47827821, position ID class="num">47502789) class="num">16: deal #class="num">36798196 at class="num">2017.02.class="num">15 class="num">16:class="num">44:class="num">18 Entry out, buy vol: class="num">0.01 comm: class="num">0 swap: -class="num">0.03 profit: class="num">8.96 EURUSD.m(order #class="num">47827832, position ID class="num">47419515) class="num">17: deal #class="num">36798203 at class="num">2017.02.class="num">15 class="num">16:class="num">44:class="num">18 Entry out, buy vol: class="num">0.01 comm: class="num">0 swap: -class="num">0.06 profit: class="num">8.92 EURUSD.m(order #class="num">47827835, position ID class="num">47130461) class="num">18: deal #class="num">36798212 at class="num">2017.02.class="num">15 class="num">16:class="num">44:class="num">19 Entry out, sell vol: class="num">0.01 comm: class="num">0 swap: -class="num">0.48 profit: -class="num">21.07 EURUSD.m(order #class="num">47827845, position ID class="num">46868574)
「逐笔平掉 0.01 手后的真实账本」
把 MT5 的「交易」标签拉到底,能看到一连串 Entry out 的成交记录:2017.02.15 19:57:57 到 19:57:59 的三秒内,NZDUSD.m 上连续平掉 5 笔 0.01 手空单,成交号 36824799–36824803,单笔净利在 1.52 到 3.07 之间,佣金和 swap 大多为 0,仅后三笔各吃了 0.02 的库存费。 到了 2017.02.16 00:58:41,又出现三笔同品种同手数的平仓(成交号 36832775–36832777),profit 分别为 2.96 / 3.05 / 2.98,swap 已滚到每笔 0.05。这种碎量平仓的痕迹,往往是网格或马丁类策略在逐层退场。 外汇与贵金属属高杠杆品种,这类逐笔微利若叠加滑点或不对称点差,净值曲线可能突然回吐;开 MT5 账户历史搜 position ID 47xxxxxx 可直接核对上面这组数字。