欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件新手乐园 → 有关PEL编程时,若干注意效率问题的汇总,用户必看

   

欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。    


  共有17636人关注过本帖树形打印复制链接

主题:有关PEL编程时,若干注意效率问题的汇总,用户必看

帅哥哟,离线,有人找我吗?
admin
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:7302 积分:32559 威望:1000 精华:45 注册:2003/12/30 16:34:32
有关PEL编程时,若干注意效率问题的汇总,用户必看  发帖心情 Post By:2015/1/10 23:23:34 [只看该作者]

     有关软件使用时的效率问题已经是大家所遇到的最头疼的问题了, 除了软件在运行时的一些设置,我们在编写PEL代码时也要特别注重执行效率,这样才能写出高效运行的模型. 有关之前讨论的软件设置,大家可以参考

通过设置提高金字塔软件的运行效率

http://www.weistock.com/bbs/dispbbs.asp?boardid=4&Id=3286 一贴.

 

下面我们将着重介绍PEL代码编写时该注意的问题.

 

注意一, 代码的重复执行

     在编程时可能习惯了复制;粘贴等操作习惯,因此遇到需要重复执行的代码或者是函数时,采取这种办法可以加快我们的编程速度,但是这么做编程效率提升了,运行效率确下降了,本该执行一遍的代码,却被重复的执行了很多遍,如果代码里这种情况很多,那么势必导致整个软件运行效率的下降,我们举例来说:

一个简单的例子:

ENTERLONG:CROSS(C,MA(5,10));

EXITLONG:CROSS(MA(5,10),C);

通过上面的语句,我们看到了,MA(5,10)其实是被连续使用了两次,这样的重复执行函数调用,必然会带来不必要的运算开支。改进方法如下:

MA5:=MA(5,10);

ENTERLONG:CROSS(C,MA5);

EXITLONG:CROSS(MA5,C);

通过中间变量MA5,保存函数调用结果,通过重复使用内部变量MA5,达到提高效率的目的。


注意二,字符串的运算是效率很低的

     字符串的运算是比较消耗资源的一种运算, 我们在使用中应该尽量的注意它的效率

例如SENDMAIL和DRAWTEXTEX或者PLAYSOUND等这类输出字符串类的函数,我们拿DRAWTEXTEX为例;

DRAWTEXTEX(1,0,0,0, '收盘价'& NUMTOSTR(CLOSE,0));

K线模式下,虽然DRAWTEXTEX只在最后一根K线下才有效,但是DRAWTEXTEX的'收盘价'& NUMTOSTR(CLOSE,0) 参数是每根K线都被解释执行的, 因为参数有可能包含MA等统计类函数,因此系统只能每根周期都去解释执行这个参数,造成了系统运行时的不必要的资源浪费, 解决方案是利用IF THEN控制语句来控制, 让他只在最后K线才去执行DRAWTEXTEX函数,这样函数的参数也就挡在控制语句之外节省运算时间了.代码如下:

IF ISLASTBAR THEN

BEGIN

       DRAWTEXTEX(1,0,0,0, '收盘价'& NUMTOSTR(CLOSE,0));

END;

在序列模式下, 由于函数本身就只执行一次,因此不需要加控制语句,但是由于前面范例中我们的字符串参数涉及到字符串相加拼接的运算,加上CLOSE是序列函数,系统会生成整个K线周期的所有字符串数据,而我们实际上只使用最后一根K线的数据,这样的计算带来很大的浪费,解决方案是将CLOSE转换成单值数据,减小计算量, 代码如下:

DRAWTEXTEX(1,0,0,0, '收盘价'& NUMTOSTR(CONST(CLOSE),0));


注意三, 使用IF THEN 控制语句跳开多行语句可提高效率

例如下面的模型代码:


SENDMAIL(多,'******@qq.com','+5 开多仓','开多仓');

SENDMAIL(多A,'******@qq.com','+5 A平多仓','A平多仓');

SENDMAIL(多B,'******@qq.com','+5 成本价平多仓','成本价平多仓');

SENDMAIL(多D,'******@qq.com','15:10平多仓','15:10平多仓');

SENDMAIL(多E,'******@qq.com','+5 1/2平多仓','1/2平多仓');

SENDMAIL(多F,'******@qq.com','+5 赚5%平多仓','赚5%平多仓');

这是一段在模型中定期向邮箱发送邮件的代码,由于SENDMAIL是最后一个周期有效的函数,那么我们可以使用IF THEN控制语句直接将非最后周期的运算直接跳过,这样效率也会增加很多的,改进代码如下:

IF ISLASTBAR THEN

BEGIN

       SENDMAIL(多,'******@qq.com','+5 开多仓','开多仓');

SENDMAIL(多A,'******@qq.com','+5 A平多仓','A平多仓');

SENDMAIL(多B,'******@qq.com','+5 成本价平多仓','成本价平多仓');

SENDMAIL(多D,'******@qq.com','15:10平多仓','15:10平多仓');

SENDMAIL(多E,'******@qq.com','+5 1/2平多仓','1/2平多仓');

SENDMAIL(多F,'******@qq.com','+5 赚5%平多仓','赚5%平多仓');

END;

改进后的代码只会在最后K线是才进入IF 语句中执行邮件发送指令的处理, 省去了系统运行时再挨个判断的麻烦了, 当然上面的代码还有再进一步优化的必要,因为前面第二个注意事项中我们已经提到了,尽管多A这个变量没有成立,但是系统解释这行代码时还是会去计算,'******@qq.com','+5 A平多仓','A平多仓' 这部分的字符串计算参数, 其实我们可以直接在上面的控制语句中将变量控制好,如果没有条件满足,即便在最后K线也无需再进入邮件指令发送流程, 改进后的代码如下:

IF ISLASTBAR AND (多 OR多A OR多B OR多D OR多E OR多F) THEN

BEGIN

       SENDMAIL(多,'******@qq.com','+5 开多仓','开多仓');

SENDMAIL(多A,'******@qq.com','+5 A平多仓','A平多仓');

SENDMAIL(多B,'******@qq.com','+5 成本价平多仓','成本价平多仓');

SENDMAIL(多D,'******@qq.com','15:10平多仓','15:10平多仓');

SENDMAIL(多E,'******@qq.com','+5 1/2平多仓','1/2平多仓');

SENDMAIL(多F,'******@qq.com','+5 赚5%平多仓','赚5%平多仓');

END;

只要我们在平日的代码编写过程中,多好好利用IF THEN控制语句,还是可以节省出大量的计算时间的.


注意四, 跨周期引用是效率很低的

       我们在代码中应该尽量避免使用跨周期引用这样的编程操作, 如果确实需要大量使用,用户可以考虑使用自定义数据功能在外部统计跨周期数据,然后PEL直接引用计算结果,这样可以大大提高跨周期引用的效率, 可参考

使用金字塔的自定义数据功能来加强改善跨周期引用指标的效率

http://www.weistock.com/bbs/dispbbs.asp?boardid=4&Id=10547

       对于需要进行跨周期指标引用的用户来说,可以通过下面几点来检查你的引用指标看是否还具有优化的空间:

   1,精简被引用指标的代码,删减不必要的计算语句,比如我们需要引用系统自带的MA指标的60天均线指标线 MYVAL:= "MA.MA4#DAY"(5,10,20,60); 引用第4根MA4的指标线,如果我们打开系统自带的MA均线指标的话大家是可以看到,上述的公式只是引用第4根指标线MA4,实际前面3行指标线是不需要的,等于说浪费了CPU的资源,增加计算时间,针对上述MA均线指标的引用,我们建议2个处理方案:

     方案1:新建一个新的指标,删除多余的3个指标线,只留下MA4指标线,比如新建一个MYMA均线指标,然后这样引用:MYVAL:= "MYMA.MA4#DAY"(60);

     方案2:打开MA自带指标,公式属性->常规选项卡->勾选“用户函数及跨周期引用函数计算指标值后立即返回”,然后这样引用MYVAL:= "MA.MA1#DAY"(60); 置MA1均线指标参数为60,忽略其他余下的公式计算。

       综上所述,我们只是用MA均线做范例,便于大家理解其中的原理,如果我们就是使用这样简单的MA公式引用,这么改进其实并不会有太多效率提升,但是实际上我们发现很多用户为了管理方便或者图省事,把许多不同用处或者功能的指标都放在一个指标里,然后分别去引用其中的指标线,这样做势必就会带来大量的无效代码运行,拖慢整个跨周期引用的工作效率。

    2,使用用户函数模式调用,若用户使用的指标调用只是一种模块化编程需要,而其中不涉及任何跨周期需求,那么金字塔的3.4版已经增加了用户函数功能,用户可以直接使用该功能代替以往的跨周期引用,调用格式为:#用户函数.指标线(参数)#,例如:MYVAL:= #MYMA.MA4(60)#;用户函数的调用模式可以节省大量的跨周期引用所需的额外数据处理时间,效率也将提升许多,同时内存消耗也很少。

    3,尽量将被引用指标设置为序列运行模式,序列模式可以有更高效的处理速度及内存占用,即便在逐K线模式下运行的公式也是可以引用序列模式下的指标公式的哦。

 

注意五,尽可能使用序列模式

       对于非交易系统公式,图表上尽可能使用序列模式可以最大化提高效率。如果是后台程序化交易,使用序列模式的交易系统可以最大化体现后台的优势。参考 序列模式的运行效率是逐k线模式的10倍 


....未完待续, 后面会不断进行添加

[此贴子已经被作者于2020/1/3 11:00:58编辑过]

 回到顶部