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


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件高级功能研发区 → 金字塔VBA常用对象使用范例

   

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


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

主题:金字塔VBA常用对象使用范例

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


加好友 发短信
等级:蜘蛛侠 帖子:1366 积分:5210 威望:0 精华:7 注册:2010/12/11 18:00:33
金字塔VBA常用对象使用范例  发帖心情 Post By:2012/5/11 17:31:37 [只看该作者]

    金字塔vba编写策略经常使用的对象,在编程帮助中有很多介绍,但是例子相对较少,本人经过2年来对金字塔vba策略的编写,积累了大量的例子,从今天开始我将不定期整理出来供大家借鉴参考,本楼将是一个目录,供快速浏览。

 

    特别常用的对象:

    一、Application对象..............本页2-3楼

    二、Order对象....................7-13楼、19楼-20楼/22楼

    三、MarketData对象...............36、37楼

            (http://www.weistock.com/bbs/dispbbs.asp?boardid=5&id=11642&authorid=0&page=1&star=4)

    四、Document对象.................39-40楼/74楼

            (http://www.weistock.com/bbs/dispbbs.asp?boardid=5&Id=11642&page=1&star=4)

            (http://www.weistock.com/bbs/dispbbs.asp?boardid=5&Id=11642&page=1&star=8)

             五、ReportData对象...............................51楼

                            (http://www.weistock.com/bbs/dispbbs.asp?boardid=5&id=11642&page=1&star=6) 

             六、MinuteData对象和HistoryData对象......................53楼

                            http://www.weistock.com/bbs/dispbbs.asp?boardid=5&id=11642&authorid=0&page=1&star=6

 

             七、Menu对象................................................56楼

                        ( http://www.weistock.com/bbs/dispbbs.asp?boardid=5&Id=11642&page=1&star=6

 

 

 

 本目录根据需要不断完善

[此贴子已经被作者于2012-9-5 8:31:18编辑过]

[本帖被加为精华]
 回到顶部
帅哥哟,离线,有人找我吗?
guotx2010
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:蜘蛛侠 帖子:1366 积分:5210 威望:0 精华:7 注册:2010/12/11 18:00:33
  发帖心情 Post By:2012/5/12 9:04:27 [只看该作者]

一、Application对象
    1、基本介绍
UserName:返回金字塔用户账号,不是你的交易账号。例如:abc=Application.UserName,就可以把当前登录的用户账号赋给abc变量,使用下面的程序可以显示登录账号的信息
iVer=Application.UserType
                if iVer<2 then
                       Application.MsgOut "你的金字塔版本不支持本程序,请升级账户"
                       exit sub
               end if
        End Sub

        (3)EnginCode:返回当前用户计算机的机器识别码(只读)

        此属性的应用场景是限定特定的用户才能使用本程序,因为金字塔软件在每一台机上的识别码都是不相同的,你就可以判断客户的本属性是否与设定值相同,不相同就不让他运行。

        Sub Application_VbaStart()

                dim sEnginCode
                dim sTestCode
                sTestCode="35A7707C1617CBE0"                '本行字符串改为你设定的识别码
                sEnginCode=Application.EnginCode
                if  strcomp(sEnginCode,sTestCode,vbtextCompare)<>0 then
                    Application.MsgOut "你的不是授权用户,不能使用本程序"
                    exit sub
                end if
        End Sub
   '如果没有打开ABC的框架,就打开     
   if Application.isActivateFrame("ABC")=0 then
Call application.ActivateFrame("ABC")
   end if
     
ActivateFrameWithCode方法:
这个方法是对ActivateFrame方法的扩充,可以激活框架的同时指定品种和周期,如: Call Application.ActivateFrameWithCode("ABC","IF05","ZJ",0)将激活框架ABC,并在框架中打开IF05合约的1分钟分析图。
Cyc 参数为 -1 时,打开分时走势界面。
Sub Application_VBAStart()
    Call Application.SetTimer(0,2*1000)      '设置一个0号计时器,间隔2秒执行一次
    Call Application.Settimer(9,5*1000)      '设置一个9号计时器,间隔5秒执行一次
End Sub
 
'下面的过程是计时器循环体,我让计时器显示每次触发的时间,你看看是不是间隔设定的秒数就触发。
Sub Application_Timer(ID)
    If ID=0 then
        Application.msgout Cdate(time) & ",0号计时器触发了"
    end if
    If ID=9 then
        Application.msgout Cdate(time) & ",9号计时器触发了"
    end if
End Sub
[此贴子已经被作者于2012-7-26 21:40:23编辑过]

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


加好友 发短信
等级:蜘蛛侠 帖子:1366 积分:5210 威望:0 精华:7 注册:2010/12/11 18:00:33
  发帖心情 Post By:2012/5/12 10:15:14 [只看该作者]

4、Application的事件

         Start 应用程序启动后发生。

                 写法:

                 Sub Application_Start()             '下面的事件都是加上 Application_ 不再赘述

                        '你的代码段

                 End Sub

         Close 应用程序关闭时发生。

         Timer 当达到SetTimer方法所设定的定时值后发生。其参数为定时器的标识符。(前面有例子)

         VBAStart  VBA宏启动运行后发生。(前面有例子)

         VBAEnd    VBA宏停止运行后发生


特别需要注意的地方:
    1、计时器一旦设置,如果不显式销毁,下次启动vba时依然会生效的。
所以,你要记住在Application_VBAEnd事件中使用Killtimer来销毁计时器。
     2、Application_VBAStart只能有一个,你不要在多个模块中拥有多个vbastart事件,那样系统就会出错的。
 
 
[此贴子已经被作者于2012-5-13 8:59:51编辑过]

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


加好友 发短信
等级:管理员 帖子:7302 积分:32559 威望:1000 精华:45 注册:2003/12/30 16:34:32
  发帖心情 Post By:2012/5/12 12:49:41 [只看该作者]

写得不错的,继续就好了,最后再重新进行一下就行了

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


加好友 发短信
等级:论坛游民 帖子:132 积分:775 威望:0 精华:0 注册:2011/12/27 11:53:44
  发帖心情 Post By:2012/5/12 13:58:18 [只看该作者]

很好,学习。图片点击可在新窗口打开查看

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


加好友 发短信
等级:蜘蛛侠 帖子:1366 积分:5210 威望:0 精华:7 注册:2010/12/11 18:00:33
  发帖心情 Post By:2012/5/13 9:19:01 [只看该作者]

格式编排很麻烦,代码显得有点乱,实在没办法,大家凑合凑合看吧,早上修改一个地方的时候,居然还出现内容删除的毛病。

 


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


加好友 发短信
等级:蜘蛛侠 帖子:1366 积分:5210 威望:0 精华:7 注册:2010/12/11 18:00:33
  发帖心情 Post By:2012/5/13 9:39:03 [只看该作者]

二、Order对象

    1、基本介绍:Order对象是你在金字塔软件下使用VBA下单和查询订单的对象,其重要程度不言而喻了吧。

    2、主要属性:(本帖以CTP平台为主要平台,以下讲到的都是CTP平台使用的)

    (1)Holding2:得到当前指定帐户的国内期货持仓品种数量

    (2)OrderNum2:得到所有国内期货当前有效的未成交合约品种数量

    (3)OrderQueue:顺序执行下单成交,即按委托顺序成交报单,可以用于平仓反手,套利等委托动作

    3、有用的方法:

      Account:得到当前默认帐户信息
      Account2:得到指定的国内期货帐户信息
      Buy:开多操作
      Sell:平多操作
      BuyShort:开空操作
      SellShort:平空操作
      CancelOrder:执行撤单操作
      HoldingInfo2:取指定索引的指定CTP帐户的合约持仓信息
      HoldingInfoByCode2:取指定CTP品种的持仓合约信息
      OrderInfoByCode:取指定品种的未成交IB合约信息
      OrderInfo2:取指定索引的未成交CTP合约信息
      OrderInfoByCode2:取指定品种的未成交CTP合约信息
      Contract:取指定品种的合约信息
      ChargeByNum:计算指定品种的本次交易手续费用
      IsAccount:判断指定帐号是否是当前已登录有效帐号,例如 Order.IsAccount("351579"),如果该账户已登录则返回1,否则返回0

    4、事件

      OrderStatusEx2:当委托订单出现变化时发生该扩展事件,比如撤单、成交等

 


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


加好友 发短信
等级:蜘蛛侠 帖子:1366 积分:5210 威望:0 精华:7 注册:2010/12/11 18:00:33
  发帖心情 Post By:2012/5/13 9:49:42 [只看该作者]

接上楼,继续Order对象。

 

应用场景及代码片段:

1、获取指定者账户的所有持仓合约,保存到一个字符串中。

此例需要解决的问题:首先要获取账户的总持仓数,需要用到Holding2属性,然后要逐一循环取出每一个持仓合约的持仓量,需要用到HoldingInfo2方法。

function GetHoldStr(sAccount)
 dim i
 dim BuyHold
 dim BuyCost
 dim SellHold
 dim SellCost
 dim CurCode
 dim CurMarket
 
  On Error resume Next
  HoldStr=""
 HoldingCount=Order.Holding2(sAccount)
  If HoldingCount>0 then
   For i=0 to HoldingCount-1
    Call Order.HoldingInfo2(i,BuyHolding,BuyCost,BuyTodayHolding,SellHolding,SellCost,SellTodayHolding,PNL,UseMargin,Code,Market,sAccount)
    CurCode=Code
    CurMarket=Market
    BuyHold=BuyHolding
    SellHold=SellHolding
    HoldStr=HoldStr & CurCode
    if BuyHold>0 then
      HoldStr=HoldStr & ":+" & BuyHold
    end if
    if SellHold>0 then 
      HoldStr=HoldStr & ":-" & SellHold
    end if 
    HoldStr=HoldStr & ","
   Next
   HoldStr=Left(HoldStr,len(HoldStr)-1)
  End If 

  GetHoldStr=HoldStr
End function

本代码使用函数方式,传递一个账户号码,就可以获取该账户的持仓信息,调用方法是:hold=GetHoldStr("88888888")。

 


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


加好友 发短信
等级:蜘蛛侠 帖子:1366 积分:5210 威望:0 精华:7 注册:2010/12/11 18:00:33
  发帖心情 Post By:2012/5/13 9:56:03 [只看该作者]

继续Order对象

2、获取指定合约的信息,包括合约最小跳动单位,合约保证金比例、合约乘数。

private iMultipliter,iMinTick,iShortPercent,iLongPercent

Sub GetContractHold(sCode,sMarket)  '获取合约的信息
     'Application.MsgOut sCode & "," & sMarket
     on error resume next
     Call Order.Contract(sCode,sMarket,Multipliter,MinTick,ShortPercent,LongPercent)
     iMultipliter=Multipliter
     'application.MsgOut iMultipliter
     iMinTick=MinTick
     iShortPercent=ShortPercent
     iLongPercent=LongPercent
End Sub

本例使用变量来存储合约信息的4个值,所以,变量定义置于过程顶端,调用本过程之后,变量就存储了该合约的对应值,其他过程就可以直接使用了。

 

 

[此贴子已经被作者于2012-5-13 9:59:09编辑过]

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


加好友 发短信
等级:蜘蛛侠 帖子:1366 积分:5210 威望:0 精华:7 注册:2010/12/11 18:00:33
  发帖心情 Post By:2012/5/13 9:58:36 [只看该作者]

继续Order对象

 

3、获取未成交的订单信息

Function GetPendingOrder(sCode,sMarket)  '获取未成交单
 dim Orderid   '订单ID
 dim Filled   '提交手数
 dim Remaining  '剩余手数
 dim Action   '买卖
 dim OrderType  '订单类型
 dim LmtPrice  '委托价
 dim Account   '账户
 dim Kaiping   '开平

 GetPendingOrder=0
 PendingCount=Order.OrderNum2
 For i=0 to PendingCount-1
      Call Order.OrderInfo2(i,OrderID,ConSign,Filled,Remaining,Action,OrderType,LmtPrice,Account,Kaiping,Code,Market)

      if Code=sCode then

           GetPendingOrder=OrderID

      end if

Next

end function

 

本函数返回指定合约的未成交单的订单号,调用方法:OrdID=GetPendingOrder("IF05","ZJ"),然后根据这个返回的OrdID,你可以进行其他的操作,比如,如果是要下单,先看有没有未成交的委托单,如果有就不下单,或者取消该委托单然后再下单等。

 

[此贴子已经被作者于2012-5-13 10:08:05编辑过]

 回到顶部
总数 108 1 2 3 4 5 6 7 8 9 10 下一页 ..11