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


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件高级功能研发区 → 金字塔公式系统里使用自定义函数

   

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


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

主题:金字塔公式系统里使用自定义函数

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


加好友 发短信
等级:管理员 帖子:7302 积分:32559 威望:1000 精华:45 注册:2003/12/30 16:34:32
金字塔公式系统里使用自定义函数  发帖心情 Post By:2009/11/9 19:44:59 [只看该作者]

可以利用Visual Basic的优势,用来完成那些复杂逻辑以及迭代要求功能的函数,使用户不必借助DLL也可以进一步来扩充公式系统的功能。并且自定义函数的使用方法与其他函数是相同的。
可以通过两种方法添加自定义函数:
1、在公式编辑器界面中,鼠标在“自定义函数”解释定义区单击右键,然后选择“添加自定义函数”。
2、在Visual Basic工程管理器中选择Function模块,进入Visual Basic编辑界面,然后选择“插入”菜单中的“过程”。
有关自定义函数的格式
每个自定义函数都会有一个Formula对象,即使没有参数的自定义函数也至少有这么一个对象参数存在。每次公式系统执行遇到自定义函数的时候,会不断的依次调用它,直至整个公式解释完毕。

示例创建一个计算CYC日收盘价移动平均线的自定义函数,CUSTOM_MA2(CYC),在"添加自定义函数"对话框上名称输"CUSTOM_MA2",在参数位置输入"CYC"后单击确定,然后在随即弹出的VBS编辑器界面上,输入下面代码:

'计算指定周期长度的收盘价均价
Function CUSTOM_MA2(Formula,cyc)
    '得到K线数据对象
Set History = Formula.ParentGrid.GetHistoryData()
'若当前周期尚未到计算周期,不参与计算
if Formula.IndexData < cyc-1 then
  CUSTOM_MA2 = 0
  exit function
end if

DataCount = 0
    for i = Formula.IndexData-cyc+1 to Formula.IndexData
     '累加收盘价
     DataCount = DataCount + history.close(i)
    next
CUSTOM_MA2 = DataCount / cyc
End Function

以上代码输入完毕后按下 Shift+F5启动VBS教本运行,然后就可以在公式编辑中使用我们刚刚创建的自定义函数了. 

 

有关自定义函数的两种工作模式

金字塔公式系统工作两种模式,即序列和逐周期两种模式。序列模式公式系统每次刷新只会调用一次自定义函数,传递的参数数据类型有数组和常数两种,自定义函数根据自身的计算类型,返回一个数值或者一个数组。逐周期模式为从第1周期逐个周期解析公式系统,每个周期都会调用自定义函数一次,传递的参数只有数值类型,返回值也只有数值类型这一种,此时我们可以通过Formula.IndexData属性来得到当前执行到现在的周期。

序列模式由于解析时只会调用自定义函数一次,故效率是非常高的;逐周期模式,主要是为了实现具有头寸管理的交易系统而设计,可以实现我们通常的逐次加仓,多次平仓等算法,公式的编写灵活性很高,可以在公式里实现各种控制语句。

下面两个自定义公式示例,很好的说明了两种工作原理的不同:

 

'逐周期模式
Function CU_MA2(Formula,cyc)
    '防止公式序列模式时调用
    If Formula.WorkMode = 1
        Exit Function
    End If
    '得到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

大家注意到了序列模式多了一个CLOSE数组参数,在公式系统,他是这样被调用的
MA1:CU_MA1(CLOSE,5);
将CLOSE的序列收盘价带到自定义函数中去执行。逐周期模式为什么就不带了?因为是每个周期都会执行,即便带入了CLOSE参数也是当前执行周期的价格,故意义不大,而是采用了公式中调用系统内部的收盘价数据计算。

注意:通常自定义函数只能执行一种模式的运算,不要在序列和逐周期这两种模式下混用。

[此贴子已经被作者于2010-9-6 14:47:21编辑过]

[本帖被加为精华]
 回到顶部
帅哥哟,离线,有人找我吗?
solarhe2006
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:252 积分:1001 威望:0 精华:0 注册:2010/2/15 16:47:58
[公告]上海中期北京营业部与金字塔合作  发帖心情 Post By:2011/5/20 1:05:16 [只看该作者]

1、在公式编辑器界面中,鼠标在“自定义函数”解释定义区单击右键,然后选择“添加自定义函数”。

---

没有找到公式编辑器,能上图吗?

 

建议论坛多些图。

论坛也该升级,太简陋了。

 


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


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

最小化公式编辑器就看到了


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

金字塔-技术部

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

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

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


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



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

金字塔-技术部

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

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

Email:service@weistock.com
 回到顶部