大家都知道序列模式的运行速度比逐K线快,那么具体能快多少呢?下面我们来做个实验吧!
以AG00白银连续为例进行测试,1分钟数据,5万根K线计算量,测试公式代码如下:
//逐K线模式测试代码
RUNMODE: 0;//逐k线运行模式
if barpos = 1 then
DEBUGFILE2('D:\2222.TXT','开始',0,1);
RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;
K:SMA(RSV,P1,1);
D:SMA(K,P2,1);
J:3*K-2*D;
if barpos= DATACOUNT then
DEBUGFILE2('D:\2222.TXT','结束',0,1);
打开图表运行完毕后,关闭图表,然后打开 D:\2222.TXT文件,看到日志记录如下:
2019-10-29 16:39:05.772 开始
2019-10-29 16:39:05.928 结束
其中后缀的 .772和 .928是毫秒数, 928-772 = 156 ,得出本次逐K线模式运行的总计算时间为156毫秒
下面我们再将公式的运行模式修改为序列模式
//序列模式测试代码
RUNMODE :1;//序列运行模式
DEBUGFILE('D:\2222.TXT','开始',0);
RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;
K:SMA(RSV,P1,1);
D:SMA(K,P2,1);
J:3*K-2*D;
DEBUGFILE('D:\2222.TXT','结束',0);
打开图表运行完毕后,关闭图表,然后打开 D:\2222.TXT文件,看到日志记录如下:
2019-10-29 16:46:43.338 开始
2019-10-29 16:46:43.352 结束
以同样的计算方法 352-338=14, 得出本次序列模式运行的总计算时间为14毫秒,比逐K线模式速度提高了10倍!
之所以序列模式会比逐K线有如此高的运行效率,主要是还是序列模式的运行机制觉定的,但是这种运行机制也带来无法从K线的时间序列上做精细控制的缺点,因此序列模式主要还是用来做指标分析,后台程序化等。其实图表程序化中用到的逐K线模式其实也可以用到序列模式的,那就是使用金字塔提供的“用户函数”功能,通过直接引用序列模式的公式来提高逐k公式的运行效率,示例如下:
我们继续以KDJ交易系统为例来说明如何对我们的交易系统进行改进,原来的KDJ交易系统代码如下:
RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;
K:SMA(RSV,P1,1);
D:SMA(K,P2,1);
J:3*K-2*D;
手数:=ss;
//交易条件
开多平空条件:=CROSS(J,0);//开多平空条件
开空平多条件:=CROSS(100,J);//开空平多条件
//交易系统
平空:SELLSHORT(开多平空条件,手数,MARKET);
平多:SELL(开空平多条件,手数,MARKET);
开多:BUY(开多平空条件,手数,MARKET);
开空:BUYSHORT(开空平多条件,手数,MARKET);
通过上述公式我们看到,形成KDJ系统的主要算法部分是完全可以单独封装在一个序列公式中的,假设系统自带的KDJ指标就是我们重新封装好的序列公式,那么改进后的代码如下:
J:#KDJ.J(N,P1,P2)#,nodraw;
手数:=ss;
//交易条件
开多平空条件:=CROSS(J,0);//开多平空条件
开空平多条件:=CROSS(100,J);//开空平多条件
//交易系统
平空:SELLSHORT(开多平空条件,手数,MARKET);
平多:SELL(开空平多条件,手数,MARKET);
开多:BUY(开多平空条件,手数,MARKET);
开空:BUYSHORT(开空平多条件,手数,MARKET);
是不是就这么简单?范例代码中的nodraw目的是在图表上输出j值公式线便于调试
有关“用户函数 ”功能,请用户参考软件中的函数帮助