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


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

   

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


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

主题:金字塔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编辑过]

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


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

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

 


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

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


加好友 发短信
等级:蜘蛛侠 帖子:1366 积分:5210 威望:0 精华:7 注册:2010/12/11 18:00:33
  发帖心情 Post By:2012/5/13 10:13:20 [显示全部帖子]

继续Order对象

 

4、取消所有委托单

 

Sub CancelAllOrder() '撤销所有委托
     dim Orderid   '订单ID
     dim Filled   '提交手数
     dim Remaining  '剩余手数
     dim Action   '买卖
     dim OrderType  '订单类型
     dim LmtPrice  '委托价
     dim Account   '账户
     dim Kaiping   '开平
     PendingCount=Order.OrderNum2
     For i=0 to PendingCount-1
          Call Order.OrderInfo2(i,OrderID,ConSign,Filled,Remaining,Action,OrderType,LmtPrice,Account,Kaiping,Code,Market) 
          CancelOrder OrderID
     Next
End Sub

这个过程,遍历每一个委托单,逐一进行撤销操作。如果你要撤销指定OrderID的委托单,只需对此过程稍作修改就可以实现了。

 


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


加好友 发短信
等级:蜘蛛侠 帖子:1366 积分:5210 威望:0 精华:7 注册:2010/12/11 18:00:33
  发帖心情 Post By:2012/5/13 10:20:15 [显示全部帖子]

继续Order对象

 

5、获取指定品种的持仓量、持仓均价

private AccountID,iBuyHold,iSellHold,BuyPrice,SellPrice

Sub GetHoldByCode(sAccount,sCode,sMarket)
     dim i,k
     dim BuyHolding
    dim BuyCost
    dim BuyTodayHolding
    dim SellHolding
    dim SellCost
    dim SellTodayHolding
    dim PNL
    dim UseMargin
    dim Code
    dim Market

     On Error resume Next
     AccountStatus=Order.Account2(2,sAccount)
     'application.MsgOut sCode & "," & sMarket & "," & sAccount & ",NextCode:" & NextCode & ",账户状态:" & AccountStatus
      if AccountStatus=255 Or AccountStatus="" then
          exit sub
      end if 
      Call Order.HoldingInfoByCode2(sCode,sMarket,BuyHolding,BuyCost,BuyTodayHolding,SellHolding,SellCost,SellTodayHolding,PNL,UseMargin,sAccount)
     iBuyHold=BuyHolding
     iSellHold=SellHolding
     BuyPrice=BuyCost
     SellPrice=SellCost  
End Sub

 

这个过程也是将返回的值保存到外部变量,供其他过程使用。所以过程前的定义变量必不可少。

使用方式:GetHoldByCode "8888888","IF05","ZJ"      '传入交易账户、合约代码、市场代码

 

 


 回到顶部
总数 45 1 2 3 4 5 下一页