TdApi中增加报单回报和成交回报的回调函数
代码: 全选
#----------------------------------------------------------------------
def onRtnOrder(self, data):
"""报单回报"""
# 更新最大报单编号
newref = data['OrderRef']
self.orderRef = max(self.orderRef, int(newref))
# 常规报单事件
event1 = Event(type_=EVENT_ORDER)
event1.dict_['data'] = data
self.__eventEngine.put(event1)
#----------------------------------------------------------------------
def onRtnTrade(self, data):
"""成交回报"""
event = Event(type_=EVENT_TRADE)
event.dict_['data'] = data
self.__eventEngine.put(event)
mainEngine中增加相应的委托和成交的函数,也是先简单地打印出来
代码: 全选
def order(self, event):
data = event.dict_['data']
print(data)
def trade(self, event):
data = event.dict_['data']
print(data)
在__init__把这两个方法注册到事件引擎
代码: 全选
self.ee.register (EVENT_TRADE, self.trade)
self.ee.register (EVENT_ORDER, self.order)
运行正常,因为是周末没有委托成交信息
代码: 全选
行情服务器连接成功
交易服务器连接成功
行情服务器登录完成
100897交易服务器登录完成
结算信息确认完成
合约信息查询完成
合约信息已经保存
合约截面数据查询完成
合约截面数据已经保存
最新价: 3787.0
收到查询资金的回报
收到查询持仓的回报
收到查询持仓的回报
收到查询持仓的回报
报单、撤单
先从我的github下载ctp_data_type.py和constant.py,增加到程序所在的目录。ctp_data_type这个模块中保存着CTP系统中用到的数据类型和常量定义。举个例子,服务器推送过来报单的状态是用0、1、2、3这样的数字表示的,我们没办法记住每个数字代表的意思,直接写数字也会导致出错时无从改起。因此导入这个模块,然后用THOST_FTDC_OST_AllTraded这种从名字上能看出信息的方式来写。constant里面类似地保存着一些常用的常量。
代码: 全选
#全部成交
defineDict["THOST_FTDC_OST_AllTraded"] = '0'
#部分成交还在队列中
defineDict["THOST_FTDC_OST_PartTradedQueueing"] = '1'
#部分成交不在队列中
defineDict["THOST_FTDC_OST_PartTradedNotQueueing"] = '2'
#未成交还在队列中
defineDict["THOST_FTDC_OST_NoTradeQueueing"] = '3'
#未成交不在队列中
defineDict["THOST_FTDC_OST_NoTradeNotQueueing"] = '4'
#撤单
defineDict["THOST_FTDC_OST_Canceled"] = '5'
#未知
defineDict["THOST_FTDC_OST_Unknown"] = 'a'
代码: 全选
# 价格类型映射
priceTypeMap = {}
priceTypeMap[PRICETYPE_LIMITPRICE] = defineDict["THOST_FTDC_OPT_LimitPrice"]
priceTypeMap[PRICETYPE_MARKETPRICE] = defineDict["THOST_FTDC_OPT_AnyPrice"]
priceTypeMapReverse = {v: k for k, v in priceTypeMap.items()}
# 方向类型映射
directionMap = {}
directionMap[DIRECTION_LONG] = defineDict['THOST_FTDC_D_Buy']
directionMap[DIRECTION_SHORT] = defineDict['THOST_FTDC_D_Sell']
directionMapReverse = {v: k for k, v in directionMap.items()}
# 开平类型映射
offsetMap = {}
offsetMap[OFFSET_OPEN] = defineDict['THOST_FTDC_OF_Open']
offsetMap[OFFSET_CLOSE] = defineDict['THOST_FTDC_OF_Close']
offsetMap[OFFSET_CLOSETODAY] = defineDict['THOST_FTDC_OF_CloseToday']
offsetMap[OFFSET_CLOSEYESTERDAY] = defineDict['THOST_FTDC_OF_CloseYesterday']
offsetMapReverse = {v:k for k,v in offsetMap.items()}
从vnpy搬运委托对象
代码: 全选
class CtaOrderReq(object):
"""发单时传入的对象类"""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
self.symbol = EMPTY_STRING # 代码
self.exchange = EMPTY_STRING # 交易所
self.price = EMPTY_FLOAT # 价格
self.volume = EMPTY_INT # 数量
self.priceType = EMPTY_STRING # 价格类型
self.direction = EMPTY_STRING # 买卖
self.offset = EMPTY_STRING # 开平
代码: 全选
def sendOrder(self, orderReq):
"""发单"""
self.reqID += 1
self.orderRef += 1
req = {}
req['InstrumentID'] = orderReq.symbol # 合约代码
req['LimitPrice'] = orderReq.price # 价格
req['VolumeTotalOriginal'] = orderReq.volume # 数量
# 下面如果由于传入的类型本接口不支持,则会返回空字符串
req['OrderPriceType'] = priceTypeMap.get(orderReq.priceType, '') # 价格类型
req['Direction'] = directionMap.get(orderReq.direction, '') # 方向
req['CombOffsetFlag'] = offsetMap.get(orderReq.offset, '') # 组合标志
req['OrderRef'] = str(self.orderRef) # 报单引用
req['InvestorID'] = self.userID # 投资者代码
req['UserID'] = self.userID # 账号
req['BrokerID'] = self.brokerID # 经纪商代码
req['CombHedgeFlag'] = defineDict['THOST_FTDC_HF_Speculation'] # 投机单
req['ContingentCondition'] = defineDict['THOST_FTDC_CC_Immediately'] # 立即发单
req['ForceCloseReason'] = defineDict['THOST_FTDC_FCC_NotForceClose'] # 非强平
req['IsAutoSuspend'] = 0 # 非自动挂起
req['TimeCondition'] = defineDict['THOST_FTDC_TC_GFD'] # 今日有效
req['VolumeCondition'] = defineDict['THOST_FTDC_VC_AV'] # 任意成交量
req['MinVolume'] = 1 # 最小成交量为1
# 判断FAK和FOK
if orderReq.priceType == PRICETYPE_FAK:
req['OrderPriceType'] = defineDict["THOST_FTDC_OPT_LimitPrice"]
req['TimeCondition'] = defineDict['THOST_FTDC_TC_IOC']
req['VolumeCondition'] = defineDict['THOST_FTDC_VC_AV']
if orderReq.priceType == PRICETYPE_FOK:
req['OrderPriceType'] = defineDict["THOST_FTDC_OPT_LimitPrice"]
req['TimeCondition'] = defineDict['THOST_FTDC_TC_IOC']
req['VolumeCondition'] = defineDict['THOST_FTDC_VC_CV']
self.reqOrderInsert(req, self.reqID)
# 返回订单号(字符串),便于某些算法进行动态管理
return str(self.orderRef)
代码: 全选
def cancelOrder(self, cancelOrderReq):
"""撤单"""
self.reqID += 1
req = {}
req['ExchangeID'] = cancelOrderReq.exchange
req['OrderSysID'] = cancelOrderReq.OrderSysID
req['ActionFlag'] = defineDict['THOST_FTDC_AF_Delete']
req['BrokerID'] = self.brokerID
req['InvestorID'] = self.userID
self.reqOrderAction(req, self.reqID)
代码: 全选
#----------------------------------------------------------------------
def buy(self, symbol, price, vol): # 多开
orderReq = CtaOrderReq()
orderReq.symbol = symbol # 代码
orderReq.price = price # 价格
orderReq.volume = vol # 数量
orderReq.priceType = PRICETYPE_LIMITPRICE # 价格类型
orderReq.direction = DIRECTION_LONG # 买卖
orderReq.offset = OFFSET_OPEN # 开平
self.sendOrder(orderReq)
def sell(self, symbol, price, vol): # 多平
orderReq = CtaOrderReq()
orderReq.symbol = symbol # 代码
orderReq.price = price # 价格
orderReq.volume = vol # 数量
orderReq.priceType = PRICETYPE_LIMITPRICE # 价格类型
orderReq.direction = DIRECTION_SHORT # 买卖
orderReq.offset = OFFSET_CLOSE # 开平
self.sendOrder(orderReq)
def selltoday(self, symbol, price, vol): # 多头平今
orderReq = CtaOrderReq()
orderReq.symbol = symbol # 代码
orderReq.price = price # 价格
orderReq.volume = vol # 数量
orderReq.priceType = PRICETYPE_LIMITPRICE # 价格类型
orderReq.direction = DIRECTION_SHORT # 买卖
orderReq.offset = OFFSET_CLOSETODAY # 开平
self.sendOrder(orderReq)
def short(self, symbol, price, vol): # 空开
orderReq = CtaOrderReq()
orderReq.symbol = symbol # 代码
orderReq.price = price # 价格
orderReq.volume = vol # 数量
orderReq.priceType = PRICETYPE_LIMITPRICE # 价格类型
orderReq.direction = DIRECTION_SHORT # 买卖
orderReq.offset = OFFSET_OPEN # 开平
self.sendOrder(orderReq)
def cover(self, symbol, price, vol): # 空平
orderReq = CtaOrderReq()
orderReq.symbol = symbol # 代码
orderReq.price = price # 价格
orderReq.volume = vol # 数量
orderReq.priceType = PRICETYPE_LIMITPRICE # 价格类型
orderReq.direction = DIRECTION_LONG # 买卖
orderReq.offset = OFFSET_CLOSE # 开平
self.sendOrder(orderReq)
def covertoday(self, symbol, price, vol): # 空头平今
orderReq = CtaOrderReq()
orderReq.symbol = symbol # 代码
orderReq.price = price # 价格
orderReq.volume = vol # 数量
orderReq.priceType = PRICETYPE_LIMITPRICE # 价格类型
orderReq.direction = DIRECTION_LONG # 买卖
orderReq.offset = OFFSET_CLOSETODAY # 开平
self.sendOrder(orderReq)
代码: 全选
# ----------------------------------------------------------------------
def buy(self, symbol, price, vol): # 买开多开
self.td.buy(symbol, price, vol)
def sell(self, symbol, price, vol): # 多平
self.td.sell(symbol, price, vol)
def selltoday(self, symbol, price, vol): # 多平今
self.td.selltoday(symbol, price, vol)
def short(self, symbol, price, vol): # 空开
self.td.short(symbol, price, vol)
def cover(self, symbol, price, vol): # 空平
self.td.cover(symbol, price, vol)
def covertoday(self, symbol, price, vol): # 空平今
self.td.covertoday(symbol, price, vol)
# ----------------------------------------------------------------------
def cancelOrder(self, req):#撤单
self.td.cancelOrder(req)