CTP 接口COM封装使用指南.docx
《CTP 接口COM封装使用指南.docx》由会员分享,可在线阅读,更多相关《CTP 接口COM封装使用指南.docx(21页珍藏版)》请在冰豆网上搜索。
![CTP 接口COM封装使用指南.docx](https://file1.bdocx.com/fileroot1/2022-11/30/f88a87ed-ba4b-4c0a-82ac-4b62bd923669/f88a87ed-ba4b-4c0a-82ac-4b62bd9236691.gif)
CTP接口COM封装使用指南
CTP接口COM封装使用指南
盈佳发布了一个基于COM标准的CTP-API接口封装,通过这个COM接口,用户可以利用任何支持COM的语言来接入CTP;该COM组件在内部进行仓位和资金的自动计算,并对用户屏蔽了上期所的平今和平昨的差别(优先平今),对用户非常友好。
1.1COM包构成
该COM组件在运行时,需要下面几个文件:
✧ctpcom.dll
✧thosttraderapi.dll
✧thostmduserapi.dll
✧config.xml(可以有多个,不同的期货公司需要不同的配置文件,在登录时指定这个配置文件的名称)
✧error.xml,error.dtdctp中错误信息定义
1.2COM注册
在使用COM组件之间,需要先注册注本COM组件,步骤如下:
✧运行cmd,
✧cd到ctpcom.dll所在的目录,
✧运行Regsvr32ctpcom.dll
1.3COM接口方法
该COM提供的接口(c++语言描述)如下:
✧Login([in]BSTRConfigFile,[in]BSTRUserID,[in]BSTRPassword,[out]int*ErrorID);
说明:
登录到CTP系统。
必须首先调用该方法成功登录后,
才能调用其他方法。
参数:
ConfigFile,配置文件的名称,该配置文件必须和
ctpcom.dll放在同一个目录下。
通过指定不通的配置文件,可以创建多个ctpcom对象,连接到不同的期货经纪公司。
UserID,投资者账户名
Password,投资者密码;
ErrorID,返回登录错误代码,为0时表示登录成功,
其他值表示登录失败。
✧Buy([in]BSTRpszInstrumentID,[in]intvolume,[in]doubleprice,[out]long*OrderID);
说明:
对指定的合约买入开仓;
参数:
pszInstrumentID,合约代码,区分大小写;
volume,开仓手数,
price,开仓价格,0表示以市价开仓(对于上期所,
以停板价+立即撤单来模拟)
OrderID,返回该报单的唯一编号,可以通过这个编号
来跟踪此报单;
✧Sell([in]BSTRpszInstrumentID,[in]intvolume,[in]doubleprice,[out]long*OrderID);
说明:
对指定的合约卖出平仓;
参数:
pszInstrumentID,合约代码,区分大小写;
volume,平仓手数,
price,平仓价格,0表示以市价平仓(对于上期所,
以停板价+立即撤单来模拟)
OrderID,返回该报单的唯一编号,可以通过这个编号
来跟踪此报单;
✧Short([in]BSTRpszInstrumentID,[in]intvolume,[in]doubleprice,[out]long*OrderID);
说明:
对指定的合约卖出开仓;
参数:
pszInstrumentID,合约代码,区分大小写;
volume,开仓手数,
price,开仓价格,0表示以市价开仓(对于上期所,
以停板价+立即撤单来模拟)
OrderID,返回该报单的唯一编号,可以通过这个
编号来跟踪此报单;
✧Cover([in]BSTRpszInstrumentID,[in]intvolume,[in]doubleprice,[out]long*OrderID);
说明:
对指定的合约买入平仓;
参数:
pszInstrumentID,合约代码,区分大小写;
volume,平仓手数,
price,平仓价格,0表示以市价平仓(对于上期所,
以停板价+立即撤单来模拟)
OrderID,返回该报单的唯一编号,可以通过这个编号来
跟踪此报单;
✧PlaceOrder([in]BSTRpszInstrumentID,[in]intbuySell,[in]intopenClose,[in]intvolume,[in]doubleprice,[out]long*OrderID);
说明:
对指定的合约买入平仓;
参数:
pszInstrumentID,合约代码,区分大小写;
buySell,买卖,0为买,1为卖;
openClose,开平,0为开,1为平;
volume,平仓手数,
price,平仓价格,0表示以市价平仓(对于上期所,
以停板价+立即撤单来模拟)
OrderID,返回该报单的唯一编号,可以通过这个编号来
跟踪此报单;
✧CancelOrder([in]longOrderID,[out]int*status);
说明:
对指定的报单进行撤单操作;
参数:
OrderID,指定的报单号;
Status,返回代码,>0表示已经对该报单发出撤单指令,
<=0表示该报单不存在,或者已经不可撤;
✧SubscribeMD([in]BSTRInstrumentID);
说明:
订阅某个合约的行情数据。
在订阅了后,会通过OnMarketData事件将该合约的行情发出。
参数:
InstrumentID–合约代码,区分大小写。
✧GetLongPos([in]BSTRInstrumentID,[out]long*LongPos,[out]double*PositionPrice);
说明:
返回某个合约的多头(买持)仓位。
参数:
InstrumentID–合约代码,区分大小写。
LongPos–返回的多头(买持)仓位大小;
PositionPrice-多头仓位的持仓均价;
✧GetLongClosable([in]BSTRInstrumentID,[out]long*LongClosable);
说明:
返回某个合约的多头(买持)可平仓位。
参数:
InstrumentID–合约代码,区分大小写。
LongClosable–返回的多头(买持)仓位可平量;
✧GetShortPos([in]BSTRInstrumentID,[out]long*ShortPos,[out]double*PositionPrice);
说明:
返回某个合约的空头(卖持)仓位。
参数:
InstrumentID–合约代码,区分大小写。
LongPos–返回的空头(卖持)仓位大小;
PositionPrice-多头仓位的持仓均价;
✧GetShortClosable([in]BSTRInstrumentID,[out]long*ShortClosable);
说明:
返回某个合约的空头(卖持)可平仓位。
参数:
InstrumentID–合约代码,区分大小写。
ShortClosable–返回的空头(卖持)仓位的可平量;
✧IsOrderOpen([in]longOrderID,[out]BOOL*IsOpen);
说明:
判断某个报单是否处于可撤状态。
参数:
OrderID–报单编号。
IsOpen–不为0表示处于可撤状态,0表示不可撤;
✧GetMarketData([in]BSTRInstrumentID,[out]double*YdClose,[out]double*YdSettlement,[out]double*Open,[out]double*Last,[out]double*Bid1,[out]double*Ask1,[out]int*Bid1Volume,[out]int*Ask1Volume,[out]double*Highest,[out]double*Lowest,[out]int*TradedVolume,[out]double*TradedAmmount);
说明:
获取一个合约当前最新行情数据。
参数:
InstrumentID–指定合约编号。
YdClose–昨日收盘价;
YdSettlement-昨日结算价
Open-今日开盘价
Last-今日最新价
Bid1-买一价
Ask1-卖一价
Bid1Volume-买一量
Ask1Volume-卖一量
Highest-今日最高价
Lowest-今日最低价
TradedVolume-今日成交量
TradedAmmount-今日成交额
✧GetAccount([out]double*Balance,[out]double*Available);
说明:
获取当前帐户的用户权益和可用资金。
参数:
Balance-当前帐户的用户权益可用资金
Available-当前帐户的可用资金
✧GetInstruments([out]SAFEARRAY(InstrumentField)*ppIns,[out]int*Count)
说明:
获取所有合约列表;
参数:
ppIns–InstrumentField指针数组;
Count-合约数目,
✧GetInstrumentInfo([in]BSTRInstrumentID,[out]int*Multiply,[out]double*PriceUnit);
说明:
获得一个合约的乘数和最小价格变动单位;该方法需要在OnInitFinished事件之后调用。
参数:
InstrumentID–合约编号
Multiply–合约乘数;
PriceUnit–合约最小价格变动单位;
✧GetMarginRate([in]BSTRInstrumentID,[out]double*MarginRate,[out]BSTR*ExpireDate);
说明:
获得一个合约的保证金率乘数和到期日,该方法需要在OnInitFinished事件之后调用,MarginRate在第一次调用时可能不能返回,此时可以在OnMarginRate事件中接受。
参数:
InstrumentID–合约编号
MarginRate–合约乘数;
ExpireDate–合约最小价格变动单位;
✧CreateKBars(BSTRInstrumentID,intPeriod,intInterval);
说明:
创建一个Bar序列,之后,COM会通过OnBar事件将生成的Bar推送出来。
参数:
InstrumentID–合约代码;
Period–周期类型,0–分钟线1-小时线;
Interval-周期大小;大于1
1.4COM触发事件
客户端通过事件来接受行情、资金和仓位等信息。
该COM组件发出的事件如下:
✧OnAccount–当投资者账户信息发生变化时,此事件被触发;
参数:
PreBalance期初用户权益
Balance当前用户权益
Available当前可用资金
Commission今日以发生手续费
FrozenCommission今日冻结手续费
Margin占用保证金
FrozenMargin今日冻结保证金
CloseProfit今日平仓盈亏
PositionProfit持仓盈亏
✧OnMarketData-当某个合约有新行情到达时,此事件被触发;
参数:
InstrumentID合约编号
BidPrice1买一价
BidVolume1买一量
AskPrice1卖一价
AskVolume1卖一量
OpenPrice开盘价
HighestPrice最高价
LowestPrice最低价
LastPrice最新价
OpenInterest持仓量
Volume成交量
UpperLimitPrice涨停价
LowerLimitPrice跌停价
PreSettlementPrice昨结算价
AveragePrice今日平均价
UpdateTime行情更新时间
UpdateMilliSecond更新毫秒数为0或500
✧OnOrder–当某个报单信息发生变化时,此事件被触发;
参数:
OrderID报单编号
InstrumentID和约编号
IsBuy是否为买,非0为买,否则为卖;
IsOpen是否开仓,非0为开仓,否则为平仓
Volume委托数量
Price委托价格
TradedVolume已成交数量
AvgTradePrice成交均价
OrderStatus报单当前状态
OrderSysID交易所报单号
InsertTime委托时间
StatusMsg状态信息,如果该报单失败,则为失败原因。
✧OnOrderCanceled-当出现报单错误或者报单被撤时,此事件被触发;
参数:
OrderID-报单编号
ErrorID-当为错单时的错误编号;
ErrorMsg-当为错单时的错误信息;
✧OnOrderFinished–当某个报单全部成交后,此事件被触发;此事件总是在一个报单的所有OnTrade事件之后发生。
参数:
OrderID报单编号
✧OnPosition–当某个合约的仓位信息发生变化时,此事件被触发;
参数:
InstrumentID-合约代码
IsLong-是否为多仓
Volume-持仓量
CloseProfit-今日平仓盈亏
PositionProfit持仓盈亏
AvgPositionPrice持仓均价昨仓,是结算之后的均价;
AvgOpenPrice开仓均价;按开仓价计算的均价;
TotalClosable总可平量
TodayClosable今日可平量
✧OnTrade-当所发出的报单有成交时,此事件被触发;
参数:
OrderID报单编号
InstrumentID合约代码
IsBuy是否为买,非0为买,否则为卖;
IsOpen是否开仓,非0为开,否则为平;
ThisTradeVolume本次成交数量
ThisTradePrice本次成交均价
TradeTime成交时间;
✧OnTradeConnected-当交易连线后,此事件被触发;
✧OnTradeDisconnected-当交易断线后,此事件被触发;
✧OnMDConnected-当行情连线后,此事件被触发;
✧OnMDDisconnected-当行情断线后,此事件被触发;
✧OnOrderActionFailed([in]longOrderID,[in]intErrorID);当撤单失败时,此事件被触发;
✧OnInstrumentStatus–交易所状态信息通知
参数:
InstrumentID–交易所随机选择的一个合约;
ExchangeID–交易所代码:
CFFEX中金所;
SHFE上期所;
DCE大商所;
CZCE郑商所;
EnterTime–进入本状态时间;
NewState–当前状态;其值如下所示:
//开盘前
#defineTHOST_FTDC_IS_BeforeTrading'0'
///非交易
#defineTHOST_FTDC_IS_NoTrading'1'
///连续交易
#defineTHOST_FTDC_IS_Continous'2'
///集合竞价报单
#defineTHOST_FTDC_IS_AuctionOrdering'3'
///集合竞价价格平衡
#defineTHOST_FTDC_IS_AuctionBalance'4'
///集合竞价撮合
#defineTHOST_FTDC_IS_AuctionMatch'5'
///收盘
#defineTHOST_FTDC_IS_Closed'6'
✧OnInitFinished–相关初始化工作完成,在这个事件通知之后,可以通过GetInstruments方法获得所有合约列表。
✧OnMarginRate
Desc:
Firedwhenaninstruments’marginratewasqueriedback.
Params:
InstrumentID
longMarginRate
shortMarginRate
✧OnCommissionRate
Desc:
Firedwhenaninstruments’commissionratewasqueriedback.
Params:
InstrumentID
OpenCommissionRateByMoney
OpenCommissionRateByVolume
CloseCommissionRateByMoney
CloseCommissionRateByVolumeCloseTodayCommissionRateByMoneyCloseTodayCommissionRateByVolume
✧OnBar–新创建了Bar或者某个Bar被关闭;
参数:
InstrumentID–合约编号;
BeginTime–本Bar的开始时间;
Period–周期类型,0–分钟线;1–小时线;
Interval–周期大小;
Open–本Bar的开盘价,
High–本Bar的最高价;
Low-本Bar的最低价;
Close–本Bar的收盘价;
Volume-本bar时间内的成交量;
Position-本Bar结束时的持仓量;
Status–本Bar的状态,0-未关闭,1–关闭;
注1:
接口中涉及到的ErrorID和ErrorMsg参见发布包中的error.xml;
注2:
OrderStatus的取值如下:
///全部成交
#defineTHOST_FTDC_OST_AllTraded'0'
///部分成交还在队列中
#defineTHOST_FTDC_OST_PartTradedQueueing'1'
///部分成交不在队列中
#defineTHOST_FTDC_OST_PartTradedNotQueueing'2'
///未成交还在队列中
#defineTHOST_FTDC_OST_NoTradeQueueing'3'
///未成交不在队列中
#defineTHOST_FTDC_OST_NoTradeNotQueueing'4'
///撤单
#defineTHOST_FTDC_OST_Canceled'5'
///未知
#defineTHOST_FTDC_OST_Unknown'a'
///尚未触发
#defineTHOST_FTDC_OST_NotTouched'b'
///已触发
#defineTHOST_FTDC_OST_Touched'c'
1.5COM使用示例
1.5.1Excel示例
见ctpcom_sample.xls
1.5.2VB6.0示例
DimWithEventsctpAsICTPClientAPI
PrivateSubLogin_Click()
DimerrorIDAsLong
DimsuccAsLong
Setctp=NewCTPCOMLib.ICTPClientAPI
Callctp.Login("config.xml","00100","888888",errorID)
IferrorID=0Then
MsgBox"登录ok"
Else
MsgBox"登录错误:
"&errorID
EndIf
EndSub
PrivateSubBuy_Click()
DimOrderIDAsLong
DimindexAsInteger
Dimtm1,tm2AsDate
Callctp.Buy("IF1008",1,0,OrderID)
EndSub
PrivateSubMD_Click()
Callctp.SubscribeMD("IF1008")
EndSub
PrivateSubClose_Click()
Setctp=Nothing
EndSub
PrivateSubSell_Click()
DimOrderIDAsLong
Callctp.Sell("IF1008",1,0,OrderID)
EndSub
PrivateSubctp_OnAccount(ByValPreBalanceAsDouble,ByValBalanceAsDouble,ByValAvailableAsLong,ByValCommissionAsDouble,ByValFrozenCommissionAsDouble,ByValMarginAsDouble,ByValFrozenMarginAsDouble,ByValCloseProfitAsDouble,ByValPositionProfitAsDouble)
Label1.Caption=Available
EndSub
PrivateSubctp_OnMarketData(ByValInstrumentIDAsString,ByValBidPrice1AsDouble,ByValBidVolume1AsLong,ByValAskPrice1AsDouble,ByValAskVolume1AsLong,ByValOpenPriceAsDouble,ByValHighestPriceAsDouble,ByValLowestPriceAsDouble,ByValLastPriceAsDouble,ByValOpenInterestAsLong,ByValVolumeAsLong,ByValUpperLimitPriceAsDouble,ByValLowerLimitPriceAsDouble,ByValPreSettlementPriceAsDouble,ByValAveragePriceAsDouble,ByValUpdateTimeAs