以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://222.73.7.161/bbs/index.asp)
--  功能教学汇总区  (http://222.73.7.161/bbs/list.asp?boardid=17)
----  序列模式的运行效率是逐k线模式的10倍  (http://222.73.7.161/bbs/dispbbs.asp?boardid=17&id=172703)

--  作者:独孤求败
--  发布时间:2019/10/30 12:14:13
--  序列模式的运行效率是逐k线模式的10倍

    大家都知道序列模式的运行速度比逐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值公式线便于调试

有关“用户函数 ”功能,请用户参考软件中的函数帮助