以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (http://www.weistock.com/bbs/index.asp) -- 金字塔软件问题提交 (http://www.weistock.com/bbs/list.asp?boardid=2) ---- VBA自定义PEL函数调用问题 (http://www.weistock.com/bbs/dispbbs.asp?boardid=2&id=164218) |
||||
-- 作者:hborning -- 发布时间:2018/6/30 16:21:04 -- VBA自定义PEL函数调用问题 我想测试VBA自定义PEL函数如何使用,就新建了一个公式,序列模式,主图叠加,使用系统内置的函数CU_MA1 公式只有一行: MAW:CU_MA1(CLOSE,20),COLORRED;我希望他是显示类似传统函数 MAW:MA(CLOSE,20)的效果,就在K线图上画20日均线。 但是会出现2种异常(不可重复,不知道何种条件会跳到哪种异常): (1)加载了公式,但主K线图上没有任何反应。我用断点调试,发现MAW返回的,只是一个数值,并不是我以为的一个数组。 (2)直接从K线图跳去了分时图(不知道是不是VBA有什么特殊进程),然后再按F5也无法返回K线图。 想问,这个异常时什么原因?
|
||||
-- 作者:hborning -- 发布时间:2018/7/1 18:40:21 -- 老师,我原来写的公式就一行 MAW:CU_MA1(CLOSE,20),COLORRED;,今天发现可以正常显示了。 问题: 1、接着我想进入自定义函数里面来调试,发现在公式编辑器里面,选择单步调试直接就跳过这句话了,想问怎么样才能进入vba里面进行单步调试呢? 2对于一些复杂的控制,例如for ,if等控制,我是内嵌<% %>来实现的。我发现教材里面,有些地方除了传统的MA1:MA(CLOSE,5)这种,还看到也有直接在PEL语言(不是在<% %>里面),想问这个在哪里是有介绍吗?或者只需要有个范例,把各种语句都展示就行。 |
||||
-- 作者:无为剑 -- 发布时间:2018/7/1 19:02:45 -- 之前不正常显示,有可能你是没有启动VBS引擎导致的。 在PEL的单步跟踪无法进入VBS中进行调试 目前金字塔已经废弃对<% %>模式的VBS嵌入进行技术支持,建议你选择自定义函数的VBS编程模式,也就是你CU_MA1(CLOSE,20)这种 |
||||
-- 作者:hborning -- 发布时间:2018/7/1 19:23:38 -- 老师,我用<% %>内嵌的模式写了个公式,正常显示的,需要输入HIGH,LOW两个数组,会返回一个数组(大部分是0,低点标记-1,高点标记1)然后在图上画高低点连线。
然后我想用自定义函数方式来重写,PEL公式调用为 RESULT:=UD_XINBI(HIGH,CLOSE); 我附件上传了原来内嵌的代码(这个直接使用都是正常的),还有我自己写的自定义代码,输入部分和输出到ResultMA是抄范例的,其余就是照抄内嵌模式的代码,只是把两个输入变量的部分做了替换,其他都没变。但是我运行,发现图上没有任何反应。而且单步调试时候,发现左边调试窗口里显示,RESULT显示 RESULT 最新 In:1,下面只跟着1行,我想这个应该是数组来的吧?为什么只有显示1个数?
还有是怎么进入自定义函数那里进行调试啊?我发现单步运算直接就跳过那行了
|
||||
-- 作者:hborning -- 发布时间:2018/7/1 19:24:47 --
刚才浏览器只能上传内嵌代码版本的公式,现在再上传使用自定义函数版本的公式 |
||||
-- 作者:yukizzc -- 发布时间:2018/7/2 9:27:07 -- 自定义函数无法返回数组的,只能返回一个数值结果 你可以返回中间结果数据然后看下呢 |
||||
-- 作者:hborning -- 发布时间:2018/7/2 10:30:41 -- 老师,但CU_MA1(CLOSE,20),这个序列模式下是返回了一个和close相等长度的数组,而且自定义函数里面是Redim ResultMA(Datacount),也是定义为数组而返回的,这个算是返回数组吗? |
||||
-- 作者:yukizzc -- 发布时间:2018/7/2 11:19:34 -- 公式要用序列模式,可以输出0或1的值的 |
||||
-- 作者:hborning -- 发布时间:2018/7/6 10:07:26 -- 老师,我还是不太明白,这个是自定义函数的官方例子,2个疑问: (1)序列模式下,最后一句,的确是返回一个CU_MA1=ResultMA \'返回一个计算完毕的均线数组。 在序列模式下,是返回一个单值还是返回一个数组啊? (2)如果在回测模式下,想问回测模式下,是不是会在历史每个时刻上都按序列模式计算历史数据,实际就有点类似逐K调用的方式? \'计算序列模式下指定周期长度的收盘价均价 Function CU_MA1(Formula,CLOSE,CYC) CU_MA1=0 \'防止公式逐周期模式时调用 If Formula.WorkMode = 0 Then Exit Function End If \'CLOSE数组数据长度一定会与Formula.DataSize-1相等
Dim DataCount DataCount = UBound(CLOSE) If DataCount <> Formula.DataSize-1 Then Exit Function End If \'定义一个计算返回的数组 Dim ResultMa Redim ResultMa(DataCount)
Dim i 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
|
||||
-- 作者:yukizzc -- 发布时间:2018/7/6 10:41:13 -- 返回一个数组 2、还是序列模式,逐k模式是说每次都要计算历史值。回测中就和你实盘一根根k从新生成是一样的 你pel公式用序列模式,使能够正确得到0或1的条件返回的 |