以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  高级功能研发区  (http://weistock.com/bbs/list.asp?boardid=5)
----  VB自定义函数问题  (http://weistock.com/bbs/dispbbs.asp?boardid=5&id=78111)

--  作者:wjd
--  发布时间:2015/4/29 10:06:39
--  VB自定义函数问题

VB自定义函数,为逐K线模式,P1为序列变量,如调用时P1为CLOSE

 

Function CROSSUNDER(Formula,P1)
    \'系统会在逐K线模式解释公式时的每个周期都会调用此函数一遍,因此设计时应该注重程序的执行效率,不要重复的执行一些没必要的代码
 if Formula.WorkMode = 1 then \'防止在序列模式下调用
  Exit Function
 End if
 
 CROSSUNDER = P1(1)

 

End Function


CROSSUNDER = P1(1),返回P1下标1的值

出错,显示为:编译器错误13,类型不匹配\'P1\'

如何处理?


--  作者:王锋
--  发布时间:2015/4/29 11:21:10
--  

逐K线模式下,P1参数不是序列数组,而是一个单值变量,你这么用所以会报错。


--  作者:wjd
--  发布时间:2015/4/29 12:01:41
--  
逐K线模式下,函数就不能输入序列变量吗?如果确实需要,如何处理?用数组?请举个例子
--  作者:王锋
--  发布时间:2015/4/29 12:33:33
--  

给你做个计算MA均线的例子,CLOSE参数是要计算的均线数据,N为周期

在PEL语言下使用范例:

ddd:cu_ma3(close,5);

 

下面是VBA代码

Dim data \'创建一个外部的全局变量
\'创建Array外部对象,将对象实例置变量data中, 用来暂存收盘价,计算均价
Set data = CreateObject("Stock.Array")

Function CU_MA3(Formula,CLOSE,N)
    \'系统会在逐K线模式解释公式时的每个周期都会调用此函数一遍,因此设计时应该注重程序的执行效率,不要重复的执行一些没必要的代码
   
    \'第一个数据清空数组进行初始化
    If Formula.IndexData = 0 Then
     data.RemoveAll
    End if
   
    data.AddBack(Close) \'添加数组数据
    If data.Count > N Then \'如果数组数据大于5个就删除第一个,保证数组只有5个大小
        data.Removeat(0)
    End If

    CU_MA3=data.Average

End Function


--  作者:王锋
--  发布时间:2015/4/29 13:32:29
--  
此外提醒,不要在逐K线仅刷最后K线的模式下使用,因为该模式是最后K线才调用该自定义函数一次,会导致计算出错,仅刷最后K线模式算法需要做特殊更改才行
--  作者:wjd
--  发布时间:2015/4/29 14:56:46
--  

谢谢。我正在学习,举例来说, 我要在逐K线模式下实现一个是否下穿函数

Function CrossUnder(Formula , P1 , P2)

如当前P1下穿P2,则返回1,否则返回0

P1、P2为序列,应如何处理?

不需要具体写是否下穿部分,只要P1、P2两个序列如何处理

是否为定义两个外部全局变量数组Array_P1、Array_P2?

在函数中

    Array_P1.AddBack(P1)

    Array_P2.AddBack(P2)

疑问:设布林线上轨为Top;布林线下轨为Bottom;

在公式中:

    is1 = CrossUnder(CLOSE,Top)  \'是否上穿

    is2 = CrossUnder(CLOSE,Bottom) \'是否下穿

 

这样定义的两个数组不就乱了吗?


--  作者:wjd
--  发布时间:2015/4/29 15:02:00
--  

另外,如为:

i1 := cu_ma3(CLOSE,5)

i2 := cu_Ma3(CLOSE,10)

....

j1 := cu_ma3(CLOSE,5)

多处调用了cu_ma3,数组不也乱了吗?


--  作者:王锋
--  发布时间:2015/4/29 15:10:57
--  

编程需要一定的逻辑思维,你的问题该这样解决

 

Function CrossUnder(Formula , P1 , P2, GETTYPE)

 

Array_P1.AddBack(P1)

Array_P2.AddBack(P2)

 

IF GETTYPE = 0 THEN

\'处理上穿判断

END IF

 

IF GETTYPE = 1 THEN

\'处理下破判断

END IF


--  作者:wjd
--  发布时间:2015/4/29 15:20:09
--  

另外,如为:

i1 := cu_ma3(CLOSE,5)

i2 := cu_Ma3(CLOSE,10)

....

j1 := cu_ma3(CLOSE,5)

多处调用了cu_ma3,数组不也乱了吗?


--  作者:王锋
--  发布时间:2015/4/29 20:27:20
--  

 

这种情况你不会使用2个不同的自定义函数? 里面将数组也分别使用2个分别去统计不就行了?