金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 4844|回复: 7

如何编写PEL代码才能高效率运行

 关闭 [复制链接]

19

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2021-7-14 14:04 | 显示全部楼层 |阅读模式
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

19

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
 楼主| 发表于 2021-7-14 14:07 | 显示全部楼层
本帖最后由 技术009 于 2021-7-15 09:33 编辑

避免重复代码的执行


[PEL] 复制代码
if c>ma(c,5) then buy(holding=0,1,market);
if c<ma(c,5) then sell(1,holding,market);


上面代码中2次用到ma(c,5)。如果某个计算结果是在代码中多次用到,那么我们应该将其定义成一个变量,来避免不必要的重复计算。



上面代码正常优化后,应当如下:
[PEL] 复制代码
ma5:ma(c,5);
if c>ma5 then buy(holding=0,1,market);
if c<ma5 then sell(1,holding,market);
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

19

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
 楼主| 发表于 2021-7-14 14:13 | 显示全部楼层
本帖最后由 技术009 于 2022-7-11 16:53 编辑

优化跨指标引用

可以参考下面几点来检查你的指标引用是否还具有优化的空间:

1.被引用的指标 包含其他不相干的计算
    以最简单的引用ma指标为例。系统自带的ma均线指标是包含四个指标线的,如果我们只是引用其中一个指标线,那么其他几个指标线的计算其实就是完全多余的。在指标代码比较复杂的情况下,可能会造成相当多的冗余计算的。

有2种解决方案:

1)单独新建一个指标,这个指标只包含必要的计算,删除不相干的计算。
2)打开被调用的指标的编辑界面。在查看->公式属性->常规 下勾选“用户函数及跨周期引用函数计算指标值后立即返回”。但是这种方案可能也会受到代码顺序影响,比如我需要调用的变量在第10行,但是前面9行中可能有一些计算是和我需要的变量值完全无关的。但是调用时候他们也会进行计算的。

如果指标代码比较多,为了避免不必要的冗余计算的,客户可以将引用分成多个指标分开进行引用。

2.不是同时跨周期,跨品种的调用
    如果是同时跨周期,跨品种,跨指标,只能使用STKINDI或STKINDIEX来进行调用 。但是如果不是这种情况,仅仅是跨指标调用可以用用户函数进行替换来提高效率。

以下这种情况可以进行替换的情况:

[PEL] 复制代码
//仅跨指标。用户函数是纯粹的模块化编程方式,因此只能跨指标,不可以跨品种和周期。
ma1:#ma.ma1#;//引用ma指标下的ma1


用户函数的语法可以参考在函数说明列表中的说明。

3.只需要特定数据量即可完成运算的调用
当只需要一定数据量即可完成计算的情况下,我们可以指定被引用指标所使用的数据量。
1.使用STKINDIEX 替换STKINDI函数。STKINDIEX 的最后一个参数就是可以设置的数据量。
2.调整公式属性。
参考该贴的三楼https://www.weistock.com/bbs/for ... =744&extra=page%3D1  
3.使用自定义数据功能,自定义数据可以指定刷新的数据量。自定义数据的使用:https://www.weistock.com/bbs/for ... =981&extra=page%3D1

4.被调用指标是逐K模式
在被引用指标可以使用序列模式的前提下,尽量将被引用指标设置为序列运行模式。因为某些情况下序列模式是可以使用多核进行运算的。
关于被调用指标为序列模式的情况可以参考这个帖子里的测试情况:序列模式的运行效率是逐k线模式的10倍 - BBS (weistock.com)





金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

19

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
 楼主| 发表于 2021-7-15 14:57 | 显示全部楼层
本帖最后由 技术009 于 2021-7-23 14:18 编辑

使用IF...THEN 跳过仅最后周期有效的代码

金字塔里某些函数是仅在最后周期有效。


例如下面的模型代码:
[PEL] 复制代码
SENDMAIL(多,'******@qq.com','+5 开多仓','开多仓');
SENDMAIL(多A,'******@qq.com','+5 A平多仓','A平多仓');
SENDMAIL(多B,'******@qq.com','+5 成本价平多仓','成本价平多仓');


这是一段在模型中定期向邮箱发送邮件的代码,由于SENDMAIL是最后一个周期有效的函数,那么我们可以使用IF THEN控制语句直接将非最后周期的运算直接跳过,这样效率也会增加很多的,改进代码如下:
[PEL] 复制代码
IF ISLASTBAR THEN
BEGIN
SENDMAIL(多,'******@qq.com','+5 开多仓','开多仓');
SENDMAIL(多A,'******@qq.com','+5 A平多仓','A平多仓');
SENDMAIL(多B,'******@qq.com','+5 成本价平多仓','成本价平多仓');
END


改进后的代码只会在最后K线是才进入IF 语句中执行邮件发送指令的处理, 省去了系统运行时再挨个判断的麻烦了。


上面的代码还有再进一步优化的空间,因为字符串的计算是非常低效。尽管 "多A"  这个变量没有成立,但是系统解释这行代码时还是会去计算SENDMAIL函数参数里面的字符串的部分,  

比如  '******@qq.com','+5 A平多仓','A平多仓'  这部分的字符串计算。 其实我们可以直接在控制语句中将变量控制好,如果没有条件满足,即便在最后K线也无需再进入邮件指令发送流程, 改进后的代码如下:

[PEL] 复制代码
IF ISLASTBAR  THEN
BEGIN
if 多 then  SENDMAIL(1,'******@qq.com','+5 开多仓','开多仓');
if 多A then SENDMAIL(1,'******@qq.com','+5 A平多仓','A平多仓');
if 多B then SENDMAIL(1,'******@qq.com','+5 成本价平多仓','成本价平多仓');
END



只要我们在平日的代码编写过程中,多好好利用IF THEN控制语句,还是可以节省出大量的计算时间的. 总之所有的运算和判断都尽量安排在必要的时候进行。这样才能规避不必要
的冗余计算。


金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

19

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
 楼主| 发表于 2021-7-15 15:31 | 显示全部楼层
本帖最后由 技术009 于 2021-7-27 10:20 编辑

尽量避免字符串运算

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


我们拿DRAWTEXTEX为例:
DRAWTEXTEX(1,0,0,0, '收盘价'& NUMTOSTR(CLOSE,0));
红色部分的参数 就是这个函数使用中涉及到的字符串计算部分。

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

[PEL] 复制代码
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));

因此总结下来就是字符串计算能避免就避免,如果实在无法避免尽量保证只在其需要的时候进行计算,规避不必要的历史K计算。


金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

19

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
 楼主| 发表于 2021-7-15 15:51 | 显示全部楼层
本帖最后由 技术009 于 2021-7-15 16:07 编辑

尽量规避某些大计算量的函数的使用


例如COST函数


用法:
COST(10),表示10%获利盘的价格是多少,即有10%的持仓量在该价格以下,其余90%在该价格以上,为套牢盘
该函数仅对日线分析周期比较有效。
注意:该函数的计算量较大,不推荐在大数据量K线数据调用时使用。

这种大计算量的函数,往往函数说明中都会明确提到。如果大量使用这种函数,那么会直接影响到指标的计算效率。


金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

19

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
 楼主| 发表于 2021-7-15 16:07 | 显示全部楼层
本帖最后由 技术009 于 2021-7-15 16:14 编辑

尽量避免使用循环语句


金字塔是支持循环语句,但是很多用户使用的时候往往是缺少必要的控制手段的。在循环体内的计算比较复杂或者消耗资源的情况,
或者历史K数量又比较多的情况下,很可能直接会因为迅速占用CPU和内存资源,直接导致崩溃。




金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

19

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
 楼主| 发表于 2021-9-18 10:50 | 显示全部楼层
本帖最后由 技术009 于 2021-9-22 10:50 编辑

选择合适的指标公式模式

6.20版本后的金字塔。此版金字塔对于“仅刷最后一根K线”有机制上的更新,由此前的每根新K开始时重新计算所有历史K线,调整为始终仅在K线数据变化、重启程序化、行情初始时进行重新计算历史信号,因此可以提高程序化交易的执行效率。
基于此我们建议客户:
1.图表和后台程序化选择"仅刷最后一根k线"。可以有效提升运行效率。
2. 自定义数据、股票池等功能下,选择序列模式也可以提高执行效率。


金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 微信登录

本版积分规则

手机版|小黑屋|上海金之塔信息技术有限公司 ( 沪ICP备13035422号 )

GMT+8, 2024-9-19 12:23 , Processed in 0.336706 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表