策略胜率与盈亏比统计脚本开发实战:从交易报表到绩效看板
策略胜率与盈亏比统计脚本开发实战:从交易报表到绩效看板
上个月帮一个做黄金的朋友看账户,他信誓旦旦说自己的策略胜率稳定在68%以上。我把MT4导出的交易报表拉到Excel里一算,实际胜率只有41%,盈利因子0.87。问题出在哪?他看的是平台终端「历史记录」里那个粗略的统计,把部分平仓和加仓单的盈亏重复计算了。这件事让我意识到,大多数交易者对自己策略的真实绩效,其实是一笔糊涂账。

MT4/MT5自带的报表够用,但不够细。它不会告诉你连续亏损的最大笔数、不同持仓时长下的胜率分布、或者多空方向各自的盈亏比差异。这些恰恰是判断策略是否还有生命力的关键信号。所以我自己写了一套统计脚本,从原始成交记录出发,重新计算所有核心指标。
先把数据源搞干净
统计脚本的第一步不是算,是取数。MT4里用HistorySelect()配合HistoryDealGetInteger()遍历成交记录,MT5的API更规范,用HistoryDealGetTicket()逐笔读取。关键点在于:必须区分「入仓成交」和「出仓成交」,否则会把一笔完整交易拆成两半来统计。
我的做法是按持仓ID(MT4的DEAL_ORDER或MT5的DEAL_POSITION_ID)分组,把同一持仓的开仓和平仓成交配对。配对逻辑用伪代码表示:
- 遍历所有成交记录,按持仓ID分组
- 每组内按时间排序,第一笔为开仓,最后一笔为平仓
- 计算持仓时长 = 平仓时间 - 开仓时间
- 净盈亏 = 平仓盈亏 + 库存费 + 手续费(MT5需额外加佣金)
这里有个坑:部分平仓会产生多笔出仓成交。我在测试时发现,如果简单取第一笔出仓作为平仓价,持仓时长会严重偏短。正确做法是取最后一笔出仓的时间作为平仓时间,盈亏则累加所有出仓成交。调整后,同一个策略的平均持仓时长从2.1小时修正到6.8小时,完全改变了策略画像。
胜率不是单一数字
很多人把胜率当成一个固定值,实际上它随持仓时长、交易时段、品种波动率都在变。我的脚本会输出三个维度的胜率切片:按持仓时长分桶(小于1小时、1-4小时、4-24小时、超过24小时)、按星期几、按多空方向。
拿一个EUR/USD的日内策略举例,历史数据统计显示:持仓小于1小时的交易胜率52%,持仓超过4小时的胜率骤降到31%。这说明该策略的优势集中在快速获利了结上,一旦扛单就大概率变亏损。如果只看总胜率45%,你会误以为策略平庸,但拆开看,短持仓部分其实是有正期望的。
盈亏比的计算也要分方向。我的脚本会分别统计多单和空单的平均盈利/平均亏损。曾经有个策略多单盈亏比1.8,空单只有0.9,总盈亏比被拉低到1.3。后来把空单过滤掉,整体盈利因子从1.12提升到1.47。这就是统计粒度带来的优化空间。
绩效看板的落地方式
脚本算完数据,输出到一个CSV文件,再用Python的pandas+matplotlib生成看板。为什么不直接在MQL里画图?因为MQL的图表功能太弱,而且每次回测都要重算。我的流程是:MQL脚本负责取数和计算,输出标准CSV;Python负责可视化和长期跟踪。
CSV的字段设计如下:
- 持仓ID、品种、方向、开仓时间、平仓时间、持仓时长(分钟)
- 开仓价、平仓价、手数、净盈亏、库存费、手续费
- 是否部分平仓、最大浮盈、最大浮亏(需从tick数据回溯)
最大浮盈和最大浮亏这两个字段最有价值。它们能告诉你策略的「忍耐成本」——一笔最终盈利的交易,中途最大浮亏是多少。如果平均最大浮亏是平均盈利的2倍,说明策略在持仓过程中承受了过大的心理压力,实盘执行时很容易被手动干预打断。
看板上我会重点盯四个数:盈利因子、最大连续亏损笔数、平均持仓时长、盈亏比。盈利因子低于1.2的策略我不会上实盘,最大连续亏损超过8笔的策略会降低仓位。这些阈值不是拍脑袋定的,是统计了十几个策略的历史分布后取的中位数。
一个关于参数配置的实操细节
脚本里有个参数叫MagicNumberFilter,默认0表示统计所有魔术码。如果你在一个账户上跑多个EA,必须给每个EA分配独立魔术码,统计时按魔术码过滤。我有次忘了设这个参数,把三个策略的交易混在一起算,结果盈利因子看起来有1.6,拆开一看,两个策略在亏钱,全靠一个策略撑着。这种「虚假繁荣」在组合策略里特别常见。
另一个参数是IncludeSwapCommission,默认true。有些平台的库存费在持仓过夜时扣除,但报表里不一定实时显示。如果你做的是隔夜策略,忽略库存费会让盈亏比虚高0.1-0.3。我在Exness的Standard账户上测试时,黄金多单的库存费每天大约-0.8美元/手,一个月下来对盈亏比的影响不可忽略。
至于品种命名差异,XM和Exness的黄金合约后缀不同,XM是GOLD,Exness是XAUUSD,脚本里需要做一个品种映射表,否则统计时会漏掉部分交易。这个映射表建议放在外部配置文件里,方便切换平台时修改。
跑完统计后,如果发现某个策略的盈利因子在最近三个月持续下滑,别急着否定它。先看是不是市场波动率变了——用ATR的均值变化做对比。历史数据显示,趋势策略在低波动率环境下的盈利因子普遍会下降20%-30%,这是策略特性,不是bug。
最后说一条最核心的建议:把统计脚本当成策略的听诊器,定期跑,但别频繁调参。数据是用来理解策略的,不是用来拟合历史的。
免责声明:本文仅代表作者观点,不构成任何投资建议。市场有风险,交易需谨慎。
