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


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件高级功能研发区 → 自定义函数传入变量问题

   

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


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

主题:自定义函数传入变量问题

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


加好友 发短信
等级:新手上路 帖子:101 积分:530 威望:0 精华:0 注册:2011/12/9 19:43:29
自定义函数传入变量问题  发帖心情 Post By:2012/3/28 1:34:27 [显示全部帖子]

能否实现如下功能,如何实现:
 
写一个逐周期自定义函数CF(Formula, Series), series既可以传入C,又可以传入(H+L)/2等,这样才能体现函数的价值嘛:)

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


加好友 发短信
等级:新手上路 帖子:101 积分:530 威望:0 精华:0 注册:2011/12/9 19:43:29
  发帖心情 Post By:2012/3/28 11:44:15 [显示全部帖子]

 可是在K线模式下,函数中Series(n)的写法报错,是不是K线模式不能传入数组啊,还是我的写法有问题?

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


加好友 发短信
等级:新手上路 帖子:101 积分:530 威望:0 精华:0 注册:2011/12/9 19:43:29
  发帖心情 Post By:2012/3/28 11:48:18 [显示全部帖子]

比如说在K线模式下 UBound(Series)  类型不匹配,是不是说明Series不能是个数组啊。那我传入close、(H+L)/2也就不能达到所期望的那样了。

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


加好友 发短信
等级:新手上路 帖子:101 积分:530 威望:0 精华:0 注册:2011/12/9 19:43:29
  发帖心情 Post By:2012/3/28 12:17:09 [显示全部帖子]

 很简单,比如我想求最近两个数据的最大值,如以下代码:

Function CU_HHV(Formula,Series)
    '改为逐周期调用
    If Formula.WorkMode = 1 Then
        Exit Function
    End If

    DataCount = UBound(Series)
    IF Series(DataCount) > Series(DataCount-1) THEN 'Function.Max(Series(DataCount), Series(DataCount-1))
        CU_HHV = Series(DataCount)
    ELSE
        CU_HHV = Series(DataCount - 1)
    END IF
End Function

调用的时如下:
CU_HHV(H)  求高点最大值
CU_HHV(L)  求低点点最大值

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


加好友 发短信
等级:新手上路 帖子:101 积分:530 威望:0 精华:0 注册:2011/12/9 19:43:29
  发帖心情 Post By:2012/3/28 13:43:09 [显示全部帖子]

不知您能看明白我的需求没,能不能帮忙写个小小的示例,关键代码即可。
即我想写一个函数能在逐K线模式下用,可传入不同变量(如Close、如High等),函数中可以调用这个变量不同时期的值以进行计算。
多谢!!

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


加好友 发短信
等级:新手上路 帖子:101 积分:530 威望:0 精华:0 注册:2011/12/9 19:43:29
  发帖心情 Post By:2012/3/28 14:28:51 [显示全部帖子]

非常感谢!!图片点击可在新窗口打开查看

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


加好友 发短信
等级:新手上路 帖子:101 积分:530 威望:0 精华:0 注册:2011/12/9 19:43:29
  发帖心情 Post By:2012/3/28 15:10:13 [显示全部帖子]

 还有一问题:在逐周期下的自定义函数中,如何定义类似variable类型的变量?可以用来做累计运算。


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


加好友 发短信
等级:新手上路 帖子:101 积分:530 威望:0 精华:0 注册:2011/12/9 19:43:29
  发帖心情 Post By:2012/3/28 20:04:04 [显示全部帖子]

(一)“2.85后增加逐K线仅刷最后一个K线模式”,十二分地期待啊!!这样会快很多!如果启用这个模式的话是不是我应该这样写:
IF d.Count = Formula.IndexData THEN 'Formula.IsLastBar = 1
    d.(Formula.IndexData) = Series
ELSE
   
d.AddBack(Series)
END IF

(二)数组是否有长度限制,我K线特别多时,会不会出错?


(三)对于自定义函数只能调用一次的缺憾,我在您的基础上稍微做了点修改,即将数组存放在一个Dictionary容器中,这样貌似可以调用多次,请您指点一下,我这样写对不对,好不好!
Dim CU_HHV_Dic '创建字典
'创建Array外部对象字典
Set CU_HHV_Dic = CreateObject("Scripting.Dictionary") 'CreateObject("Stock.Array")

Function CU_HHV(Formula, Series, ID) 'ID为每组数据的标识
   '改为逐周期调用
    If Formula.WorkMode = 1 Then
        Exit Function
    End If
  
       DIM d
    '第一个周期清空数组,用于下一轮刷新计算
    If Formula.IndexData = 0 then
           IF CU_HHV_Dic.Exists(ID) THEN
            CU_HHV_Dic.Remove(ID)
           END IF
           SET d  = CreateObject("Stock.Array") '创建新的数组
           CU_HHV_Dic.Add ID, d
    end if
    SET d = CU_HHV_Dic.Item(ID)
  
    '添加数据到数组,这里只考虑简单情况,对于2.85后增加逐K线仅刷最后一个K线模式,这里要注意判断数据的大小,因为数据只在最后一个K线会重复调用,不加处理会导致最后一个周期不断往里添加数据,解决方法是不使用重新刷新模式或者自行判断,发现数据相等后只更新最后一个数据
    d.AddBack(Series)

   '求最近2个周期的最大值
    if Formula.IndexData >= 1 Then
        IF d.GetAt(Formula.IndexData-1) > d.GetAt(Formula.IndexData) Then
               CU_HHV = d.GetAt(Formula.IndexData-1)
        Else
               CU_HHV = d.GetAt(Formula.IndexData)
        End if
    End If
End Function

调用时:
hv : CU_HHV(H, 0); 

lv : CU_HHV(L, 1);


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


加好友 发短信
等级:新手上路 帖子:101 积分:530 威望:0 精华:0 注册:2011/12/9 19:43:29
  发帖心情 Post By:2012/3/28 21:34:28 [显示全部帖子]

 多谢!

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


加好友 发短信
等级:新手上路 帖子:101 积分:530 威望:0 精华:0 注册:2011/12/9 19:43:29
  发帖心情 Post By:2012/3/31 0:40:20 [显示全部帖子]

(一)在上面您提到:“添加数据到数组,这里只考虑简单情况,对于2.85后增加逐K线仅刷最后一个K线模式,这里要注意判断数据的大小,因为数据只在最后一个K线会重复调用, 不加处理会导致最后一个周期不断往里添加数据,解决方法是不使用重新刷新模式或者自行判断,发现数据相等后只更新最后一个数据”
关于这段能写段示例吗,我自己试了一下,老出错!关键是不知道原理。

(二)“仅刷最后一个K线模式” 找不到这个设置啊,是不是逐K线模式默认就只刷最后一根啊?

(三)我机子因为装有VS2011,所以调试状态老出错(软件出错自动退出),VBS开发有控制台输出什么的吗?简单调试用!

 回到顶部
总数 15 1 2 下一页