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


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件高级功能研发区 → 关于VarData 属性

   

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


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

主题:关于VarData 属性

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


加好友 发短信
等级:新手上路 帖子:41 积分:118 威望:0 精华:0 注册:2011/10/7 18:59:32
关于VarData 属性  发帖心情 Post By:2014/6/23 11:13:57 [只看该作者]

 问一个弱弱的问题;
我能用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

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


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

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

 

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

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



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

金字塔-技术部

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

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

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


加好友 发短信
等级:新手上路 帖子:41 积分:118 威望:0 精华:0 注册:2011/10/7 18:59:32
  发帖心情 Post By:2014/6/23 19:39:50 [只看该作者]

是新手,谢谢王总回复;

着急了,意思没表达清楚,我是写了一个过程,关键不在函数返回值,而是希望通过这个过程,去修改一个序列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

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


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

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编辑过]


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

金字塔-技术部

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

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

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


加好友 发短信
等级:新手上路 帖子:41 积分:118 威望:0 精华:0 注册:2011/10/7 18:59:32
  发帖心情 Post By:2014/6/23 20:59:05 [只看该作者]

谢谢!

 VARDATA 是只能在序列模式上使用的图片点击可在新窗口打开查看

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


加好友 发短信
等级:新手上路 帖子:74 积分:0 威望:0 精华:0 注册:2013/8/7 9:04:17
  发帖心情 Post By:2014/6/23 21:29:32 [只看该作者]

回头给你做个例子

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


加好友 发短信
等级:新手上路 帖子:41 积分:118 威望:0 精华:0 注册:2011/10/7 18:59:32
  发帖心情 Post By:2014/6/23 22:57:47 [只看该作者]

好啊,先行谢过图片点击可在新窗口打开查看

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


加好友 发短信
等级:新手上路 帖子:74 积分:0 威望:0 精华:0 注册:2013/8/7 9:04:17
  发帖心情 Post By:2014/6/24 23:59:57 [只看该作者]

runmode:0; //必须工作在逐K线模式

ccc:c,linethick0;

now:=BARPOS;

ccc:=chuli(l,h,now);

 

插入一个过程,有如下代码

chuli(Formula,ll,hh,cyc)

'系统会在逐K线模式解释公式时的每个周期都会调用此函数一遍,因此设计时应该注重程序的执行效率,不要重复的执行一些没必要的代码

chuli=0

set history=Formula.ParentGrid.GetHistoryData()

if ll>hh-100 then

chuli=4014

end if

 

由于你没具体需求,大致是这样的。等你有了具体需求再提了


 回到顶部