大家好!今天我们来聊聊一个非常实用的工具——OnCalculate参数的价值查看器,特别适合刚入门的指标程序员或者希望深入了解OnCalculate及其他函数的朋友们。
这个指标能够显示以下内容:
1) 最近一次OnCalculate调用的最新值。
2) 上一次OnCalculate调用的前一个值。
3) 第一次执行OnCalculate时的初始值。
4) 每个数组的系列值,无论是as_series还是not_series,并且你可以通过点击显示来更改系列值。
在版本1.10中,我们新增了一个功能,可以动态更改数组是否设置为系列,只需点击文本即可。同时,窗口的条形图和第一个可见条的值也会随着图表的变化而动态更新。ON/OFF显示将指示下次OnCalculate执行时的设置与最近一次执行时的区别。
到了版本1.20,我们又添加了新的功能,让指标可以选择将数组设置为as_series或not_series,只需点击文本即可。现在,指标还会显示时间数组的两端和iMA缓冲区的两端。这些改动旨在让大家清楚地看到as_series和not_series数组之间的区别。此外,显示也会根据需要使用OnTimeEvent处理程序进行刷新,而不是每次报价时刷新,这样可以将OnCalculate的执行时间从300毫秒减少到1毫秒以下。如果你想查看执行的毫秒数,可以在OnCalculate中取消注释该代码。
如图所示,OnCalculate_Values工具显示的值包括三个用‘/’分隔的值,分别是“最近值”、“前一个值”和“初始值”。OnCalculate的值在每次OnCalculate事件时会被设置为'as_series'或'not_series',当设置数组为'ON'时,否则它们将保持终端的默认值。注意数组名称后面的值,用括号表示,它指示该值来自哪个条形图——索引为'0'的值,或“最大索引处的值”。

代码实现了一条单一的指标线,绘制了通过iMA提供的每个条形图的开盘价;目的是提供一个缓冲区以使用“BarsCalculated”函数,并在设置为'as_series'或'not_series'时显示指标。当点击iMA_Val[0]时,只会在点击时将iMA缓冲区设置为as_series或not_series,iMA指标数组不会在每次调用OnCalculate时设置。
一组数组保存每个显示对象(OBJ_LABEL)的属性:

“ArrayGetAsSeries”函数用于确定OnCalculate参数中的数组是时间序列数组还是非时间序列数组,显示将展示结果(As_Series或Not_Series)——显示表明这些数组最初不是序列,或者在设置为序列后,从一次调用到下一次的状态(SetAsSeries函数仅在开启时将其设置为序列,关闭时则恢复到默认值,而不会将'as series'设置为false)。
3个成员的数组ary_OnCalcVals存储了1) 最近值,2) 前一个值,3) 初始值,分别在OnCalculate参数中找到。CopyNewToOld和MoveNewTo函数会将每个显示参数的当前值存入由ary_OnCalcVals提供的历史存储中。