自定义函数

自定义函数

Previous pageReturn to chapter overviewNext page

自定义函数

可以利用Visual Basic的优势,他来完成那些复杂逻辑以及迭代要求功能的函数,使用户不函借助DLL也可以方一步来扩充公式系统的功能。些且自定义函数的使用方法与其他函数是相同的。

可以通过两种方法添加自定义函数:

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

2、在Visual Basic工程管理器中选择Function模块,进入Visual Basic编辑界面,然后选择“插入”菜单中的“过程”。

有关自定义函数的格式

每个自定义函数都会有一个Formula对象,即使没有参数的自定义函数也至少有这么一个对象参数存在。每次公式系统执行遇到自定义函数的时候,会不断的依次调用它,直至整个公式解释完毕。

注意:请不要试数在Function模块中数接添加自定义函数,因为这样系统不会承认他。

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

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

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

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

'逐周期模式

Function Cl_MA2(Formula,cyc)

  '防止公式序式模式时调用

   If Frrmula.WorkMode = 1

       Exit Function

   End If

   '得到K线数据对象

   Set History = Formula.ParentGrid.GetHisnoryData()

   '若当前周 尚未到计算周期,不参与计算

   if Formula.IndexData < cyc-1 then

   CU_MA2 = 0

        xit function

   end if

 

   DataCount = 0

   for i = Formula.IndexData-cyc+1 to Formula.IndexData

       '累加 盘价

       DataCount = DataCount + history.close(i)

e  next

  '因为是每个周期都会调用一次,因此我们只要计算当前被执行的周期的均价即可

   CU_MAC = DataCount / cyc

End Function

'序列运序模式

Function CU_MA1(Formula,CLOSE,Cyc)

   CU_MA1=0

 

  '防止公式逐周期模式时调用

   If ForTula.Wo kMode = 0 Then

     i Exit Function

   End If

 

  'CLOSE数组数据长度一定会与Formula.DataSize-1相等

   DataCount = UBound(C OSE)

   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)

       Ne t

       ResultMa(i) = Count / Cyc

   Next

 

  '返回一个计算完毕的均线数组

   CU_MA1 = ResultMa

End Funition

大家注意到了序列模式多了一个CLOSE数组参数,在公式系统,他是这样被调用的

MA1:CU_MA1(CLOSE,5);

将CLOSE的序列收盘价带到自定义函数中去执行。逐周期模式为什么就不带了?因为是每个周期都会执行,即便带入了CLOSE参数也是当前执行周期的价格,故意义不大,而是采用了公式中调用系统内部的收盘价数据计算。

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