以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  金字塔软件问题提交  (http://weistock.com/bbs/list.asp?boardid=2)
----  解盘函数EXPLAIN有严重的性能问题  (http://weistock.com/bbs/dispbbs.asp?boardid=2&id=71604)

--  作者:liujam
--  发布时间:2014/11/2 12:14:50
--  解盘函数EXPLAIN有严重的性能问题
不好意思,用了严重两个字,因为标题要亮才行。

我是比较传统的用户,依赖技术指标在实盘中的指导,所以自编的公式里面,有大量的解盘信息。我编好的公式也会给一些年纪比较大的老年人朋友做操作参考,所以电脑解盘功非常实用和重要。

我使用金字塔有一段时间了,感觉还是非常不错的,就是解盘函数EXPLAIN的性能问题非常突出,需要进行改善,要不然开盘时间基本无法使用(我以前使用的是另一款软件,最近才迁移到金字塔)。

下面是临时写的一个测试代码:

INPUT:N(10,1,50,1);

MA1:EMA(C,N);
MA2:EMA(C,N*2);
MA3:EMA(C,N*4);
MA4:EMA(C,N*5);
MA5:EMA(C,N*6);

EXPLAIN(C>REF(C,1),\'MA1值: \'+ NUMTOSTR(MA1,3)),COLORWHITE;
EXPLAIN(C>REF(C,1),\'MA2值: \'+ NUMTOSTR(MA2,3)),COLORWHITE;
EXPLAIN(C>REF(C,1),\'MA3值: \'+ NUMTOSTR(MA3,3)),COLORWHITE;
EXPLAIN(C>REF(C,1),\'MA4值: \'+ NUMTOSTR(MA4,3)),COLORWHITE;
EXPLAIN(C>REF(C,1),\'MA5值: \'+ NUMTOSTR(MA5,3)),COLORWHITE;
EXPLAIN(C<REF(C,1),\'MA6值: \'+ NUMTOSTR(MA1+MA5,3)),COLORWHITE;

EXPLAIN(C>REF(C,1),\'MA1值: \'+ NUMTOSTR(MA1,3)),COLORWHITE;
EXPLAIN(C>REF(C,1),\'MA2值: \'+ NUMTOSTR(MA2,3)),COLORWHITE;
EXPLAIN(C>REF(C,1),\'MA3值: \'+ NUMTOSTR(MA3,3)),COLORWHITE;
EXPLAIN(C>REF(C,1),\'MA4值: \'+ NUMTOSTR(MA4,3)),COLORWHITE;
EXPLAIN(C>REF(C,1),\'MA5值: \'+ NUMTOSTR(MA5,3)),COLORWHITE;
EXPLAIN(C<REF(C,1),\'MA6值: \'+ NUMTOSTR(MA1+MA5,3)),COLORWHITE;

EXPLAIN(C>REF(C,1),\'MA1值: \'+ NUMTOSTR(MA1,3)),COLORWHITE;
EXPLAIN(C>REF(C,1),\'MA2值: \'+ NUMTOSTR(MA2,3)),COLORWHITE;
EXPLAIN(C>REF(C,1),\'MA3值: \'+ NUMTOSTR(MA3,3)),COLORWHITE;
EXPLAIN(C>REF(C,1),\'MA4值: \'+ NUMTOSTR(MA4,3)),COLORWHITE;
EXPLAIN(C>REF(C,1),\'MA5值: \'+ NUMTOSTR(MA5,3)),COLORWHITE;
EXPLAIN(C<REF(C,1),\'MA6值: \'+ NUMTOSTR(MA1+MA5,3)),COLORWHITE;


软件运行环境如下:
1.日线周期下副图指标中调用;
2.日线周期下载入K线2400根;(图标数据使用设置->勾选"限制该窗格中数据使用量为[2400]根K线");
3.测试品种:螺纹纲连续+向前复权模式;

图片点击可在新窗口打开查看此主题相关图片如下:cut.png
图片点击可在新窗口打开查看

电脑硬件环境如下:
1.CPU I5 4200U(4核);
2.内存 DDR3 8G;
3.硬盘 SSD 128G;

主要存在的问题就是我说的性能问题,只要是开盘时间,或者是调节参数时,都会发现异常卡顿!

图片点击可在新窗口打开查看此主题相关图片如下:cut2.gif
图片点击可在新窗口打开查看

我个人尝试与建议的解决方案:

1、严格控制K线载入的数量,可以有效解决CPU过高的卡顿问题。但这只是治标不治本,毕竟日K线默认显示最近3-5年会比较方便些,缩短至几十根有点太少了;

2、从公式中删除调解盘函数EXPLAIN的代码,公式会飞速起来,毫无卡顿。但这样就失去解盘了。

3、改进解盘函数的性能。这是我推荐的方式,我发现整个公式卡顿,是解盘函数EXPLAIN导致的,而且我发现,只要是在EXPLAIN中使用了字符串转换函数NUMTOSTR就会非常卡。我之前使用的那款软件,没有任何卡顿,是因为其针对字符串与数值输出,提供了两个解盘输出函数,一个是输出字符串的Explain函数,一个是输出数值的ExplainEx函数,ExplainEx的用法如下:

函数: ExplainEx
别名:

显示解盘数值

所属类别:

解盘函数

参数数量:

5

运行模式:

逐根/逐行

说明:

在[解]中输出带数值的解盘。

用法:

EXPLAINEX(COND,TEXT,NUMBER,PRECISION,SKIPLINES)
在COND条件满足时在[解]中输出数值解说。
PRECISION为小数显示位数,SKIPLINES为空出几行显示下一个解盘
例如:
EXPLAINEX(HIGH>=HHV(HIGH,20), \'20天新高价:\',HIGH,2,1)
表示在创20天新高时在[解]中输出数值解说。


希望金字塔能增加此函数,那就太感谢了!!!


下面是我副图公式的截图,因为需要用到解盘功能即时显示开仓、持仓、浮动盈亏等信息,这样才非常直观,如果用不了解盘,那就太可惜了。

图片点击可在新窗口打开查看此主题相关图片如下:cut4.png
图片点击可在新窗口打开查看


--  作者:王锋
--  发布时间:2014/11/2 13:38:24
--  

改成逐K线计算,使用仅刷最后K线模式

 

MA5:EMA(C,N*6);
这句话后面加上
IF NOT(ISLASTBAR()) THEN
EXIT;
 
然后再实实

--  作者:liujam
--  发布时间:2014/11/2 14:22:54
--  
顺带提个小小建议,自定义配色风格时,盘口中的字体不能调节,始终是微软雅黑与12pt。我喜好宋体+9pt,但因盘口无法调节,显得和整体效果很不协调。

目前的如图:

图片点击可在新窗口打开查看此主题相关图片如下:cut5.gif
图片点击可在新窗口打开查看

期望的效果:

图片点击可在新窗口打开查看此主题相关图片如下:cut6.gif
图片点击可在新窗口打开查看



--  作者:liujam
--  发布时间:2014/11/2 14:54:39
--  
非常感谢这么快响应与回复,我试过您的建议,发现在上面的测试代码中,有了非常显著的改善。

不过由于在我实际使用的公式中,存在一些FOR循环语句,以及大量IF语句,如果改成逐根模式,一来是原有的公式代码为了适应逐根模式需要大量重写;二来我曾经也尝试过将部分公式改成逐根模式,但所包含代码中的解盘部分还是引起了响应缓慢的问题,只是相比逐行模式有一定的改善,但改善程度很有限。

我会自己不断的再尝试有无进一步改善的可能,但还是期望在解盘函数上开发人员能做些改进,提高效率。正常情况来说,我在主贴中的代码,不应该引起这么大的CPU占用与卡顿情况。(只要删除解盘函数,速度马上正常,CPU也能马上降下来)

--  作者:liujam
--  发布时间:2014/11/2 15:02:49
--  
我基本可以确定是EXPLAIN中使用了字符串转换函数NUMTOSTR导致的CPU占用问题,盘中我的CPU会一直100%下不来,整机都陷入卡顿状态,症状类似公式中存在有死循环,但实际上公式的编写是没有问题的,就如主贴中的代码,开发人员有空可以在盘中载入我主贴中的公式试一下。
--  作者:netfox
--  发布时间:2014/11/2 17:20:37
--  

这都不算bug ,俺们开多框架 按 05到分时图 直接卡死。。。这bug都 报告2月多了,官方都么有解决过。

  每次必须卡死哇。。。。

 

话说楼主你要解盘干嘛,金字塔核心就是挂机哇。 有任何问题做警报处理发送通知即可。  看盘费时费力每天都被钉死了,都没时间研究新策略新思路的。

   自动化才可以解放。


--  作者:liujam
--  发布时间:2014/11/2 17:26:17
--  
这里再反馈一个小BUG,就是在解盘中,当通过键盘的左右“← →”箭头定位历史K线时,解盘中的信息并不会马上更新,而是需要停顿2秒后才会更新(如果是快速移动键盘左右箭头时,就非常明显发现问题了,有些天的解盘信息是完全不显示的)。而移动鼠标定位历史K线时,解盘信息反应非常迅速,并没有这个问题。

测试代码如下:

CC:C,Linethick1;
EXPLAIN(1,\'当日收盘价: \'+NumToStr(C,0)),COLORWHITE;


[此贴子已经被作者于2014/11/2 17:26:49编辑过]

--  作者:liujam
--  发布时间:2014/11/2 17:43:35
--  
谢谢netfox的建议,程序化交易是很好,只是我的副图公式主要是有些亲戚朋友在用,还有些是退休后的街坊邻居,他们的年纪比较大了,要他们搞程序化不太现实,以他们的习惯,还是用副图指标,看着指标出信号了,然后再下单会比较合适些。还有一个原因是,因为都是跨日的趋势交易,有时1~2个月才有一次开平仓的操作,天天开着自动交易,有点浪费电费。

我制作的副图公式,其实已经同程序化交易的评测系统类似,副图中明确给出了信息,在解盘中给也给出了明确的开仓价位、持仓周期、浮动盈亏、平仓价位等,也有盈亏统计和查看收益曲线的功能。不同的是,需要公式给出信号,然后手工跟着下单,半自动的。

交易信号如图:

图片点击可在新窗口打开查看此主题相关图片如下:1.png
图片点击可在新窗口打开查看

查看收益曲线:

图片点击可在新窗口打开查看此主题相关图片如下:2.png
图片点击可在新窗口打开查看





--  作者:王锋
--  发布时间:2014/11/2 18:40:27
--  

你的问题主要是解盘函数中用的字符串转换是序列变量,这样将导致大量的数字转字符串操作,而且很多还是无效的,你可以这样改,将序列强制转化成常数.

 

MA1:EMA(C,N);
MA2:EMA(C,N*2);
MA3:EMA(C,N*4);
MA4:EMA(C,N*5);
MA5:EMA(C,N*6);
 
MYMA1:=CONST(MA1);

EXPLAIN(C>REF(C,1),\'MA1值: \'+ NUMTOSTR(MYMA1,3)),COLORWHITE;
.........
........
 
这样改后效率会提高很多

--  作者:王锋
--  发布时间:2014/11/2 18:41:06
--  
以下是引用netfox在2014/11/2 17:20:37的发言:

这都不算bug ,俺们开多框架 按 05到分时图 直接卡死。。。这bug都 报告2月多了,官方都么有解决过。

  每次必须卡死哇。。。。

 

话说楼主你要解盘干嘛,金字塔核心就是挂机哇。 有任何问题做警报处理发送通知即可。  看盘费时费力每天都被钉死了,都没时间研究新策略新思路的。

   自动化才可以解放。

 

如果你的问题可以稳定重现,请联系QQ 442902994, 我们跟踪一下你的问题