以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://www.weistock.com/bbs/index.asp)
--  高级功能研发区  (http://www.weistock.com/bbs/list.asp?boardid=5)
----  VBA效率  (http://www.weistock.com/bbs/dispbbs.asp?boardid=5&id=155195)

--  作者:deni977
--  发布时间:2017/6/18 11:39:30
--  VBA效率
代码如下:
            tis = timer ’开始时间
marketdata.HistoryDataMode=1
set Report1 = marketdata.GetReportData("RB00","SQ")
        RB00Newprice = Report1.Newprice 
Set Formula1 = marketdata.STKINDI("RB20","SQ",sPolicyName,0,iPeriod,0,360)  \'取策略RB20,RB20是VBA产生的等价K线,已经保存在电脑
Rb20Fx1 = Rb20Fx2 \'将上次获得的数值付给Fx1
Rb20Fx2 = Formula1.GetBufData("AcDkcc",Formula1.DataSize-2) \'取倒数第二个数据
Rb20Cr1 = Rb20Cr2
Rb20Cr2 = Formula1.GetBufData("Dezt01",Formula1.DataSize-2)\'取倒数第二个数据
Rb20Uline = Formula1.GetBufData("VG",Formula1.DataSize-2) \'上线,取倒数第二个数据
Rb20Dline = Formula1.GetBufData("VD",Formula1.DataSize-2)\'下线,取倒数第二个数据
application.MsgOut "rb00NewPrice=" & rb00Newprice
application.MsgOut "rb20Fx1=" & Rb20Fx1
tiend = timer ’结束时间
application.MsgOut "测试耗时:" & Round((tiend- tis),3) \'计算耗时

问题:
      1、  耗时开始是35ms左右,运行一天下来,耗时成了400ms以上,为什么?
      2、  如何优化速度?


[此贴子已经被作者于2017/6/18 11:40:54编辑过]

--  作者:王锋
--  发布时间:2017/6/18 12:42:03
--  

调用STKINDI本身就是个效率不高的操作,没法体现VBA的优势,建议你有可能的情况下直接用VBA生成策略代码。

另外你确定你的测试代码就这么多?需要你也要排除是你的生成等价K线的代码导致的拖延


--  作者:deni977
--  发布时间:2017/6/18 22:37:52
--  
主要问题是为什么随着时间的推移,累积使用时间会增加?
--  作者:deni977
--  发布时间:2017/6/18 22:38:59
--  
晚上做了一个试验,程序:

\'RB的全局变量
public RB20FX1 \'RB20的方向,第2次读到,也就是上一个方向
public RB20FX2 \'RB20的方向,第2次读到,也就是现在的方向
public RB20CR1 \'RB20的确认信号,第1次读到
public RB20CR2 \'RB20的确认信号,第2次读到
public RB20Uline \'RB20的上线
public RB20Dline \'RB20的下线
public RBChiCang \'RB20的持仓
public RBJunJia \'RB20的均价
public RB40FX1 \'RB40的方向,第2次读到,也就是上一个方向
public RB40FX2 \'RB40的方向,第2次读到,也就是现在的方向
public RB40CR1 \'RB40的确认信号,第1次读到
public RB40CR2 \'RB40的确认信号,第2次读到
public RB40Uline \'RB40的上线
public RB40Dline \'RB40的下线
public RB00Newprice \'RB00最新价



Sub APPLICATION_VBAStart()      
    Call application.SetTimer(0,150) \'定时器0,150ms    
End Sub

Sub APPLICATION_VBAEnd()
Call Application.KillTimer(0) \'销毁0号计时器
End Sub

\'定时器
Sub Application_Timer(ID)
if id = 0 then
TestMain 
end if
End Sub

Sub TestMain()
           
            tis = timer
marketdata.HistoryDataMode=1


\'获得PB20/40 DaggerLs02 策略的Fx、CR、Uline、Dline、
sPolicyName = "MACD" \'策略公式名称
iPeriod=0 \'周期=0,即一分钟
set Report1 = marketdata.GetReportData("RB00","SQ")
        RB00Newprice = Report1.Newprice 
Set History5 = marketdata.GetHistoryData("RB00","SQ",0)       
        D2 = History5.Date(History5.Count-1)
        marketdata.DestroyHistoryData
       
Set Formula1 = marketdata.STKINDI("RB00","SQ",sPolicyName,0,iPeriod,0,360)  
Rb20Fx1 = Rb20Fx2 \'将上次获得的数值付给Fx1
Rb20Fx2 = Formula1.GetBufData("DIFF",Formula1.DataSize-2) \'取倒数第二个数据
Rb20Cr1 = Rb20Cr2
Rb20Cr2 = Formula1.GetBufData("DEA",Formula1.DataSize-2) \'取倒数第二个数据
Rb20Uline = Formula1.GetBufData("MACD1",Formula1.DataSize-2) \'上线,取倒数第二个数据
Rb20Dline = Formula1.GetBufData("MACD1",Formula1.DataSize-2) \'下线,取倒数第二个数据
application.MsgOut "rb00NewPrice=" & rb00Newprice
application.MsgOut "rb20Fx1=" & Rb20Fx1

marketdata.DestroyHistoryData
Set Formula = marketdata.STKINDI("RB00","SQ",sPolicyName,0,iPeriod,0,360)  
CounTmp = Formula.DataSize-2
Rb40Fx1 = Rb40Fx2 \'将上次获得的数值付给Fx1
Rb40Fx2 = Formula.GetBufData("DIFF",CounTmp) \'取倒数第二个数据
Rb40Cr1 = Rb40Cr2
Rb40Cr2 = Formula.GetBufData("DEA",CounTmp) \'取倒数第二个数据
Rb40Uline = Formula.GetBufData("MACD1",CounTmp) \'上线,取倒数第二个数据
Rb40Dline = Formula.GetBufData("MACD1",CounTmp) \'下线,取倒数第二个数据
application.MsgOut "rb40Fx1=" & rb40Fx1

marketdata.DestroyHistoryData



tiend = timer
application.MsgOut cdate(time) & " 测试耗时:" & Round((tiend- tis),3)   \'耗时

end sub


--  作者:deni977
--  发布时间:2017/6/18 22:44:02
--  
结果是:
rb00NewPrice=3115
rb20Fx1=-7.935517E-02
rb40Fx1=-7.935517E-02
22:07:54 测试耗时:.016
rb00NewPrice=3115
rb20Fx1=-7.935517E-02
rb40Fx1=-7.935517E-02
22:07:55 测试耗时:0
rb00NewPrice=3115
rb20Fx1=-7.935517E-02
rb40Fx1=-7.935517E-02
22:07:55 测试耗时:.008
……
……
22:36:29 测试耗时:.039
rb00NewPrice=3115
rb20Fx1=-7.935517E-02
rb40Fx1=-7.935517E-02
22:36:29 测试耗时:.047
rb00NewPrice=3115
rb20Fx1=-7.935517E-02
rb40Fx1=-7.935517E-02
22:36:29 测试耗时:.039


1、为了加快累积测试,我将定时器设置为 150ms,同时,采用 MACD策略指标,以及RB00标准的 品种一分钟K线,,测试大概30分钟,这段程序的耗时从开始的 10ms左右,上升到最后 40ms左右,是不是这样的测试有问题?
2、停止VBA再启动,这个耗时还是最后的耗时,比较长的。
3、关闭金字塔,重新打开金字塔,这个耗时又很小了,大概也是10ms,然后继续逐步增加。

    请帮忙看看是哪里问题?



--  作者:王锋
--  发布时间:2017/6/18 23:22:16
--  
检查一下是否是application.MsgOut 耗时导致的,不断的积累窗口输出数据也是耗时的过程