从存在偏移的图表中读取数据
我们的新指标UseDemoAll已基本就绪。我们只需再考虑一个细节。
在从属指标中,部分图表可能通过 PLOT_SHIFT 特性设置了偏移。例如,使用正偏移,时间序列元素将移至未来方向,并显示在索引 0 柱线的右侧。奇怪的是,其索引值为负数。向右移动时,索引值逐渐减小:-1、-2、-3 等。这种寻址方式也会影响CopyBuffer函数。当我们使用第一种形式的 CopyBuffer时,offset 参数设为 0 将指向时间序列中当前时间的元素。但如果时间序列本身向右偏移,我们将获得从第 N 个元素开始的数据,其中 N 为源指标的偏移值。同时,缓冲区中索引 N 右侧的元素将不会填充数据,而是保留原有“垃圾值”。
为演示该问题,让我们从无偏移的指标开始:Awesome Oscillator正好符合这一要求。回想一下,UseDemoAll会将所有值复制到其数组中,虽然由于价格刻度和指标读数不同,这些值在图表上不可见,但我们可以通过Data Window 进行验证。无论将鼠标光标移动到图表的哪个位置,Data Window 中子窗口显示的指标值与UseDemoAll 缓冲区中的值都将完全匹配。例如,在下图中,可以清晰看到,在 16:00 的小时柱线上,两个值均为 0.001797。
UseDemoAll 缓冲区中的 AO 指标数据
现在,在 UseDemoAll设置中,我们选择 iGator (Gator Oscillator) 指标。为简化操作,请清空Gator参数字段,使其使用默认参数构建。此时,可清晰观察到直方图(向前)偏移了 5 根柱线。
未修正未来偏移时 UseDemoAll 缓冲区中的 Gator 指标数据
黑色垂直线标记了 16:00 的小时柱线。但 Data Window中的Gator 指标值与我们从同一指标读取到数组中的值存在差异。黄色 UseDemoAll高亮显示包含垃圾值的缓冲区。
如果我们回溯移动 5 根柱线至 11:00(橙色垂直线标注处)查看数据,会发现Gator指标在 16:00 输出的值出现在该位置。上下直方图的成对正确值分别用绿色和粉色高亮显示。
为解决该问题,我们需要在 UseDemoAll中添加一个输入变量,让用户指定图表偏移量,然后在调用 CopyBuffer 时对其进行修正。
input int IndicatorShift = 0; // Plot Shift
|
遗憾的是,在 MQL5 中无法直接获取第三方指标的 PLOT_SHIFT 特性值。
让我们验证,引入偏移量 5 如何修复 Gator 指标(使用默认设置)的显示问题。
调整未来偏移后 UseDemoAll 缓冲区中的 Gator 指标数据
现在,UseDemoAll在 16:00 柱线处的读数对应于 Gator 在虚拟未来 5 根柱线(21:00 的淡紫色垂直线)处的实际数据。
你可能会疑惑,为什么Gator指标窗口中只显示 2 个缓冲区,而我们的指标有 4 个。这是因为Gator的彩色直方图使用了一个额外的缓冲区进行颜色编码。但实际上只有两种颜色:红色和绿色,我们在数组中看到它们分别为 0 或 1。