# 模式说明

金字塔PEL策略公式提供序列计算逐k线计算两种工作模式,它们决定策略在运行过程中的执行方式,如下所示:

序列计算

  • 公式将已经加载的数据,按照公式的逻辑结构,逐行进行解析;整个数据解析过程公式只执行一次。
  • 公式每次刷新计算都是按照公式逐行解析

逐k线计算

  • 公式每次刷新计算都是从加载的第一根K线逐根解析公式,历史每一根k线都会执行一次公式。

# 公式运行模式使用场景

  • 逐K线计算从效率上看比序列计算要低很多,但逐K线计算在做迭代运算等语法处理上非常灵活,应用场景更丰富。
  • 序列计算在运行时,由于只做一次解析效率比较逐K线计算要高,推荐在多数场景下使用,一般常见的技术指标(通达信、博易大师)都采用此模式。
  • 逐K线计算在运行效率上比序列计算低,但是它特有的运行模式在语法上更加灵活,我们可以在每个K线周期上做迭代运算。在公式系统中,使用到图表交易函数Buy、Sell等必须使用逐K线计算模式。

# 控制语句在两种运行模式下的特点

  逐K线计算时,IF Cond Then 、 For等控制语句因运行机制历史每根K都会去执行一次,因此在逐K线计算模式下,可以灵活的实现一些仓位、资金管理。这就是对应我们是图表交易策略时应用逐K线计算模式。

  逐K线计算_仅刷最后一根K线,此计算模式为逐K线计算在效率上的进化版。勾选仅刷最后一根K线后,客户端接收到最新的tick,在历史K线上不会再次逐K执行公式,只会在最新的K线上计算返回,历史K线采用上根K的计算结果。当图表对应的新K线生成后,此模式会再次逐K线计算,历史每根K都执行一次此公式。

  序列模式计算,控制语句Cond只执行一次控制语句解析,对于序列变量,仅用最后一个周期的数据作为Cond的判断条件。所以序列模式下用IF等控制语句应严格注意。例如REF,MA等带有统计性质的函数逐K新计算时无法直接使用在IF语句之中(序列运行模式可以),因为带变量判断的IF语句会在某些周期无法调用这些统计函数而导致计算结果出现错误。逐K线计算此类函数需要做如下示例转换:

//放在if语句之外,保证其在每根k上都能有效计算,之后用于其结果参与条件处理
RD:REF(C,5);
IF C>RD  Then SS:1;
1
2
3

# 运行模式公式示例

为了更好的说明两种运行模式的运行特点,大家可以看如下示例

//用于序列模式下运行的公式:
INPUT:N(5,2,500);      //参数申明
RUNMODE:1;              //运行于序列模式
VARIABLE:I=0,S=0;//变量申明
VAR1:=C;
FOR J=1 TO DATACOUNT DO BEGIN
 S:=S+VAR1[J];
 IF J>=N THEN BEGIN
  IF J>N THEN
    S:=S-VAR1[J-N];
  MA1[J]:S/N;        //实现MA(C,N)
  I:=0;
 END;
END;
1
2
3
4
5
6
7
8
9
10
11
12
13
14

上述公式使用序列模式运行,但是如果在逐K线模式下运行上述公式就会变得异常缓慢,由于金字塔逐K线模式在每个周期上都要执行一遍这样的循环,效率自然就变得非常低了。鉴于金字塔的特点,如果将上述公式改进一下,则可以高效的在序列计算和逐K线计算同时高效运行,公式如下:

INPUT:N(5,2,500);      //参数申明
VARIABLE:I=0,S=0;     //全局变量申明
VAR1:=C; //金字塔下放在这里的变量为序列赋值
 
//为了加快运算速度,只有最后一个周期时才循环计算
IF NOT(ISLASTBAR) THEN EXIT;
FOR J=1 TO DATACOUNT DO BEGIN
 S:=S+VAR1[J];
 IF J>=N THEN BEGIN
  IF J>N THEN
    S:=S-VAR1[J-N];
  MA1[J]:S/N;        //实现MA(C,N)
  I:=0;
 END;
END;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

上述公式中增加了 IF NOT(ISLASTBAR) 判断是否最后一个周期的指令,在逐K线模式下,由于是判断到最后一个周期才执行的下面循环,故效率是非常高的。对于序列模式,由于同样使用了ISLASTBAR控制,故符合控制语句取最后一个数据的特点,所以该公式同时可以在两种模式下得到正确执行。

为了更能说明逐K线的运行特点,计算移动平均线的公式还可以这样写
INPUT:N(5,2,500);      //参数申明
RUNMODE:0;            //工作于 逐K线模式
IF BARPOS <= N THEN //从计算周期开始计算
 EXIT;
  
MA1:C;
FOR J=1 TO N-1 DO
 MA1:=MA1+CLOSE[BARPOS-J];
MA1:=MA1/N;
1
2
3
4
5
6
7
8
9
10

这样的公式即保证了效率,也可以使编写公式的复杂程度大大降低,提高了公式的可读性。

# 总结

  新用户刚开始的时候对两种模式运行选择非常纠结,实际在通常情况下,我们实际不需要去理解两种运行模式的差异。推荐用户在序列计算下运行你的公式系统,因为这样会有很高的执行 效率,只有在序列模式下无法实现您的思想,再考虑使用逐K线计算,因为逐K线可以精细的控制每跟K线周期的动作,所以灵活性较高,可以完成多数序列计算下无法完成的事情。

  1. 您如果是技术指标的话,建议直接用序列计算,尤其是从通达信、博易等手工终端上拷贝来的技术指标,直接用序列模式即可。
  2. 您如果是图表交易策略,建议直接用逐K线计算,因为交易策略后期必然涉及仓位、资金管理等迭代运算。
  3. 您如果是后台策略,建议用序列计算,因为后台大多数情况只计算最新K的情况,序列无法使用思路的情况下再考虑逐K。