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


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件金字塔软件问题提交 → VBA自定义PEL函数调用问题

   

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


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

主题:VBA自定义PEL函数调用问题

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


加好友 发短信
等级:论坛游侠 帖子:122 积分:0 威望:0 精华:0 注册:2017/4/27 19:25:29
VBA自定义PEL函数调用问题  发帖心情 Post By:2018/6/30 16:21:04 [只看该作者]

我想测试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
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:122 积分:0 威望:0 精华:0 注册:2017/4/27 19:25:29
  发帖心情 Post By:2018/7/1 18:40:21 [只看该作者]

老师,我原来写的公式就一行 MAW:CU_MA1(CLOSE,20),COLORRED;,今天发现可以正常显示了。

问题:
1、接着我想进入自定义函数里面来调试,发现在公式编辑器里面,选择单步调试直接就跳过这句话了,想问怎么样才能进入vba里面进行单步调试呢?

2对于一些复杂的控制,例如for ,if等控制,我是内嵌<%  %>来实现的。我发现教材里面,有些地方除了传统的MA1:MA(CLOSE,5)这种,还看到也有直接在PEL语言(不是在<% %>里面),想问这个在哪里是有介绍吗?或者只需要有个范例,把各种语句都展示就行。



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


加好友 发短信
等级:管理员 帖子:2437 积分:0 威望:0 精华:0 注册:2016/3/5 22:53:41
  发帖心情 Post By:2018/7/1 19:02:45 [只看该作者]

之前不正常显示,有可能你是没有启动VBS引擎导致的。

在PEL的单步跟踪无法进入VBS中进行调试

目前金字塔已经废弃对<% %>模式的VBS嵌入进行技术支持,建议你选择自定义函数的VBS编程模式,也就是你CU_MA1(CLOSE,20)这种


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


加好友 发短信
等级:论坛游侠 帖子:122 积分:0 威望:0 精华:0 注册:2017/4/27 19:25:29
  发帖心情 Post By:2018/7/1 19:23:38 [只看该作者]

老师,我用<% %>内嵌的模式写了个公式,正常显示的,需要输入HIGH,LOW两个数组,会返回一个数组(大部分是0,低点标记-1,高点标记1)然后在图上画高低点连线。

 

然后我想用自定义函数方式来重写,PEL公式调用为

RESULT:=UD_XINBI(HIGH,CLOSE);
DRAWLINE((RESULT=-1),LOW,(RESULT=1),HIGH,0),LINEDOT,COLORDEC4B0;
DRAWLINE((RESULT=1),HIGH,(RESULT=-1),LOW,0),LINEDOT,COLORDEC4B0;

我附件上传了原来内嵌的代码(这个直接使用都是正常的),还有我自己写的自定义代码,输入部分和输出到ResultMA是抄范例的,其余就是照抄内嵌模式的代码,只是把两个输入变量的部分做了替换,其他都没变。但是我运行,发现图上没有任何反应。而且单步调试时候,发现左边调试窗口里显示,RESULT显示 RESULT 最新 In:1,下面只跟着1行,我想这个应该是数组来的吧?为什么只有显示1个数?

 

还有是怎么进入自定义函数那里进行调试啊?我发现单步运算直接就跳过那行了

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:高低点(vbs).txt


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


加好友 发短信
等级:论坛游侠 帖子:122 积分:0 威望:0 精华:0 注册:2017/4/27 19:25:29
  发帖心情 Post By:2018/7/1 19:24:47 [只看该作者]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:高低点(自定义函数代码).txt

刚才浏览器只能上传内嵌代码版本的公式,现在再上传使用自定义函数版本的公式


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


加好友 发短信
等级:超级版主 帖子:21598 积分:0 威望:0 精华:1 注册:2010/7/31 16:35:30
  发帖心情 Post By:2018/7/2 9:27:07 [只看该作者]

自定义函数无法返回数组的,只能返回一个数值结果

你可以返回中间结果数据然后看下呢


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


加好友 发短信
等级:论坛游侠 帖子:122 积分:0 威望:0 精华:0 注册:2017/4/27 19:25:29
  发帖心情 Post By:2018/7/2 10:30:41 [只看该作者]

老师,但CU_MA1(CLOSE,20),这个序列模式下是返回了一个和close相等长度的数组,而且自定义函数里面是Redim ResultMA(Datacount),也是定义为数组而返回的,这个算是返回数组吗?

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


加好友 发短信
等级:超级版主 帖子:21598 积分:0 威望:0 精华:1 注册:2010/7/31 16:35:30
  发帖心情 Post By:2018/7/2 11:19:34 [只看该作者]

公式要用序列模式,可以输出0或1的值的

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


加好友 发短信
等级:论坛游侠 帖子:122 积分:0 威望:0 精华:0 注册:2017/4/27 19:25:29
  发帖心情 Post By: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
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:21598 积分:0 威望:0 精华:1 注册:2010/7/31 16:35:30
  发帖心情 Post By:2018/7/6 10:41:13 [只看该作者]

返回一个数组

2、还是序列模式,逐k模式是说每次都要计算历史值。回测中就和你实盘一根根k从新生成是一样的

你pel公式用序列模式,使能够正确得到0或1的条件返回的


 回到顶部
总数 19 1 2 下一页