金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 116|回复: 3

vba中关于教程这段描述

[复制链接]

11

主题

62

帖子

62

积分

等级: 免费版

注册:
2021-11-3
曾用名:
发表于 2025-1-10 12:43 | 显示全部楼层 |阅读模式
(2)序列运行模式
Function CU_MA1(Formula,CLOSE,Cyc)
    CU_MA1=0

    '防止公式逐K线模式时调用
    If Formula.WorkMode = 0 Then
        Exit Function
    End If

    'CLOSE数组数据长度一定会与Formula.DataSize-1相等
    DataCount = UBound(CLOSE)
    If DataCount <> Formula.DataSize-1 Then
        Exit Function
    End If
'定义一个计算返回的数组
    Dim ResultMa
    Redim ResultMa(DataCount)
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
End Function
大家注意到了序列模式多了一个CLOSE数组参数,在公式系统,他是这样被调用的MA1:CU_MA1(CLOSE,5);[size=13.3333px]在公式系统,他是这样被调用的MA1:CU_MA1(CLOSE,5);提示参数错误,删除close就对了,但是关于close的逻辑没有返回,只有返回0,什么原因呢?


回复

使用道具 举报

35

主题

9409

帖子

5万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
wenarm
发表于 2025-1-10 13:03 | 显示全部楼层
你的vba中function的中的代码可能被改掉了。不带close的是cu_ma2

原始代码应该是:
[Visual Basic] 复制代码
'*******************************************************************************************
'该模块主要用来保存自定义公式函数主函数,不要拿做他用
'*******************************************************************************************

Function TriangleShape(Formula,Cyc,SCyc,ECyc)
    'msgbox cyc & "-" & scyc & "-" & ecyc
        '该函数计算当前位置图形是否是三角形突破,如果是则返回1,否则返回0。该函数只有在选股时才能使用。
        TriangleShape=0
       
        '如果是分时数据或者分笔成交那么直接返回
        If Formula.ParentGrid.DataType = 0 or Formula.ParentGrid.CycType = 10 Then
                Exit Function
        End If
       
        '得到K线数据对象
        Set History = Formula.ParentGrid.GetHistoryData()
       
        If History.Count < Cyc+3 Then
                Exit Function
        End If
       
        '为了加快处理速度,只有公式在执行最后一个周期时使用。这就意味着只能在选股时使用该函数
        '如果你在公式测试中使用,请注释掉以下语句
        If Formula.IndexData < History.Count-1 Then Exit Function
       
        '下面的代码判断当前图形是否可能为三角形态
        '开始位置SCyc周期内的高低价格为三角形态的开始
        StartPos = Formula.IndexData - (Cyc+2)
        EndPos = Formula.IndexData-3
        High = History.High(StartPos)
        Low  = History.Low(StartPos)
        For I = StartPos To StartPos+SCyc
                If History.High(I) > High Then
                        High = History.High(I)
                End If
                If History.Low(i) < Low Then
                        Low = History.Low(I)
                End If
        Next
       
        'ECyc周期内的周期高低价格为三角的结束
        High2 = History.High(EndPos - ECyc)
        Low2  = History.Low(Endpos-ECyc)
        for i = endpos - ECyc to endpos
                If History.High(I) > High2 Then
                        High2 = History.High(I)
                End If
                If History.Low(i) < Low2 Then
                        Low2 = History.Low(I)
                End If
        next
       
        '最后图形范围为开始图形的1/2的话,初步表明是可以做为三角形的结束
        if high2-low2 <= 0 then
                exit function
        end if
       
        If (High-Low) / (high2-low2) < 2 Then
                Exit Function
        End if
       
        if high2 > high or low2 < low then
                exit function
        end if
       
        '如果中间有超过三角形边界的地方,三角图形则不成立
        '用斜率计算图形边界
        '计算上边界
        Slope = (high2-high) / (Endpos-StartPos)
        b = high - slope * startpos
       
        for i = startpos+SCyc to endpos
                temp = slope * i + b
                price = (history.open(i)+history.close(i))/2
                if temp < price then
                        exit function
                end if
        next
       
        '计算下边界
        slope = (low2-low) / (endpos - startpos)
        b = low - slope * startpos
       
        for i = startpos to endpos-3
                temp = slope * i + b
                price = (history.open(i)+history.close(i))/2
                if temp > price then
                        exit function
                end if
        next       
       
        '如果3日后的价格突破了三角型结束的上边线认为突破成功
        if history.close(Formula.IndexData) > high2 then
                TriangleShape = 1
        end if
       
       
End Function

'计算逐周期模式下指定周期长度的收盘价均价
Function CU_MA2(Formula,cyc)
    '得到K线数据对象
        Set History = Formula.ParentGrid.GetHistoryData()
        '若当前周期尚未到计算周期,不参与计算
        if Formula.IndexData < cyc-1 then
                CU_MA2 = 0
                exit function
        end if
       
        DataCount = 0
    for i = Formula.IndexData-cyc+1 to Formula.IndexData
            '累加收盘价
            DataCount = DataCount + history.close(i)
    next
        CU_MA2 = DataCount / cyc
End Function

'计算序列模式下指定周期长度的收盘价均价
Function CU_MA1(Formula,CLOSE,CYC)
   CU_MA1=0

    '防止公式逐周期模式时调用
    If Formula.WorkMode = 0 Then
        Exit Function
    End If

    'CLOSE数组数据长度一定会与Formula.DataSize-1相等
    DataCount = UBound(CLOSE)
    If DataCount <> Formula.DataSize-1 Then
        Exit Function
    End If

    '定义一个计算返回的数组
    Dim ResultMa
    Redim ResultMa(DataCount)

    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
End Function
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

11

主题

62

帖子

62

积分

等级: 免费版

注册:
2021-11-3
曾用名:
 楼主| 发表于 2025-1-10 14:37 | 显示全部楼层
技术006 发表于 2025-1-10 13:03
你的vba中function的中的代码可能被改掉了。不带close的是cu_ma2

原始代码应该是:

谢谢!Function CU_MA1(Formula,CLOSE,CYC),这里除了开高低收还支持传入哪些数组?
回复

使用道具 举报

35

主题

9409

帖子

5万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
wenarm
发表于 2025-1-13 09:10 | 显示全部楼层
只要是序列值都可以传递。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 微信登录

本版积分规则

手机版|小黑屋|上海金之塔信息技术有限公司 ( 沪ICP备13035422号 )

GMT+8, 2025-2-5 19:56 , Processed in 0.233652 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表