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


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

   

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


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

主题: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语言(不是在<% %>里面),想问这个在哪里是有介绍吗?或者只需要有个范例,把各种语句都展示就行。



 回到顶部
帅哥哟,离线,有人找我吗?
hborning
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | 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
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


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

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

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


 回到顶部
帅哥哟,离线,有人找我吗?
hborning
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | 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),也是定义为数组而返回的,这个算是返回数组吗?

 回到顶部
帅哥哟,离线,有人找我吗?
hborning
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | 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

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


加好友 发短信
等级:论坛游侠 帖子:122 积分:0 威望:0 精华:0 注册:2017/4/27 19:25:29
  发帖心情 Post By:2018/7/6 11:05:34 [显示全部帖子]

想确认下,就是假如我用序列模式写函数,会用历史的数据来计算,返回一个值

在回测时候,是会模拟历史情况,逐步生成每根K线,然后都调用一次序列模式函数来计算,根据返回值和开仓条件来回测吗?

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


加好友 发短信
等级:论坛游侠 帖子:122 积分:0 威望:0 精华:0 注册:2017/4/27 19:25:29
  发帖心情 Post By:2018/7/6 14:39:21 [显示全部帖子]

我有点不明白了?

我描述下我的需求:
1、我的函数,假设本地保存有5000条数据,我仅需要使用最新的1000条K线,最后得出一个状态值,0或1或2或3,在函数内用一个数值变量保存。我现在已经用序列函数的模式写好了(内嵌<% %>方式的,请原谅我还没搞太明白自定义函数,顺便想问,逐K模式下也能用<%%>来写吗?)

2、如果需要回测,是不是在这函数,根据最后计算出的状态值,加上BK、BP、SK、SP的语句(都是一手,没有加减仓需求)
回测就会根据逐渐生成1条到5000条K线,假如现在生成到2500条K线,就会以2500条为输入参数调用这个序列模式的函数,看是否符合BK/BP等条件,若符合就开平仓。然后多生成1条K线,然后将2501条K线作为输入,再调用一次这个序列模式的函数,如果又有信号,就再记录一次开平仓信号。将这5000条数据都执行一遍了,就生成评测报告了?


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


加好友 发短信
等级:论坛游侠 帖子:122 积分:0 威望:0 精华:0 注册:2017/4/27 19:25:29
  发帖心情 Post By:2018/7/6 15:32:50 [显示全部帖子]

我的算法是为实现上述目的,程序只要输入历史上的最高点、最低点数组,我会进行各种运算,算出当前应该是买开、买平、卖开、卖平的。

由于算法比较复杂,单PEL实现不了(有500+行),暂时用内嵌VBS来实现。该公式好像只能序列模式,不能用逐K模式来编译保存的。

我想对该公式进行回测,我看了自定义公式范例CU_MA2里面的逐K模式代码,感觉也是读入收盘价序列,就返回单个数值。感觉这个和我现在代码比较像的。

我有疑问:
1、我是不是应该写一个自定义函数,读入当前价格序列,返回1个变量,有4个取值:1(开多)、2(平多)、3(开空)、4(平空)
那这个自定义函数,应该是采取逐K模式写还是序列模式写?

2、进行回测时候,是不是要写以一个交易公式(假设记录前面自定义函数返回的变量叫XINHAO:
BK(XINHAO=1)
BP(XINHAO=2)
SK(XINHAO=3)
SP(XINHAO=4)
这个交易公式是不是就可以进行回测了?这个交易系统是用序列模式还是逐K模式?






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


加好友 发短信
等级:论坛游侠 帖子:122 积分:0 威望:0 精华:0 注册:2017/4/27 19:25:29
  发帖心情 Post By:2018/7/6 15:39:49 [显示全部帖子]

yukizzc老师,您的回复是针对我的哪一个帖子吗?

我14楼的帖子,是想问在我已经写好的<%%>序列模式公式下,加上一些BK、BP语句,能否进行回测。以及我对于回测的理解是否正确(里面的第2点)?

我15楼的帖子,是想问如果14楼的理解有误,是不是改用15楼的方式,也可以实现?

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