class MdApi: """ Demo中的行情API封装 封装后所有数据自动推送到事件驱动引擎中,由其负责推送到各个监听该事件的回调函数上 对用户暴露的主动函数包括: 登陆 login 订阅合约 subscribe """ #---------------------------------------------------------------------- def __init__(self, eventEngine): """ API对象的初始化函数 """ # 事件引擎,所有数据都推送到其中,再由事件引擎进行分发 self.__eventEngine = eventEngine self.q = Quote() # 请求编号,由api负责管理 self.__reqid = 0 # 以下变量用于实现连接和重连后的自动登陆 self.__userid = cf.userid self.__password = cf.password self.__brokerid = cf.brokerid api = self.q.CreateApi() spi = self.q.CreateSpi() self.q.RegisterSpi(spi) self.q.OnFrontConnected = self.onFrontConnected # 交易服务器登陆相应 self.q.OnRspUserLogin = self.onRspUserLogin # 用户登陆 self.q.OnFrontDisconnected = self.onFrontDisconnected self.q.OnRspError = self.onRspError self.q.OnRspSubMarketData = self.OnRspSubMarketData self.q.OnRtnDepthMarketData = self.onRtnDepthMarketData self.q.OnRspUserLogout = self.OnRspUserLogout self.q.RegCB() self.login_status = False #登录状态 def login(self): if self.login_status == False: self.q.RegisterFront('tcp://180.168.146.187:10010') self.q.Init() def logout(self): if self.login_status == True: self.q.ReqUserLogout(self.__brokerid, self.__userid) def release(self): self.q.Release() self.q = None def put_log_event(self, log): # log事件注册 event = Event(type_=EVENT_LOG) event.dict_['log'] = log self.__eventEngine.put(event) def onFrontConnected(self): """服务器连接""" lc.loger.info(threading.current_thread()) self.put_log_event('行情服务器连接成功') time.sleep(3) self.q.ReqUserLogin(BrokerID=self.__brokerid, UserID=self.__userid, Password=self.__password) def onFrontDisconnected(self, n): """服务器断开""" lc.loger.info(threading.current_thread()) self.put_log_event('行情服务器连接断开') time.sleep(3) self.login_status = False def onRspError(self, error, n, last): """错误回报""" log = '行情错误回报,错误代码:' + str(error.__dict__['ErrorID']) + '错误信息:' + +str( error.__dict__['ErrorMsg']) self.put_log_event(log) def onRspUserLogin(self, data, error, n, last): """登陆回报""" if error.__dict__['ErrorID'] == 0: self.login_status = True log = '行情服务器登陆成功' else: self.login_status = False log = '登陆回报,错误代码:' + str( error.__dict__['ErrorID']) + ', 错误信息:' + str( error.__dict__['ErrorMsg']) self.put_log_event(log) def OnRspUserLogout(self, data, error, n, last): """登出回报""" lc.loger.info(threading.current_thread()) if error.__dict__['ErrorID'] == 0: self.login_status = False log = '行情服务器登出成功' else: self.login_status = True log = '登出回报,错误代码:' + str( error.__dict__['ErrorID']) + ', 错误信息:' + str( error.__dict__['ErrorMsg']) self.put_log_event(log) def OnRspSubMarketData(self, data, info, n, last): pass def onRtnDepthMarketData(self, data): """行情推送""" # 特定合约行情事件 #lc.loger.info(threading.current_thread()) #lc.loger.info("get") event2 = Event(type_=(EVENT_MARKETDATA_CONTRACT + data.__dict__['InstrumentID'])) event2.dict_['data'] = data.__dict__ self.__eventEngine.put(event2) # ---------------------------------------------------------------------- def subscribe(self, instrumentid): """订阅合约""" self.q.SubscribeMarketData(pInstrumentID=instrumentid) def unsubscribe(self, instrumentid): """退订合约""" self.q.UnSubscribeMarketData(pInstrumentID=instrumentid)
class MdApi: """ Demo中的行情API封装 封装后所有数据自动推送到事件驱动引擎中,由其负责推送到各个监听该事件的回调函数上 对用户暴露的主动函数包括: 登陆 login 订阅合约行情 subscribe 行情数据导向rabbitmq """ logging.getLogger().setLevel(logging.INFO) #---------------------------------------------------------------------- def __init__(self): """ API对象的初始化函数 """ self.q = Quote() # 请求编号,由api负责管理 self.__reqid = 0 # 以下变量用于实现连接和重连后的自动登陆 self.__userid = '123' self.__password = '******' self.__brokerid = '9999' def login(self): api = self.q.CreateApi() spi = self.q.CreateSpi() self.q.RegisterSpi(spi) self.q.OnFrontConnected = self.onFrontConnected # 行情服务器登陆相应 self.q.OnRspUserLogin = self.onRspUserLogin # 用户登陆 self.q.OnRspSubMarketData=self.onRspSubMarketData #tick返回调用 self.q.OnRtnDepthMarketData = self.onRtnDepthMarketData self.q.RegCB() self.q.RegisterFront('tcp://180.168.146.187:10010') self.q.Init() def onFrontConnected(self): """服务器连接""" logging.info("行情服务器连接成功") self.q.ReqUserLogin(BrokerID=self.__brokerid, UserID=self.__userid, Password=self.__password) #登录请求 def onRspUserLogin(self, data, error, n, last): #登录请求返回信息 """登陆回报""" if error.__dict__['ErrorID'] == 0: log = '行情服务器登陆成功' self.subscribe('IF1809') else: log = '登陆回报,错误代码:' + str(error.__dict__['ErrorID']) + ', 错误信息:' + str(error.__dict__['ErrorMsg']) logging.info(log) def onRspSubMarketData(self, data, info, n, last): pass def onRtnDepthMarketData(self, data): """行情推送""" # 特定合约行情事件 event = Event(type_=EVENT_MARKETDATA_CONTRACT) event.symbol= data.__dict__['InstrumentID'] event.dict_['data'] = data.__dict__ print(event.dict_['data']) def subscribe(self, instrumentid): """订阅合约""" self.q.SubscribeMarketData(pInstrumentID=instrumentid) def unsubscribe(self, instrumentid): """退订合约""" self.q.UnSubscribeMarketData(pInstrumentID=instrumentid)