采用刷新最后一根K线的逐K模式,搞不太懂。有如下代码测试,来提出我的问题。
IF TIME=OPENTIME(1)+60 THEN //开盘第一分钟初始化X、Y//
BEGIN
X:=0;
Y:=0;
END
IF ISLASTBAR THEN
BEGIN
X:=X+1;
END
IF NOT(ISLASTBAR) THEN
BEGIN
Y:=Y+1;
END
XX:X,LINETHICK0;
YY:Y,LINETHICK0;
在1分钟周期,逐K模式下,
1、XX输出是(0,0,0......0,1)这样一个序列,每一分钟一个值;
2、YY输出的是(1,2,3.......269,269)这样一个序列,每一分钟一个值;
这个不难理解。
但是改成只刷新最后一根K线模式之后,奇怪的事情发生了。
1、XX每分钟输出(1-116),数字可能不准,因为太快,我是目测。
但是可以明白大致每秒刷新两次,每刷新一次就迭代计算一次,直到下一分钟,又从1开始迭代计算,反复循环。
2、YY输出的依然是(1,2,3.......269,269)这样一个序列,每一分钟一个值;
我的问题是:
1、两种模式下,XX的输出为何发生如上变化?
2、两种模式下,YY的输出为何是一样的。我以为,因为只刷新最后一根K线的情况下,
Y:=Y+1应该永远得不到执行(因为该句在非最后一个周期得到执行的控制语句内),因此在盘中,
从加载公式那一刻起,YY应该始终等于0,而实际情况并非如此,因此我不能理解。
Y的累加条件是not(islastbar) 所以,刷新最后一根K线时Y是不累加的。就一直为269了
X的累加条件是最后一根K线,每执行一次就累加一次,60秒执行120次左右呀。
很容易理解
当然,个人觉得x:=x+1; 的取值结果应该一直为1才符合本意。跟老大反馈一下
Y的累加条件是not(islastbar) 所以,刷新最后一根K线时Y是不累加的。就一直为269了
X的累加条件是最后一根K线,每执行一次就累加一次,60秒执行120次左右呀。
很容易理解
当然,个人觉得x:=x+1; 的取值结果应该一直为1才符合本意。跟老大反馈一下
是的,在只刷最后一根K线情况下,Y应该是不累加的,但是实际还是累加了,这是我的困惑。
另外,对于X:=X+1;每刷新一次就执行一次,的确不是本意,本意是每新增一个周期执行一次。
在只刷最后一根K线情况下,Y应该是不累加的,但是实际还是累加了,这是我的困惑。
实际也没有累加啊。一直都是269呀。
在刚加载或者K线走完瞬间,也是从第一根K线开始执行的。执行完毕后才只执行最后一根,所以Y是从1开始一直到269,然后一直都是269,直到K线走完重新计算
我今天在盘中看到,在只刷新最后一根K线情况下,Y还是在累加,直到倒数第二个周期等于269,并不是恒定的等于269。
按道理,假如我是开盘第81分钟(之前的历史有效数据忽略)加载公式,那么公式完整地从第一根执行到第81根K线,除掉此时的最后一根即第81根,Y:=Y+1被执行了80次,此后由于始终只刷新最后一根K线,那么Y:=Y+1应该始终得不到执行,所以Y应该恒定等于80。但我今天盘中看到的不是这样,每过一个周期,Y依然累加了一次。
刚才不是说了嘛,K线走完瞬间是从头到尾重新执行呀
你去好好了解一下执行过程
仅刷最后一根K线,当选中逐K线计算模式,并勾选本选项,在图表上加载本公式。当客户端接收到最新一笔行情数据后,在历史 K线上不再重新执行本公式,而只是在最后一根K线上重新计算一次公式(本质是:只在第一次加载公式时在每根历史K线上完整的计算一遍公式,其后就只在最后一根K线上做完整计算了,历史K线上产生的信号一直保留不再随行情更新而变化。)。通过这种方式提高执行效率,避免当行情更新时系统在每根历史K线上都需要做大量重复计算而消耗CPU处理时间。
以上是对仅刷新最后一根K线模式的标准说明,只说在第一次加载公式时才从头到尾每根K线都计算公式,并没有看出“在刚加载或者K线走完瞬间,也是从第一根K线开始执行的“(阿火语)再者,如果每次K线走完瞬间,还是要从头到尾每根K线计算公式,那这也不是只刷新最后一根呀。
当然,实际情况可能是阿火所说的那样。因为无论是否勾选只刷新最后一根K线模式,我测试,Y值的执行计算没有区别。或许是我看花了眼,明天再看看。
Y的累加条件是not(islastbar) 所以,刷新最后一根K线时Y是不累加的。就一直为269了
X的累加条件是最后一根K线,每执行一次就累加一次,60秒执行120次左右呀。
很容易理解
当然,个人觉得x:=x+1; 的取值结果应该一直为1才符合本意。跟老大反馈一下
没看出来X这个变量有什么问题
IF TIME=OPENTIME(1)+60 THEN //开盘第一分钟初始化X、Y//
BEGIN
X:=0;
Y:=0;
msgout(1,'ddd');
END
IF ISLASTBAR THEN
BEGIN
X:=X+1;
END
随便加个msgout函数调试一下便知,你之前的IF语句根本就没有满足过条件而去初始化,对于没有初始化的变量,金字塔会默认变成GLOBALVARIABLE超全局变量来进行处理