金字塔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)
本目录根据需要不断完善
(3)EnginCode:返回当前用户计算机的机器识别码(只读)
此属性的应用场景是限定特定的用户才能使用本程序,因为金字塔软件在每一台机上的识别码都是不相同的,你就可以判断客户的本属性是否与设定值相同,不相同就不让他运行。
Sub Application_VbaStart()
Start 应用程序启动后发生。
写法:
Sub Application_Start() '下面的事件都是加上 Application_ 不再赘述
'你的代码段
End Sub
Close 应用程序关闭时发生。
Timer 当达到SetTimer方法所设定的定时值后发生。其参数为定时器的标识符。(前面有例子)
VBAStart VBA宏启动运行后发生。(前面有例子)
VBAEnd VBA宏停止运行后发生
格式编排很麻烦,代码显得有点乱,实在没办法,大家凑合凑合看吧,早上修改一个地方的时候,居然还出现内容删除的毛病。
二、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:当委托订单出现变化时发生该扩展事件,比如撤单、成交等
接上楼,继续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")。
继续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个值,所以,变量定义置于过程顶端,调用本过程之后,变量就存储了该合约的对应值,其他过程就可以直接使用了。
继续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,你可以进行其他的操作,比如,如果是要下单,先看有没有未成交的委托单,如果有就不下单,或者取消该委托单然后再下单等。