您现在的位置:程序化交易>> 期货公式>> 金字塔等>> 金字塔知识>>正文内容

求助:VBA做参数优化时内存不断的耗尽 [金字塔]

  • 咨询内容:

    用下面VBS对某个指标做参数优化时,内存会不断耗尽,请教大侠如何解决,谢谢!

     

     for j=6 to 20 step 1
     for k=8 to 36 step 1
     
     test = "W_TEST(" & j & "," & k & ",30)"

     for i=0 to 1166-1
       dim MarketData1, Report1, Fomula1
       set MarketData1 = MarketData
       Set Report1 = MarketData1.GetReportDataByIndex("SZ",i)
       Set Formula1 = MarketData1.STKINDI(Report1.Label,"SZ",test,0,4)
       sg =  Formula1.GetBufData("SG", Formula1.DataSize-1)
       Application.PeekAndPump     
       Set Report1 = Nothing
       Set Formula1 = Nothing 

       set MarketData1 = Nothing
      next
      next

     next

     

  • 金字塔客服: 建议检查一下是不是你的其他代码因为某种原因没有释放导致的问题,我们检查过金字塔代码,VBA在创建公式对象时不会多次分配内存的

     

  • 用户回复:

    谢谢回复!可能是我测试的指标 W_TEST2中又调用了VBA自定义的函数,

    然后VBA函数中申请了返回数组返回出去了,是不是这个数组在外面没地方释放,出现了内存泄漏。

    下面是测试的代码,请确认。

     

    测试宏:

    Sub M_Test()

     dim sg, wn, sn, st, test
     
     for j=6 to 20 step 1
     for k=8 to 36 step 1
     
     sg = 0
     
     test = "W_TEST2(" & j & "," & k & ",30)"
     Application.MsgOut(test) 

      for i=0 to 1166-1
       dim MarketData1, Report1, Fomula1
       set MarketData1 = MarketData
       Set Report1 = MarketData1.GetReportDataByIndex("SZ",i)
       Set Formula1 = MarketData1.STKINDI(Report1.Label,"SZ",test,0,4)
       sg = sg + Formula1.GetBufData("SG", Formula1.DataSize-1)
       
       Application.PeekAndPump     
       Set Report1 = Nothing
       Set Formula1 = Nothing 
       Set MaketData1 = Nothing 
      next
     
     next
     next   

     MsgBox "计算完成!"
     
    End Sub

     

    测试指标  W_TEST2 :

    INPUT:  N(14, 1, 50),M(18, 0, 100);

    BS: CU_MA1(C, N) + CU_MA1(C, M);
    SG: BS;

     

    系统自带的自定义函数 CU_MA1:

    '计算序列模式下指定周期长度的收盘价均价
    Function CU_MA1(Formula,CLOSE,CYC)
       CU_MA1=0

        '防止公式逐周期模式时调用
        If Formula.WorkMode = 0 Then
            Exit Function
        End If

        'CLOSE数组数据长度一定会与Formula.DataSize-1相等
        DataCount = UBound(CLOSE)
        If DataCount <> Formula.DataSize-1 Then
            Exit Function
        End If

        '定义一个计算返回的数组
        Dim ResultMa
        Redim ResultMa(DataCount)

        For i = Cyc-1 To Formula.DataSize-1
            Count = 0
            For k = i-(Cyc-1) To i
                Count = Count + CLOSE(k)
            Next
            ResultMa(i) = Count / Cyc
        Next

        '返回一个计算完毕的均线数组
        CU_MA1 = ResultMa
    End Function

     


     

  • 网友回复:

    这个做法恐怕不行,会导致问题,建议你不要在PEL中使用自定义函数,又拿VBA来做调用。

    建议将你的PEL中的VBA自定义函数的算法,直接移植到VBA中,只直行简单的单次调用

 

有思路,想编写各种指标公式,程序化交易模型,选股公式,预警公式的朋友

可联系技术人员 QQ: 1145508240  有需要帮忙请点击这里留言!!!进行 有偿 编写!不贵!点击查看价格!


【字体: 】【打印文章】【查看评论

相关文章

    没有相关内容