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


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件高级功能研发区 → VBA效率

   

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


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

主题:VBA效率

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


加好友 发短信
等级:论坛游侠 帖子:581 积分:171 威望:0 精华:0 注册:2013/4/2 6:58:20
VBA效率  发帖心情 Post By:2017/6/18 11:39:30 [只看该作者]

代码如下:
            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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
王锋
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:罗宾汉 帖子:11808 积分:20695 威望:0 精华:10 注册:2009/8/18 8:15:13
  发帖心情 Post By:2017/6/18 12:42:03 [只看该作者]

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

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



金字塔—专业程序化软件提供商

金字塔-技术部

-----------------------------------------------------------------------------------------------------

工作时间:周一至周五 08:30 - 17:30   周末及法定节假日休息

Email:service@weistock.com
 回到顶部
帅哥哟,离线,有人找我吗?
deni977
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:581 积分:171 威望:0 精华:0 注册:2013/4/2 6:58:20
  发帖心情 Post By:2017/6/18 22:37:52 [只看该作者]

主要问题是为什么随着时间的推移,累积使用时间会增加?

 回到顶部
帅哥哟,离线,有人找我吗?
deni977
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:581 积分:171 威望:0 精华:0 注册:2013/4/2 6:58:20
  发帖心情 Post By: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
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:581 积分:171 威望:0 精华:0 注册:2013/4/2 6:58:20
  发帖心情 Post By: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,然后继续逐步增加。

    请帮忙看看是哪里问题?



 回到顶部
帅哥哟,离线,有人找我吗?
王锋
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:罗宾汉 帖子:11808 积分:20695 威望:0 精华:10 注册:2009/8/18 8:15:13
  发帖心情 Post By:2017/6/18 23:22:16 [只看该作者]

检查一下是否是application.MsgOut 耗时导致的,不断的积累窗口输出数据也是耗时的过程


金字塔—专业程序化软件提供商

金字塔-技术部

-----------------------------------------------------------------------------------------------------

工作时间:周一至周五 08:30 - 17:30   周末及法定节假日休息

Email:service@weistock.com
 回到顶部