以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  公式模型编写问题提交  (http://weistock.com/bbs/list.asp?boardid=4)
----  有关优化策略模型的问题  (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=183225)

--  作者:yzg512999
--  发布时间:2020/11/27 13:16:41
--  有关优化策略模型的问题
为了提高程序化运行效率,少占用电脑内存,使用金字塔的自定义数据功能来加强改善跨周期引用指标的效率。


http://www.weistock.com/bbs/dispbbs.asp?boardid=16&Id=74267


我想优化我的策略,能否帮我在策略思路不变的情况下让它最精简呢?

代码如下:
新建MM指标:
M1:MA(C,5);
M2:CLOSE;
M3:MA(C,10);
M4:MA(C,20);

--------------------------------------------------------------
MA5:MA(CLOSE,5);
MA10:MA(CLOSE,10);
MA20:MA(CLOSE,20);
MA30:MA(CLOSE,30);
MA60:MA(CLOSE,60);
MA120:MA(CLOSE,120)COLOR0000FF;


MA1:="MM.M1#WEEK";
MA2:="MM.M2#WEEK";
MA3:="MM.M3#WEEK";//调用周线的均线指标

MAA1:="MM.M1#DAY";
MAA2:="MM.M2#DAY";
MAA3:="MM.M3#DAY";
MAA4:="MM.M4#DAY";//调用日线的均线指标

AA:=MAA2>MAA1 AND MAA2>MAA3 AND MAA2>MAA4;
BB:=MAA2<MAA1 AND MAA2<MAA3 AND MAA2<MAA4;


A:=C>MA(C,5) AND C>MA(C,10) AND C>MA(C,20) ;
B:=C<MA(C,5) AND C<MA(C,10)  AND C<MA(C,20) ;

IF MA2>MA1  AND MA2>MA3 AND A AND AA  THEN BUY(HOLDING=0,35%,MARKET),PERTRADER;
IF  MA2<MA1  AND MA2<MA3 AND B AND BB THEN BUYSHORT(HOLDING=0,35%,MARKET),PERTRADER;

IF C<=MA(C,10)-5*MINDIFF  THEN SELL(HOLDING>0,HOLDING,MARKET);
IF C>=MA(C,10)+5*MINDIFF THEN SELLSHORT(HOLDING<0,HOLDING,MARKET);


--  作者:FireScript
--  发布时间:2020/11/27 13:31:26
--  
 你这里其实不太用的到自定义数据的。

而且你这里采用的跨周期调用已经是比较合理的引用方式了,一般用stkindi函数效率上会低点,这个函数相当于创建了一个运行副本,所以效率低点。

唯一我觉得可以优化的地方是这里:

AA:=MAA2>MAA1 AND MAA2>MAA3 AND MAA2>MAA4;
BB:=MAA2<MAA1 AND MAA2<MAA3 AND MAA2<MAA4;

因为这几个变量(MAA1...MAA4)都是一个周期下的。这个判断完全可以放到上面被调用的那个指标里。然后你只需要调用AA,BB就行了。
MA2>MA1  AND MA2>MA3  这几个也是的。都是一个周期的,在被调用指标里面判断好结果,调用过来即可。

--  作者:yzg512999
--  发布时间:2020/11/27 15:29:51
--  
你刚才说的引用5周线时可以以用过去四周的周线价格+当前小周期价格计算,来替代直接调用大周期的五日均线。
这样思路是很好,起码回测会接近实际。

但是你看到我还有引用10周线和20日线这些数据,如果都用你说的这思路来修改,
会不会导致软件运行变得非常沉重,占用大量内存呢?

--  作者:FireScript
--  发布时间:2020/11/27 15:35:07
--  
 你这里的代码,很难占用那么多资源的。一般占用资源比较多都是 数据量太大,有循环,stkindi使用太多,以及明确有说明计算量大的函数等等。以上几个因素的一个或者多个。

而且就你这里而言,其实没有增加引用的数量。只是把直接调用大周期五日均线换成了调用大周期的四日而已。

--  作者:yzg512999
--  发布时间:2020/11/27 15:43:01
--  
好的,那那其他引用日线中的5日线,10日线和20日线也这样改变了。


代码是不是ref(c,1)呢

--  作者:FireScript
--  发布时间:2020/11/27 15:51:31
--  
M1:MA(C,4);




MA1:="MM.M1#WEEK";
MA5:(MA1*4+C)/5;//重新计算五周均线。(4周线总和+当前小周期收盘价)/5
--  作者:yzg512999
--  发布时间:2020/11/27 16:13:00
--  

MA1:="MM.M1#WEEK";  你这个是4周均线的价格吧,这个均线价格是最近四周(包括本周的收盘价)的收盘价想加除以4得来的。这样还是会把最近那周的收盘价算进去,这样不行吧。


要用(ref(c,4)+ref(c,3)+ref(c,2)+ref(c,1)+小周期的c)/5来得到实时变动的5周线吧??

--  作者:FireScript
--  发布时间:2020/11/27 16:31:12
--  
 不用那么麻烦。

M1:ref(MA(C,4),1);

这里这样就行了。

--  作者:yzg512999
--  发布时间:2020/11/27 16:58:34
--  
AA:=MAA2>MAA1 AND MAA2>MAA3 AND MAA2>MAA4;
BB:=MAA2<MAA1 AND MAA2<MAA3 AND MAA2<MAA4;

如果把这两个AA和BB当但MM指标里,

那在主策略编辑部里引用他们要怎么写的

--  作者:FireScript
--  发布时间:2020/11/27 17:02:39
--  
 AA:MAA2>MAA1 AND MAA2>MAA3 AND MAA2>MAA4;
BB:MAA2<MAA1 AND MAA2<MAA3 AND MAA2<MAA4;


当前周期下调用:
 AA:="MM. AA#DAY";