金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 4472|回复: 10

框架下如何调用数据?

[复制链接]

45

主题

257

帖子

262

积分

等级: 免费版

注册:
2021-5-20
曾用名:
发表于 2021-9-6 11:11 | 显示全部楼层 |阅读模式
老师好:
我想做一个PEL公式模块,让VBA公式调用,然后在VBA公式计算出数据,再在图表交易框架中的策略CL_A调用。
该PEL公式模块具有以下功能,可以用于不同品种,不同周期。为VBA公式提供不同品种,不同周期的指标输出线,VBA公式计算后。然后再在图表策略中调用。
如下:
1、建立PEL公式模块MAtrade:
MA5:=MA(CLOSE,5);
MA15:=MA(CLOSE,15);
PKKD:CROSS(MA5,MA15);
PDKK:CROSS(MA15,MA5);
2、建立VBA公式模块:
function MA_CROSS(formula,?)
    a、如何引用PEL公式模块MAtrade的PKKD及PDKK?
     b、计算后得到
          aaa指标
          bbb指标
     c、如何计算不同品种、不同周期aaa及bbb指标,遍历市场品种?请提供一个方案
end sub
3、框架窗格调用策略CL_A如何调用MA_CROSS(formula,?)

请老师帮忙,谢谢。有点搞不清彼此的逻辑。请写个示例。谢谢


回复

使用道具 举报

30

主题

7075

帖子

7085

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2021-9-6 11:18 | 显示全部楼层
vba调用pel指标得方法:品种代码都是参数里填
Set Formula = marketdata.STKINDI("if08","zj","ma(5,10,20,60)",0,0) '调用中金所IF08合约的1分钟的MA移动平均线指标,参数依次是5,10,20,60

msgbox Formula.GetBufData("ma3",924) '显示第925根k线上的MA3指标线数值


pel自定义vba函数方法:http://www.weistock.com/WeisoftHelp/visualbasiczidingyihanshu.htm

不建议用户如果范例看不懂的话去使用,很多情况你可能并不需要真的取vba自定义函数得
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

45

主题

257

帖子

262

积分

等级: 免费版

注册:
2021-5-20
曾用名:
 楼主| 发表于 2021-9-6 11:28 | 显示全部楼层
谢谢老师,我慢慢学!我不用自定义函数,我先实现把VBA公式的aaa指标保存在全局变量。我如何启动VBA程序?写成宏?在工具下的执行宏就会执行吗?请示例,谢谢!

回复

使用道具 举报

30

主题

7075

帖子

7085

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2021-9-6 11:29 | 显示全部楼层
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

45

主题

257

帖子

262

积分

等级: 免费版

注册:
2021-5-20
曾用名:
 楼主| 发表于 2021-9-6 16:32 | 显示全部楼层
老师这是我的学习成果,VBA应用PEL公式WGF的指标线:BKTJ,SKTJ,BPTJ,SPTJ。然后VB遍历市场找出连续合约(以00结尾的合约),分别应用不同合约周期的BKTJ,SKTJ,BPTJ,SPTJ,当指标BKTJ,SKTJ,BPTJ,SPTJ=1,就写入ini文件。请老师指正,谢谢!
Sub APPLICATION_VBAStart()         
    call Application.SetTimer(0,1000) '创建一个0号定时器,间隔时间1秒
End Sub
Sub APPLICATION_VBAend()   
    call Application.KillTimer(0) '创建一个0号定时器,间隔时间1秒
End Sub

Sub APPLICATION_Timer(ID)
    if ID = 0 then      
        'if (cdate(time)<=cdate("11:30:00") and cdate(time)>cdate("9:15:00")) or (cdate(time)<=cdate("15:15:00") and cdate(time)>cdate("13:00:00"))   or (cdate(time)<=cdate("2:30:00") and cdate(time)>cdate("21:00:00")) then     
        '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~全市场扫描~~~~~~~~~~~~~~~~~~~~~~~~~~~

                   '~~~~~~~~~~~~~~~~~~~~~~~以下开始交易~~~~~~~~~~~~~~~~~~~~~~~~~~~
        Dim marketName
        marketName=Array("SQ","DQ","ZQ","ZJ")'此处只查上海及深圳A股"SZ","SH"。不查期货市场"SQ","DQ","ZQ","ZJ",
        '找到股票的代码及名称
        '股票周期  1:1分钟、2:5分钟、3:15分钟、4:30分钟、5:60分钟 6:日、7:周、8:月、9:年、10:多日、11:多分钟、12:多秒
    '13:多小时、14:季度线、15:半年线、16:节气线、17:3分钟、18:10分钟、19:多笔线、20:N日线、21:N分钟线、22:N秒线、23:N笔线、24:N小时线;
        dim DateType
        DateType=Array(2,3,4,5,6,18)'此处只查上海及深圳A股"SZ","SH"。不查期货市场"SQ","DQ","ZQ","ZJ",
        dim markets       
        For j=0 To UBound(marketName)
                Tmarket=marketName(j)'某一市场名称       
                n=marketData.GetReportCount(Tmarket)'某一市场名称下股票或商品的数量       
                For i=0 To n-1
                        Set reportData=marketdata.GetReportDataByIndex(Tmarket,i)'某一市场名称下某种(i号)股票或商品的所有信息(代码、名称等)       
                        if (instr(reportData.Label,"00"))>=0  then'遍历各个市场(交易所),找到连续合约:代码特征包含00字符
                               Tcode=reportData.Label'股票的老代码
                               'Set Formula=marketdata.STKINDI("IF08","ZJ","ma(5,10,20,60)",0,0)'调用中金所IF08合约的1分钟的移动平均线指标,参数依次是5、10、20、60
                               'MsgBox Formula.GetBufData("ma3",924)'显示第925根K线上MA3指标线数值
                               for j=0 to 4
                                   FORMULANAME="WGF"
                                   APP=FORMULANAME & "_" & Tcode & "_" & j
                                   Set Formula=marketdata.STKINDI(Tcode,Tmarket,FORMULANAME,0,j)
                                   BKTJ=Formula.GetBufData("BKTJ",Formula.DataSize-1) '显示第最后根K线上MA3指标线数值
                                   BPTJ=Formula.GetBufData("BPTJ",Formula.DataSize-1)
                                   SKTJ=Formula.GetBufData("SKTJ",Formula.DataSize-1)
                                   SPTJ=Formula.GetBufData("SPTJ",Formula.DataSize-1)
                                   if BKTJ=1 then
                                      Document.WritePrivateProfileInt("F:\mholding.INI",FORMULANAME,"th",1)'写整型变量到INI文件
                                      'Document.GetPrivateProfileInt("E:\Weisoft Stock(x64)\TESTNINIF.INI",FORMULANAME(),th)'从INI文件中读取整型变量
                                   end if
                                   if SKTJ=1 then
                                      Document.WritePrivateProfileInt("F:\mholding.INI",FORMULANAME,"th",-1)'写整型变量到INI文件
                                      'Document.GetPrivateProfileInt("E:\Weisoft Stock(x64)\TESTNINIF.INI",FORMULANAME(),th)'从INI文件中读取整型变量
                                   end if
                                   if BPTJ=1 then
                                      Document.WritePrivateProfileInt("F:\mholding.INI",FORMULANAME,"th",0)'写整型变量到INI文件
                                      'Document.GetPrivateProfileInt("E:\Weisoft Stock(x64)\TESTNINIF.INI",FORMULANAME(),th)'从INI文件中读取整型变量
                                   end if
                                   if SPTJ=1 then
                                      Document.WritePrivateProfileInt("F:\mholding.INI",FORMULANAME,"th",0)'写整型变量到INI文件
                                      'Document.GetPrivateProfileInt("E:\Weisoft Stock(x64)\TESTNINIF.INI",FORMULANAME(),th)'从INI文件中读取整型变量
                                   end if
                                                                                                     
                               next
                               set Formula=nothing                                                                                                                                                                                
                        end if               
                Next        
        Next            
         'end if         
    end if      
end sub
回复

使用道具 举报

30

主题

7075

帖子

7085

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2021-9-6 16:33 | 显示全部楼层
你是遇到啥问题了吗?不要搞那么复杂
你就一个品种一个指标,线msgout输出看有没有

剩下的所谓多品种多少周期就是代码逻辑上自己检查下了
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

45

主题

257

帖子

262

积分

等级: 免费版

注册:
2021-5-20
曾用名:
 楼主| 发表于 2021-9-6 16:46 | 显示全部楼层
谢谢,我试着学写VBA,我按您的办法,逐步复杂。
                                    Document.WritePrivateProfileInt("F:\mholding.INI",FORMULANAME,"th",1)'写整型变量到INI文件。这种写法没问题吧
回复

使用道具 举报

30

主题

7075

帖子

7085

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2021-9-6 17:12 | 显示全部楼层
FORMULANAME="WGF"
这是个变量,不能用()这种方法把
其他好像没啥问题
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

45

主题

257

帖子

262

积分

等级: 免费版

注册:
2021-5-20
曾用名:
 楼主| 发表于 2021-9-7 08:51 | 显示全部楼层
请教老师:
1、在VBA的Function下插入过程,跳出一个对话框,输入公式名+输入参数。完成后得到
function WGF_VBA(Formula,TJ1,TJ2)
    xxxxxxxxxx
end function
2、保存
3、在公式编辑器下调用:
     TJ1:=xxxxxx;
     TJ2:=xxxxxx;
     WGF(Formula,TJ1,TJ2);-------------编译,公式参数不正确
     WGF(TJ1,TJ2);-------------编译,通过,但是输出的结果错误!!
问题:1、function WGF_VBA(Formula,TJ1,TJ2)中的参数TJ1、TJ2可以直接传递pel公式的TJ1、TJ2吗?还是采用如下调用方式:
               Set Formula=marketdata.STKINDI("IF08","ZJ","ma(5,10,20,60)",0,0)'调用中金所IF08合约的1分钟的移动平均线指标,参数依次是5、10、20、60
          2、请老师示例。
         辛苦老师了!!!
回复

使用道具 举报

45

主题

257

帖子

262

积分

等级: 免费版

注册:
2021-5-20
曾用名:
 楼主| 发表于 2021-9-7 08:53 | 显示全部楼层
笔误:
     WGF_VBA(Formula,TJ1,TJ2);-------------编译,公式参数不正确
     WGFVBA(TJ1,TJ2);-------------编译,通过,但是输出的结果错误!!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 06:00 , Processed in 0.279492 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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