以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  金字塔软件问题提交  (http://weistock.com/bbs/list.asp?boardid=2)
----  对新逐K模式的困惑  (http://weistock.com/bbs/dispbbs.asp?boardid=2&id=11130)

--  作者:无极无名
--  发布时间:2012/4/17 16:28:23
--  对新逐K模式的困惑

采用刷新最后一根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,而实际情况并非如此,因此我不能理解。


--  作者:rushtaotao
--  发布时间:2012/4/17 16:29:03
--  
客服稍后回复
--  作者:阿火
--  发布时间:2012/4/17 19:11:51
--  

Y的累加条件是not(islastbar) 所以,刷新最后一根K线时Y是不累加的。就一直为269了

X的累加条件是最后一根K线,每执行一次就累加一次,60秒执行120次左右呀。

很容易理解

 

 

当然,个人觉得x:=x+1; 的取值结果应该一直为1才符合本意。跟老大反馈一下

[此贴子已经被作者于2012-4-17 19:14:27编辑过]

--  作者:无极无名
--  发布时间:2012/4/17 20:18:39
--  
以下是引用阿火在2012-4-17 19:11:51的发言:

Y的累加条件是not(islastbar) 所以,刷新最后一根K线时Y是不累加的。就一直为269了

X的累加条件是最后一根K线,每执行一次就累加一次,60秒执行120次左右呀。

很容易理解

 

 

当然,个人觉得x:=x+1; 的取值结果应该一直为1才符合本意。跟老大反馈一下

 

是的,在只刷最后一根K线情况下,Y应该是不累加的,但是实际还是累加了,这是我的困惑。

另外,对于X:=X+1;每刷新一次就执行一次,的确不是本意,本意是每新增一个周期执行一次。

[此贴子已经被作者于2012-4-17 19:14:27编辑过]


--  作者:阿火
--  发布时间:2012/4/17 21:18:43
--  

在只刷最后一根K线情况下,Y应该是不累加的,但是实际还是累加了,这是我的困惑。

 

实际也没有累加啊。一直都是269呀。

在刚加载或者K线走完瞬间,也是从第一根K线开始执行的。执行完毕后才只执行最后一根,所以Y是从1开始一直到269,然后一直都是269,直到K线走完重新计算

[此贴子已经被作者于2012-4-17 21:20:17编辑过]

--  作者:无极无名
--  发布时间:2012/4/17 21:57:24
--  

我今天在盘中看到,在只刷新最后一根K线情况下,Y还是在累加,直到倒数第二个周期等于269,并不是恒定的等于269。

 

按道理,假如我是开盘第81分钟(之前的历史有效数据忽略)加载公式,那么公式完整地从第一根执行到第81根K线,除掉此时的最后一根即第81根,Y:=Y+1被执行了80次,此后由于始终只刷新最后一根K线,那么Y:=Y+1应该始终得不到执行,所以Y应该恒定等于80。但我今天盘中看到的不是这样,每过一个周期,Y依然累加了一次。


--  作者:阿火
--  发布时间:2012/4/17 22:03:46
--  

刚才不是说了嘛,K线走完瞬间是从头到尾重新执行呀

你去好好了解一下执行过程

[此贴子已经被作者于2012-4-17 22:16:46编辑过]

--  作者:无极无名
--  发布时间:2012/4/17 22:25:00
--  

仅刷最后一根K线,当选中逐K线计算模式,并勾选本选项,在图表上加载本公式。当客户端接收到最新一笔行情数据后,在历史 K线上不再重新执行本公式,而只是在最后一根K线上重新计算一次公式(本质是:只在第一次加载公式时在每根历史K线上完整的计算一遍公式,其后就只在最后一根K线上做完整计算了,历史K线上产生的信号一直保留不再随行情更新而变化。)。通过这种方式提高执行效率,避免当行情更新时系统在每根历史K线上都需要做大量重复计算而消耗CPU处理时间。

 

 

以上是对仅刷新最后一根K线模式的标准说明,只说在第一次加载公式时才从头到尾每根K线都计算公式,并没有看出“在刚加载或者K线走完瞬间,也是从第一根K线开始执行的“(阿火语)再者,如果每次K线走完瞬间,还是要从头到尾每根K线计算公式,那这也不是只刷新最后一根呀。

 

当然,实际情况可能是阿火所说的那样。因为无论是否勾选只刷新最后一根K线模式,我测试,Y值的执行计算没有区别。或许是我看花了眼,明天再看看。

[此贴子已经被作者于2012-4-17 22:28:39编辑过]

--  作者:admin
--  发布时间:2012/4/18 1:06:03
--  
以下是引用阿火在2012-4-17 19:11:51的发言:

Y的累加条件是not(islastbar) 所以,刷新最后一根K线时Y是不累加的。就一直为269了

X的累加条件是最后一根K线,每执行一次就累加一次,60秒执行120次左右呀。

很容易理解

 

 

当然,个人觉得x:=x+1; 的取值结果应该一直为1才符合本意。跟老大反馈一下

[此贴子已经被作者于2012-4-17 19:14:27编辑过]

 

没看出来X这个变量有什么问题


--  作者:admin
--  发布时间:2012/4/18 1:32:15
--  

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超全局变量来进行处理