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

关于VarData 属性 [金字塔]

  • 咨询内容:  问一个弱弱的问题;
    我能用VarData 属性,处理一个序列吗?

    例如:公式中
    vvv:c,linethick0;
    now:=BARPOS;
    aaa:=chuli(l,h,now);


    插入一个过程,有如下代码
    chuli(Formula,ll,hh,cyc)
        '系统会在逐K线模式解释公式时的每个周期都会调用此函数一遍,因此设计时应该注重程序的执行效率,不要重复的执行一些没必要的代码
       chuli=0
      set history=Formula.ParentGrid.GetHistoryData()
       if ll>hh-100 then
            vvv(cyc-2):=4014
       end if

    期望看到结果是,vvv在h-100>l的时候,2周期前的VVV变成4014;
    实际看到的效果是,没反应,vvv一直为C

     

  • 金字塔客服:

    不清楚你是否是金字塔的新手,因为你的代码逻辑是紊乱的,其中

     

    1, vvv:c,linethick0; 你将变量赋值到vvv,但是你的PEL代码中并没有中间有重复赋值的地方,当然一直是c了.

    2, vba的函数返回值 应该是 函数名=返回值 这样才对,建议你先书店买本VBA的基础开发书籍看看

     

  • 用户回复: 是新手,谢谢王总回复;

    着急了,意思没表达清楚,我是写了一个过程,关键不在函数返回值,而是希望通过这个过程,去修改一个序列ccc;
    我先赋值给CCC,然后通过一个chuli函数,去把ccc序列赋值给VVV,然后把VVV按照条件处理后,重新赋值给CCC,期望看到CCC有变化;
    这样可以吗?

    例如:公式中
    ccc:c,linethick0;
    now:=BARPOS;
    aaa:=chuli(l,h,now);


    插入一个过程,有如下代码
    chuli(Formula,ll,hh,cyc)
        '系统会在逐K线模式解释公式时的每个周期都会调用此函数一遍,因此设计时应该注重程序的执行效率,不要重复的执行一些没必要的代码
       chuli=0

        vvv = formula.VARDATA("ccc")


      set history=Formula.ParentGrid.GetHistoryData()
       if ll>hh-100 then
            vvv(cyc-2):=4014
       end if

       formula.VARDATA("ccc") = vvv


    期望看到结果是,ccc在h-100>l的时候,2周期前的ccc变成4014;
    实际看到的效果是,没反应,vvv一直为C

     

  • 网友回复:

    VARDATA 是只能在序列模式上使用的, 你的VBA自定义函数也不是工作在序列模式,因为序列模式不是你这么搞的, 金字塔的序列模式是传递给你数组让你去处理的.

    建议你参考 金字塔自带的2个MA均线的自定义函数的处理方法

     

    '计算逐周期模式下指定周期长度的收盘价均价
    Function CU_MA2(Formula,cyc)
        '得到K线数据对象
     Set History = Formula.ParentGrid.GetHistoryData()
     '若当前周期尚未到计算周期,不参与计算
     if Formula.IndexData < cyc-1 then
      CU_MA2 = 0
      exit function
     end if
     
     DataCount = 0
        for i = Formula.IndexData-cyc+1 to Formula.IndexData
         '累加收盘价
         DataCount = DataCount + history.close(i)
        next
     CU_MA2 = DataCount / cyc
    End Function

     

     

    '计算序列模式下指定周期长度的收盘价均价
    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
     

    [此贴子已经被作者于2014/6/23 20:49:45编辑过]

     

  • 网友回复: 谢谢!

     VARDATA 是只能在序列模式上使用的

 

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

可联系技术人员 QQ: 1145508240  点击这里给我发消息进行 有偿 编写!不贵!点击查看价格!


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

相关文章

    没有相关内容