# encoding: UTF-8 from eventEngine import * # 默认空值 EMPTY_STRING = '' EMPTY_UNICODE = u'' EMPTY_INT = 0 EMPTY_FLOAT = 0.0 # 方向常量 DIRECTION_NONE = u'无方向' DIRECTION_LONG = u'多' DIRECTION_SHORT = u'空' DIRECTION_UNKNOWN = u'未知' DIRECTION_NET = u'净' # 开平常量 OFFSET_NONE = u'无开平' OFFSET_OPEN = u'开仓' OFFSET_CLOSE = u'平仓' OFFSET_UNKNOWN = u'未知' # 状态常量 STATUS_NOTTRADED = u'未成交' STATUS_PARTTRADED = u'部分成交' STATUS_ALLTRADED = u'全部成交' STATUS_CANCELLED = u'已撤销' STATUS_UNKNOWN = u'未知' # 合约类型常量 PRODUCT_EQUITY = u'股票' PRODUCT_FUTURES = u'期货' PRODUCT_OPTION = u'期权' PRODUCT_INDEX = u'指数' PRODUCT_COMBINATION = u'组合' # 期权类型 OPTION_CALL = u'看涨期权' OPTION_PUT = u'看跌期权' ######################################################################## class VtGateway(object): """交易接口""" #---------------------------------------------------------------------- def __init__(self, eventEngine): """Constructor""" self.eventEngine = eventEngine #---------------------------------------------------------------------- def onTick(self, tick): """市场行情推送""" # 通用事件 event1 = Event(type_=EVENT_TICK) event1.dict_['data'] = tick self.eventEngine.put(event1) # 特定合约代码的事件 event2 = Event(type_=EVENT_TICK+tick.vtSymbol) event2.dict_['data'] = tick self.eventEngine.put(event2) #---------------------------------------------------------------------- def onTrade(self, trade): """成交信息推送""" # 因为成交通常都是事后才会知道成交编号,因此只需要推送通用事件 event1 = Event(type_=EVENT_TRADE) event1.dict_['data'] = trade self.eventEngine.put(event1) #---------------------------------------------------------------------- def onOrder(self, order): """订单变化推送""" # 通用事件 event1 = Event(type_=EVENT_ORDER) event1.dict_['data'] = order self.eventEngine.put(event1) # 特定订单编号的事件 event2 = Event(type_=EVENT_ORDER+order.vtOrderID) event2.dict_['data'] = order self.eventEngine.put(event2) #---------------------------------------------------------------------- def onPosition(self, position): """持仓信息推送""" # 通用事件 event1 = Event(type_=EVENT_POSITION) event1.dict_['data'] = position self.eventEngine.put(event1) # 特定合约代码的事件 event2 = Event(type_=EVENT_POSITION+position.vtPositionName) event2.dict_['data'] = position self.eventEngine.put(event2) #---------------------------------------------------------------------- def onAccount(self, account): """账户信息推送""" # 通用事件 event1 = Event(type_=EVENT_ACCOUNT) event1.dict_['data'] = account self.eventEngine.put(event1) # 特定合约代码的事件 event2 = Event(type_=EVENT_ACCOUNT+account.vtAccountID) event2.dict_['data'] = account self.eventEngine.put(event2) #---------------------------------------------------------------------- def onError(self, error): """错误信息推送""" # 通用事件 event1 = Event(type_=EVENT_ERROR) event1.dict_['data'] = error self.eventEngine.put(event1) #---------------------------------------------------------------------- def onLog(self, log): """日志推送""" # 通用事件 event1 = Event(type_=EVENT_LOG) event1.dict_['data'] = log self.eventEngine.put(event1) #---------------------------------------------------------------------- def onContract(self, contract): """合约基础信息推送""" # 通用事件 event1 = Event(type_=EVENT_CONTRACT) event1.dict_['data'] = contract self.eventEngine.put(event1) #---------------------------------------------------------------------- def connect(self): """连接""" pass #---------------------------------------------------------------------- def subscribe(self): """订阅行情""" pass #---------------------------------------------------------------------- def sendOrder(self): """发单""" pass #---------------------------------------------------------------------- def cancelOrder(self): """撤单""" pass #---------------------------------------------------------------------- def close(self): """关闭""" pass ######################################################################## class VtBaseData(object): """回调函数推送数据的基础类,其他数据类继承于此""" #---------------------------------------------------------------------- def __init__(self): """Constructor""" self.gatewayName = EMPTY_STRING # Gateway名称 self.rawData = None # 原始数据 ######################################################################## class VtTickData(VtBaseData): """Tick行情数据类""" #---------------------------------------------------------------------- def __init__(self): """Constructor""" super(VtTickData, self).__init__() # 代码相关 self.symbol = EMPTY_STRING # 合约代码 self.vtSymbol = EMPTY_STRING # 合约在vt系统中的唯一代码,通常是 Gateway名.合约代码 # 成交数据 self.lastPrice = EMPTY_FLOAT # 最新成交价 self.volume = EMPTY_INT # 最新成交量 self.openInterest = EMPTY_INT # 持仓量 self.tickTime = EMPTY_STRING # 更新时间 # 五档行情 self.bidPrice1 = EMPTY_FLOAT self.bidPrice2 = EMPTY_FLOAT self.bidPrice3 = EMPTY_FLOAT self.bidPrice4 = EMPTY_FLOAT self.bidPrice5 = EMPTY_FLOAT self.askPrice1 = EMPTY_FLOAT self.askPrice2 = EMPTY_FLOAT self.askPrice3 = EMPTY_FLOAT self.askPrice4 = EMPTY_FLOAT self.askPrice5 = EMPTY_FLOAT self.bidVolume1 = EMPTY_INT self.bidVolume2 = EMPTY_INT self.bidVolume3 = EMPTY_INT self.bidVolume4 = EMPTY_INT self.bidVolume5 = EMPTY_INT self.askVolume1 = EMPTY_INT self.askVolume2 = EMPTY_INT self.askVolume3 = EMPTY_INT self.askVolume4 = EMPTY_INT self.askVolume5 = EMPTY_INT ######################################################################## class VtTradeData(VtBaseData): """成交数据类""" #---------------------------------------------------------------------- def __init__(self): """Constructor""" super(VtTradeData, self).__init__() # 代码编号相关 self.symbol = EMPTY_STRING # 合约代码 self.vtSymbol = EMPTY_STRING # 合约在vt系统中的唯一代码,通常是 Gateway名.合约代码 self.tradeID = EMPTY_STRING # 成交编号 self.vtTradeID = EMPTY_STRING # 成交在vt系统中的唯一编号,通常是 Gateway名.成交编号 self.orderID = EMPTY_STRING # 订单编号 self.vtOrderID = EMPTY_STRING # 订单在vt系统中的唯一编号,通常是 Gateway名.订单编号 # 成交相关 self.direction = EMPTY_UNICODE # 成交方向 self.offset = EMPTY_UNICODE # 成交开平仓 self.price = EMPTY_FLOAT # 成交价格 self.volume = EMPTY_INT # 成交数量 self.tradeTime = EMPTY_STRING # 成交时间 ######################################################################## class VtOrderData(VtBaseData): """订单数据类""" #---------------------------------------------------------------------- def __init__(self): """Constructor""" super(VtOrderData, self).__init__() # 代码编号相关 self.symbol = EMPTY_STRING # 合约代码 self.vtSymbol = EMPTY_STRING # 合约在vt系统中的唯一代码,通常是 Gateway名.合约代码 self.orderID = EMPTY_STRING # 订单编号 self.vtOrderID = EMPTY_STRING # 订单在vt系统中的唯一编号,通常是 Gateway名.订单编号 # 报单相关 self.direction = EMPTY_UNICODE # 报单方向 self.offset = EMPTY_UNICODE # 报单开平仓 self.price = EMPTY_FLOAT # 报单价格 self.totalVolume = EMPTY_INT # 报单总数量 self.tradedVolume = EMPTY_INT # 报单成交数量 self.status = EMPTY_UNICODE # 报单状态 self.orderTime = EMPTY_STRING # 发单时间 self.cancelTime = EMPTY_STRING # 撤单时间 # CTP/LTS相关 self.frontID = EMPTY_INT # 前置机编号 self.sessionID = EMPTY_INT # 连接编号 ######################################################################## class VtPositionData(VtBaseData): """持仓数据类""" #---------------------------------------------------------------------- def __init__(self): """Constructor""" super(VtPositionData, self).__init__() # 代码编号相关 self.symbol = EMPTY_STRING # 合约代码 self.vtSymbol = EMPTY_STRING # 合约在vt系统中的唯一代码,通常是 Gateway名.合约代码 # 持仓相关 self.direction = EMPTY_STRING # 持仓方向 self.position = EMPTY_INT # 持仓量 self.frozen = EMPTY_INT # 冻结数量 self.price = EMPTY_FLOAT # 持仓均价 self.vtPositionName = EMPTY_STRING # 持仓在vt系统中的唯一代码,通常是vtSymbol.方向 ######################################################################## class VtAccountData(VtBaseData): """账户数据类""" #---------------------------------------------------------------------- def __init__(self): """Constructor""" super(VtAccountData, self).__init__() # 账号代码相关 self.accountID = EMPTY_STRING # 账户代码 self.vtAccountID = EMPTY_STRING # 账户在vt中的唯一代码,通常是 Gateway名.账户代码 # 数值相关 self.preBalance = EMPTY_FLOAT # 昨日账户结算净值 self.balance = EMPTY_FLOAT # 账户净值 self.available = EMPTY_FLOAT # 可用资金 self.commission = EMPTY_FLOAT # 今日手续费 self.margin = EMPTY_FLOAT # 保证金占用 self.closeProfit = EMPTY_FLOAT # 平仓盈亏 self.positionProfit = EMPTY_FLOAT # 持仓盈亏 ######################################################################## class VtErrorData(VtBaseData): """错误数据类""" #---------------------------------------------------------------------- def __init__(self): """Constructor""" super(VtErrorData, self).__init__() self.errorID = EMPTY_STRING # 错误代码 self.errorMsg = EMPTY_UNICODE # 错误信息 ######################################################################## class VtLogData(VtBaseData): """日志数据类""" #---------------------------------------------------------------------- def __init__(self): """Constructor""" super(VtLogData, self).__init__() self.logContent = EMPTY_UNICODE # 日志信息 ######################################################################## class VtContractData(VtBaseData): """合约详细信息类""" #---------------------------------------------------------------------- def __init__(self): """Constructor""" super(VtBaseData, self).__init__() self.symbol = EMPTY_STRING self.vtSymbol = EMPTY_STRING self.productClass = EMPTY_STRING self.size = EMPTY_INT self.priceTick = EMPTY_FLOAT # 期权相关 self.strikePrice = EMPTY_FLOAT self.underlyingSymbol = EMPTY_STRING self.optionType = EMPTY_UNICODE ######################################################################## class VtSubscribeReq: """订阅行情时传入的对象类""" #---------------------------------------------------------------------- def __init__(self): """Constructor""" self.symbol = EMPTY_STRING self.exchange = EMPTY_STRING ######################################################################## class VtOrderReq: """发单时传入的对象类""" #---------------------------------------------------------------------- def __init__(self): """Constructor""" self.symbol = EMPTY_STRING ######################################################################## class VtCancelOrderReq: """撤单时传入的对象类""" #---------------------------------------------------------------------- def __init__(self): """Constructor""" self.symbol = EMPTY_STRING self.exchange = EMPTY_STRING self.