基于成交历史的交易播放器·综合运用
(3/3)·从对象通信到余额亏损图,把历史回放引擎的最后一公里走通
很多交易者把成交历史导出后就丢进表格里手动翻,既看不到盘口脉络也漏掉细微时点。把数字世界硬转成静态行,等于主动放弃眼睛这 80% 的感知通道。本文顺着前两篇的基础,直接把播放器跑起来看活的历史。
用 OBJ_TREND 建线失败的兜底处理
在 MT5 里用 ObjectCreate 画趋势线,第一个参数传 chart_id,第三个参数 OBJ_TREND 指定对象类型,后面五个 0 分别是时间轴与价格轴的初值占位,建完若返回 false 就必须立刻读错误码。 很多人忽略 ResetLastError 的调用时机:它在 Print 之后执行,作用是清掉线程级错误标记,否则下一次建对象失败会拿到上一次的旧码。外汇与贵金属行情跳空频繁,对象创建可能因图表未刷新而失败,属于高风险环境下的常见异常。 下面这段片段展示了创建趋势线对象时的标准容错写法,可直接拷进 EA 的初始化段验证: if(ObjectCreate(chart_id,name,OBJ_TREND,0,0,0,0,0)) { } else { Print("Failed to create the object"+name+". Error code ",GetLastError()); ResetLastError(); } 顺带一提,ChartOpen 与 ChartTotal 的配合也值得在脚本里跑一遍:先 ChartTotal 抓已有图表 ID 数组,再 ChartOpen 开新图,能避免重复建图导致句柄泄漏。
if(ObjectCreate(chart_id,name,OBJ_TREND,class="num">0,class="num">0,class="num">0,class="num">0,class="num">0)) { } else { Print("Failed to create the object"+name+". Error code ",GetLastError()); ResetLastError(); } } }; class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">void _XXX_::Update() { }; class=class="str">"cmt">//+******************************************************************+ class=class="str">"cmt">//this_is_the_end_point ChartOpen(symbol,period) ChartTotal(arrayID); class=class="str">"cmt">// get the list of charts before opening additional charts CurrentChart(arrayID); class=class="str">"cmt">// get the list of chart for operation
「余额图怎么靠二进制文件避开重算」
余额指标由 CPlay 类对象管理,自带控制方法和按钮。增删指标取决于 name_on_balance 按钮状态,底层调用 MQL5 标准的 IndicatorCreate() 与 ChartIndicatorDelete()。 指标本身不解析交易历史、不算仓位、也不重算利润。它只接收事件,在 OnChartEvent() 里按事件代码跑计算;事件分三类:更新指标、算总余额、算某交易品种余额。用户通过 name_all_balance 按钮状态决定发哪类事件。 关键在数据存储方式。余额图只展示历史,所以切类型或增删指标时没必要重做全部计算。指标读的是 M1 周期算好的二进制文件,再按当前图表周期拆分。二进制文件由 OnInit() 调用的 Balance_Process() 准备;若加了没交易过的品种、缺对应文件,指标会显示两类总余额历史。 拆分 M1 历史时,光有 OHLC 四个价不够,还得知道最高价和最低价谁先出现。Balance_Process() 沿用策略测试器“1 分钟 OHLC”规则:收盘价低于开盘价则第二点为最高价,否则为最低价;第三点同理。最终格式固定为(开盘、第二点、第三点、收盘),依此还原报价并算余额/净值历史。 外汇与贵金属属高风险品种,这类历史还原仅用于复盘概率分布,不预示未来盈亏。 别把正态当圣经 二进制还原依赖“收低于开则先高后低”的单一假设,极端跳空或休市缺口可能让拆分错位,开 MT5 用真实账户历史跑一遍比对最稳。
Ind_Balance_Create(); class=class="str">"cmt">// add the indicator IndicatorDelete(class="type">int ind_total); class=class="str">"cmt">// class="kw">delete the indicator EventIndicators(class="type">bool &prev_state); class=class="str">"cmt">// send an event to the indicator StateIndicators(); class=class="str">"cmt">// state of the indicator, state checks
◍ 画得少,看得清
这套历史回放器本身不是为做测试可视化而生的,但把它当可视化骨架用也完全可行。项目体量摆在那:整套 MQL5 代码约 8000 行,若换 MQL4 从零写同等规模几乎不可想象,重做比新写更现实。 对外汇与贵金属交易者而言,这类工具的价值在减轻策略复盘的人工苦力,但杠杆市场高风险,回放结论只代表历史概率,不预示后续盈亏。 作者把播放器定位成锦标赛备战与分析减负,你下载 zip(player_history_trades.zip 约 113.51 KB)丢进 MT5 跑一遍,比读十遍文档更直感。