Seconds Tick and Range Charts MT5
- 实用工具
-
Quoc Dat Quach
Software engineer with 8 years in fintech and mobile, writing MQL4/MQL5 since 2017. I build Expert Advisors, indicators, trade and risk-management panels and utilities for MT4/MT5, and I trade forex and gold on MT5 myself. - 版本: 1.0
- 激活: 10
适用于 MetaTrader 5 的秒级K线(1 至 30 秒)、跳价K线和区间K线,以自定义交易品种的形式根据经纪商的真实跳价历史构建,并在每个跳价时更新。任何指标、模板或 EA 都可以在该图表上运行。图表上的辅助工具会显示每根K线的真实时间。本 EA 绝不会在图表上交易。
功能
将 EA 加载到经纪商交易品种的图表上。它会:
- 创建一个自定义交易品种,例如 EURUSD_S5,其规格与源交易品种相同
- 根据经纪商的真实跳价分段构建其历史,默认为最近 3 天(在测试中,BTCUSDm 的 3 天数据,即 376,095 个跳价,用时 2.0 秒)
- 打开自定义图表;如果您指定了模板,则应用该模板
- 源交易品种的每个新跳价一到达,就将其添加到自定义图表
- 每秒数次从终端读回每根新K线(在 MetaTrader 5 build 6230 中实测:当没有任何图表或程序读取时,终端根据实时跳价构建的K线可能会丢失;定期读取可防止这种情况)
- 每 60 秒将K线与经纪商的跳价历史核对一次,并统计自定义交易品种为这些K线保存的跳价数
- 在已有的自定义图表上再次启动时(例如终端重启后),先检查历史最后一部分的K线是否全部存在,然后再继续
- 如果某根K线一直不正确,则根据跳价历史、从同一个首个跳价开始重新构建整个自定义交易品种:这是在所有测试中唯一做到精确的修复方式(在 build 6230 中实测:对正在接收实时跳价的自定义交易品种写入单根K线或删除其一部分,可能导致终端丢失其他K线或跳价)
图表类型
- 秒级K线(Seconds bars):1、2、3、4、5、6、10、12、15、20 或 30 秒。一根K线包含一个时间间隔内的跳价。没有跳价的间隔没有K线,就像 M1 上没有跳价的一分钟没有K线一样。
- 跳价K线(Tick bars):每 N 个跳价生成一根新K线。
- 区间K线(Range bars):当下一个价格会使当前K线的最高价与最低价之差大于 N 个点时,开启一根新K线,因此任何K线都不会大于 N 个点。价格跳空时,新K线在新价格处开启;不会为跳空绘制填充K线。
K线按 Bid 价绘制。一根K线的跳价成交量就是其中的跳价数。
可以同时运行多个副本,每个自定义交易品种一个 EA:例如一个图表上是 EURUSD 的 5 秒K线,另一个图表上是 XAUUSD 的 200 点区间K线。同一自定义交易品种的第二个 EA 不会启动,并会在其面板上说明原因。
每个跳价恰好属于一根K线
自定义交易品种接收的是经纪商的跳价本身,而不是K线的副本。在测试中,K线与根据经纪商跳价历史独立重建的结果进行了比较:
- 跳价成交量之和等于源跳价数
- 每根K线的开盘价、最高价、最低价、收盘价和跳价成交量都与重建结果一致
- 对于秒级K线,每个没有K线的间隔内都没有源跳价
在一次同时运行 10 个自定义交易品种的 75 分钟测试中(1、2 和 5 秒K线,20、50 和 100 跳价K线,200 和 1000 点区间K线;共 2,537,558 个跳价),这三项对每个交易品种都成立,包括终端被冻结 2 分钟后重新构建的交易品种。
秒级图表上的空缺:在 BTCUSDm 上(周六约每秒一个跳价),1 秒图表有 81,920 根K线,对应 121,859 个跳价。每个没有K线的 1 秒间隔都与经纪商的跳价进行了核对,其中均没有跳价。秒级图表上的空缺表示经纪商在这段时间内没有发送任何跳价,而不是丢失的K线。
时间轴(请务必阅读)
MetaTrader 5 没有低于一分钟的周期,而自定义图表始终按 M1 时间轴绘制。因此,自定义图表的每根K线占用一个分钟时间槽,图表下方的日期是从 1971 年一月起对这些时间槽的计数:它们不是钟表时间。这是在 MetaTrader 5 图表上存在短于一分钟的K线的唯一方式。
EA 会在自定义图表上添加一个小型辅助工具,用于显示真实时间(本说明中所有“真实时间”均指经纪商的服务器时间,与经纪商交易品种自身图表上的时间相同):
- Last bar:(最新K线)精确到毫秒的开始时间、时长和跳价数
- Cursor bar:(光标处K线)鼠标所指K线的同样信息
- 位于图表自身时间轴上方的第二条时间轴,显示真实时间
- 图表是否在更新:“Live: updated on every tick of EURUSD”、“Building history from real ticks: 40.0%”、“Waiting for the connection to the trade server”、“Checking the bars after the start (up to 60 s)”、“Not updating for 12 s: check the EA on the EURUSD chart”或“Not updating: no EA builds EURUSD_S5 now”
请将自定义图表保持在 M1 周期:一根 M1 K线就是一根秒级、跳价或区间K线。更高的周期会合并多根K线。
速度
在一个终端中同时运行 10 个 EA 和 8 个自定义图表的 75 分钟测试中测得:从源图表上的指标看到一个跳价,到自定义图表上的指标看到该跳价所经过的时间。BTCUSDm 在模拟账户上实时运行。黄金和纳斯达克指数休市(周六),因此它们的图表以周五的真实跳价按其真实节奏输入,最高每秒 61 个跳价。
| 自定义图表 | 每秒跳价数 | 中位数 | 99% 的跳价不超过 | 最慢 |
|---|---|---|---|---|
| BTCUSDm 5 秒K线(实时) | 1 | 0.2 ms | 30 ms | 262 ms |
| BTCUSDm 1 秒K线(实时) | 0.9 | 0.3 ms | 35 ms | 262 ms |
| BTCUSDm 50 跳价K线(实时) | 1 | 0.2 ms | 32 ms | 281 ms |
| 黄金 1 秒K线(回放) | 12 | 0.4 ms | 65 ms | 173 ms |
| 黄金 100 跳价K线(回放) | 12 | 0.3 ms | 111 ms | 140 ms |
| 纳斯达克 5 秒K线(回放) | 61 | 0.6 ms | 40 ms | 1.7 秒 (*) |
| 纳斯达克 1000 点区间K线(回放) | 61 | 0.8 ms | 41 ms | 2.5 秒 (*) |
(*) 终端被冻结 2 分钟之后的 2 分钟内:延迟的跳价同时到达,EA 重新构建了该交易品种。在其他所有时间,最慢的跳价用时 142 ms 和 156 ms。在这 75 分钟内,终端总共使用了约一个 CPU 核心和 680 至 703 MB 内存,最初与最后 10 分钟相比没有变慢。
源图表上的面板在运行时显示 EA 自身每个跳价事件的写入时间:中位数和第 99 百分位数(测试中中位数为 0.03 ms)。
断线、重启和更改
在同一次 75 分钟测试、其后的终端重启以及另一项输入参数更改测试中测得:
- 终端冻结 2 分钟:恢复后,终端报告与交易服务器的连接曾断开并已恢复。在 15 秒内,各 EA 发现 4 个自定义交易品种缺少K线或跳价,并重新构建了它们(每个 0.2 至 2.4 秒)。之后,全部 10 个交易品种都通过了上述检查。未测试持续数分钟的网络中断。
- 更改源图表的周期(从 M1 改为 M5 再改回):EA 从最后一根K线继续,没有重建。
- 更改输入参数(通过带有其他输入参数的模板):EA 从最后一根K线继续。
- 更改图表类型(在运行中的 EA 上,从 5 秒K线改为 50 跳价K线再改回):EA 构建了新的自定义交易品种,并保留旧图表;91 秒后改回 5 秒K线时,它继续使用旧交易品种,并补入这 91 秒的跳价。两个交易品种都通过了上述检查。
- 源图表关闭 3 分钟:辅助工具显示“Not updating: no EA builds BTCUSDm_S1 now”。带 EA 重新打开该图表后,EA 从最后一根K线继续,这 3 分钟的跳价在 0.34 秒后出现在图表上。
- 终端关闭并重新启动 7 次(每次关闭 3 秒至约 1.5 分钟):51 次 EA 启动中有 40 次从各自的最后一根K线继续。另外 11 次发现缺少K线(被终端丢弃,见“限制”),等待了这 60 秒(在最终版本中,辅助工具在此期间显示“Checking the bars after the start”),然后重新构建了各自的交易品种(每个 0.2 至 1.3 秒)。在 7 次启动中的 5 次之后,终端在几分钟后丢弃了未打开图表的那个交易品种的K线;EA 在下一次检查时发现了这一情况并重新构建了该交易品种(有 2 次测试在该检查之前就结束了)。
- 同一自定义交易品种的第二个 EA 没有启动,在终端所有 EA 同时启动的 7 次终端启动中也是如此。
移除 EA 后,自定义交易品种及其图表仍会保留。使用相同设置再次加载 EA,它会先检查此前的K线是否全部存在,然后从最后一根K线继续(如果不全,它会自行重新构建历史)。
输入参数
| 输入参数 | 默认值 | 含义 |
|---|---|---|
| Chart type | Seconds bars | Seconds bars, Tick bars, Range bars |
| Seconds bars: seconds per bar | 5 seconds | 1、2、3、4、5、6、10、12、15、20 或 30 |
| Tick bars: ticks per bar | 100 | 1 至 100,000 |
| Range bars: range of a bar in points | 100 | 源交易品种的点数 |
| Source symbol | 空 | 空 = EA 所加载图表的交易品种 |
| Days of real tick history to build | 3 | 0.01 至 60,在构建自定义交易品种时使用。经纪商的跳价历史可能更短。新值不会重建已有的自定义交易品种:如需重建,请将下一个参数设为 true 一次 |
| Build the history again at start | false | 为 false 时,如果图表类型、其设置和源交易品种都相同,EA 从最后一根K线继续 |
| Custom symbol name | 空 | 空 = 自动命名,例如 EURUSD_S5、EURUSD_T100、EURUSD_R100 |
| Open the custom chart | true | |
| Template for the custom chart | 空 | MQL5\Profiles\Templates 中的模板,在图表打开时应用 |
| Show the real time of the bars on the custom chart | true | 上文所述的辅助工具 |
| Close the custom chart when the EA is removed | false | |
| Tester only: open and close sample positions | true | 见下文 |
策略测试器
MetaTrader 5 不允许在策略测试器中使用自定义交易品种或新图表(实测:两者都会被拒绝,错误 4014)。因此在测试器中,EA 使用相同的代码,根据测试器提供的跳价在内存中构建相同的K线,并在可视化模式下将它们绘制在测试器图表下方的子窗口中。每次运行结束时,它会写出构建了多少根K线,以及每个跳价都恰好属于一根K线。使用“Every tick based on real ticks”模式,可以看到根据经纪商真实跳价构建的K线。
仅在策略测试器中,EA 还会开立并平仓一小批示例持仓,因为 Market 商店会检查 EA 是否进行交易:
- 最小交易量,每次只持有一个持仓,最多 30 个持仓
- 每次开立新持仓前都会检查可用保证金;资金不足时,它会写入一条提示,并且什么都不发送
示例持仓不是交易策略,其结果不能说明任何盈利能力。在真实账户或模拟账户的图表上,EA 绝不会发送、修改或关闭任何订单。
限制(购买前请务必阅读)
- 时间轴计数的是时间槽,而不是钟表时间。参见上文“时间轴”。使用K线时间的指标(交易时段、日枢轴点、时间过滤器)在自定义图表上看到的是时间槽时间,而不是真实时间。
- 自定义交易品种的报价落后一个跳价。实测:当自定义图表上的指标或 EA 因新跳价被调用时,自定义交易品种的K线和跳价历史已经包含该跳价,但自定义交易品种的报价(市场报价、SymbolInfoTick、图表上的 Bid 线)在下一个跳价加入之前显示的仍是上一个跳价。在 MetaTrader 5 build 6230 中尝试了七种规避方法,均无效。自定义图表上的指标或 EA 应从K线读取价格(最后一根K线的收盘价就是最新的跳价)。
- 自定义交易品种无法交易。在自定义图表上运行的 EA 必须针对经纪商交易品种发送订单。
- 仅支持 Bid 图表。经纪商按 Last 价绘制的交易品种(交易所股票和期货)会被拒绝,并在面板上显示提示信息。
- 历史深度取决于经纪商。首次构建会下载经纪商的跳价历史;经纪商只保留有限时间的跳价历史。短周期K线的长历史可能超过终端的“Max bars in chart”设置(工具、选项、图表);此时图表只显示最新的K线。EA 自身的检查最多读回该设置值的一半,因此设置值较低只会让检查查看更少的K线(使用设置值 5,000 和一个约 80,000 根K线的 1 秒图表测试:8 分钟内没有额外的重建)。
- 秒级K线的可用时间有限。时间槽必须保持在过去:1 秒图表从起点开始约有 339 天K线的空间,5 秒图表约有 4.6 年。空间用完时,EA 会自行重新构建历史。
- 使用自定义图表时,请保持 EA 运行。在 build 6230 中实测:当 EA 被移除或终端重启时,终端有时会丢弃自定义交易品种最新部分的K线(最多一个时间槽日,即 1,440 根K线),但保留跳价。此时,在没有 EA 的情况下仍打开的图表会显示空缺。EA 再次启动时会发现这一情况并重新构建该交易品种。重启后,图表可能会显示这样的空缺,最长约一分钟:EA 最多等待 60 秒让终端加载K线(此时辅助工具显示“Checking the bars after the start”),如果K线仍然缺失,则重新构建该交易品种(测试中 0.2 至 1.3 秒)。在测试中,终端还曾在重启几分钟后、EA 运行期间丢弃K线:EA 通过其检查发现了这一情况(每 60 秒一次;在三次测试中,修复发生在测试自身的校验程序看到空缺 74 秒之后)并重新构建了该交易品种;未打开图表的交易品种可能会一直保留空缺,直到该检查或下一次启动。这种情况最常发生在未打开图表的自定义交易品种上。
- 修复会清空并重新填充整个自定义交易品种。当检查发现K线错误或缺失时,EA 会删除该自定义交易品种的跳价和K线,并从同一个首个跳价开始重新写入(测试中 0.2 至 2.4 秒)。在此期间,自定义图表上的指标和 EA 会看到历史消失后又重新出现。
- 每个自定义交易品种只能有一个 EA,并且它会占用所在图表的 EA 位置:请将其加载到源交易品种的一个空闲图表上,而不是交易 EA 所在的图表上。
- 不能在自定义交易品种上使用策略测试器。在 build 6230 中实测:测试器会提供自定义交易品种的跳价,但只构建其部分K线或完全不构建(两次测试中,4,316 根 M1 K线分别只构建了 1,324 根和 0 根),因此需要K线的 EA 无法在其上测试。请在经纪商交易品种上测试此类 EA。
- 测试环境:
- 仅 MetaTrader 5 build 6230,Windows 10,3840 x 2160 屏幕,288 dpi
- 一家零售 CFD 经纪商的模拟账户:BTCUSDm 和 ETHUSDm 实时运行,周五的 XAUUSDm 和 USTECm 跳价按真实节奏回放(周六测试);截图使用 EURUSDm、XAUUSDm 和 USTECm 的历史
- 策略测试器:平台模拟服务器上的净额和对冲模拟账户,EURUSD、GBPUSD、XAUUSD
- 最长测试 75 分钟;未在其他经纪商、真实资金账户或 MQL5 VPS 上测试
- 请先试用免费的策略测试器演示版。演示版仅在测试器的子窗口中显示K线(见上文“策略测试器”);要在真实账户或模拟账户上使用自定义图表,需要完整版。
