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'
如何处理?
逐K线模式下,P1参数不是序列数组,而是一个单值变量,你这么用所以会报错。
给你做个计算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
谢谢。我正在学习,举例来说, 我要在逐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) '是否下穿
这样定义的两个数组不就乱了吗?
另外,如为:
i1 := cu_ma3(CLOSE,5)
i2 := cu_Ma3(CLOSE,10)
....
j1 := cu_ma3(CLOSE,5)
多处调用了cu_ma3,数组不也乱了吗?
编程需要一定的逻辑思维,你的问题该这样解决
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
另外,如为:
i1 := cu_ma3(CLOSE,5)
i2 := cu_Ma3(CLOSE,10)
....
j1 := cu_ma3(CLOSE,5)
多处调用了cu_ma3,数组不也乱了吗?
这种情况你不会使用2个不同的自定义函数? 里面将数组也分别使用2个分别去统计不就行了?