Rss & SiteMap

金字塔客服中心 - 专业程序化交易软件提供商 http://www.weistock.com/bbs/

专业程序化软件提供商
共13 条记录, 每页显示 10 条, 页签: [1] [2]
[浏览完整版]

标题:对新逐K模式的困惑

1楼
无极无名 发表于:2012/4/17 16:28:23

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

2楼
rushtaotao 发表于:2012/4/17 16:29:03
客服稍后回复
3楼
阿火 发表于: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编辑过]
4楼
无极无名 发表于: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编辑过]

5楼
阿火 发表于:2012/4/17 21:18:43

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

 

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

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

[此贴子已经被作者于2012-4-17 21:20:17编辑过]
6楼
无极无名 发表于: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依然累加了一次。

7楼
阿火 发表于:2012/4/17 22:03:46

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

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

[此贴子已经被作者于2012-4-17 22:16:46编辑过]
8楼
无极无名 发表于: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编辑过]
9楼
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这个变量有什么问题

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

共13 条记录, 每页显示 10 条, 页签: [1] [2]


Powered By Dvbbs Version 8.3.0
Processed in 0.03516 s, 2 queries.