你会写跨周期调用吗?
跨周期调用实例详解
看到好几个人的帖子写的跨周期调用都犯了“习惯性”错误。例如,在日线公式里,为读取上一天的收盘价,写:
ref(c,1)
为读取上一周的周收盘价,很习惯地就写成:
c1:= ref(c#week,1) ;
错了。(但也并非总错,在某些天可能是对的。*注1)
一般地,ref(x,1)是昨天的x,于是,c1=ref(c#week,1)就是昨天的c#week,所以,如果当前是星期三,c1则是本周星期二所在周的收盘价,星期二和星期三都是本周的,所以应该有相同的周收盘价。(这里假定星期二和星期三都开盘。)
如果你一定要在日线公式里,用c#week来得到上一周的周收盘价c1,应该怎样写呢?
可以这样写:
A:=barslast(weekofyear != ref(weekofyear,1)); *注2
c1:=ref(c#week, A+1);
当然,此时直接写
c1:=ref(c,A+1); *注3
也行。
正确的跨周期调用的写法(读取上周的收盘价、成交量)
1) 建立一个(被调用的)指标公式,例如取名为“zuotian”,其内容是:
{zuotian}
c1:ref(c,1);
v1:ref(v,1);
2) 在主公式里
为了读取上一周的收盘价,写
c1:=zuotian.c1#week; {接收变量名任意,并非一定取名c1}
为了读取上一周的成交量,写
v1:=zuotian.v1#week;
为了读取上一月的收盘价,写
c1:=zuotian.c1#month;
为了读取上一月的成交量,写
v1:=zuotian.v1#month;
为什么要这样? 现以在日线公式里执行 c1:=zuotian.c1#week 为例说明:
按通达信的语法,
D1:=zuotian.c1;
是调用指标公式zuotian,令它在(本股票的)相同的周期(此时是日线)下执行,并把它在当前日K线上的输出C1赋值给本公式的D1变量。即D1将是昨天的收盘价, 因为公式zuotian在日周期下执行,输出的c1=ref(c,1)当然是昨天的close。
现在解释
c1:=zuotian.c1#week;
按通达信语法,该语句的语意是:调用指标公式zuotian,令它在week周期下执行,并把它在(本日K线所对应的)周K线上的输出c1赋值给本公式的c1变量。
公式zuotian在week周期下执行,输出在周K线上的c1=ref(c,1)当然是上一周的close。
注: 本日所对应的周/月是指本日所在的周/月。如果在日线中用 #MIN60跨周期调用,本日所对应的小时K线是指本日的最后交易小时即15:00那条60分钟K线。
如果你愿意,请回答以下问题:
*注1 “但也并非总错,在某些天可能是对的。” 在哪些天是对的?
*注2 本语句这种写法也是不全对。你知道在什么情况下它是错的吗?
*注3 c1:=ref(c,A+1)为什么对? 为得上周的成交量,写v1:=ref(v,A+1)对吗?