class MyMd(MdApi): DEF_CREATE_FINISH = 'md_create_finish' DEF_INIT_FINISH = 'md_init_finish' DEF_FRONT_CONNECTED = 'md_front_connected' DEF_FRONT_DISCONNECTED = 'md_front_disconnected' DEF_LOGIN = '******' DEF_DEPTH_MARKET = 'depth_market' def __init__(self, _brokder_id, _user_id, _password, _flow_path, _front_address): # request index self.mRequestId = 0 # account info self.mBrokerId = _brokder_id self.mUserId = _user_id self.mPassword = _password self.mFlowPath = _flow_path self.mFrontAddress = _front_address # init socket self.mSocketClient = MySocketClient() # init functions self.Create() self.Init() self.mSocketClient.send(self.DEF_INIT_FINISH) def Create(self): super(MdApi, self).Create(self.mFlowPath) def Init(self): logging.info('') super(MdApi, self).Init() # register front def RegisterFront(self): logging.info('') super(MdApi, self).RegisterFront(self.mFrontAddress) def OnFrontConnected(self): logging.info('') self.mSocketClient.send(self.DEF_FRONT_CONNECTED) def OnFrontDisconnected(self, _reason): logging.warning('reason: 0x%x' % (_reason)) self.mSocketClient.send(self.DEF_FRONT_DISCONNECTED) # login def ReqUserLogin(self): logging.info('') req = ApiStruct.ReqUserLogin( BrokerID=self.mBrokerId, UserID=self.mUserId, Password=self.mPassword ) super(MdApi, self).ReqUserLogin(req, self.mRequestId) self.mRequestId += 1 def OnRspUserLogin(self, _rsp_user_login, _rsp_info, _request_id, _is_last): logging.info("ErrorID: " + str(_rsp_info.ErrorID) + ", ErrorMsg: " + _rsp_info.ErrorMsg.decode('gbk')) self.mSocketClient.send(self.DEF_LOGIN) def OnRspUserLogout(self, _user_logout, _rsp_info, _request_id, _is_last): logging.info(str(_user_logout)) # Subscribe def SubscribeMarketData(self, _instrument_ids): super(MdApi, self).SubscribeMarketData(_instrument_ids) def OnRspSubMarketData(self, _specific_instrument, _rsp_info, _request_id, _is_last): logging.info(_specific_instrument.InstrumentID) def OnRtnDepthMarketData(self, _depth_market_data): Datetime = _depth_market_data.ActionDay + _depth_market_data.UpdateTime format = "%Y%m%d%H:%M:%S" Datetime = datetime.strptime(Datetime, format) delta = timedelta(milliseconds=_depth_market_data.UpdateMillisec) Datetime = Datetime + delta data = { "Datetime": Datetime, "LastPrice": _depth_market_data.LastPrice, "Volume": _depth_market_data.Volume, "Turnover": _depth_market_data.Turnover, "OpenInterest": _depth_market_data.OpenInterest, } if _depth_market_data.AskVolume1 > 0: data["AskVolume1"] = _depth_market_data.AskVolume1 data["AskPrice1"] = _depth_market_data.AskPrice1 if _depth_market_data.AskVolume2 > 0: data["AskVolume2"] = _depth_market_data.AskVolume2 data["AskPrice2"] = _depth_market_data.AskPrice2 if _depth_market_data.AskVolume3 > 0: data["AskVolume3"] = _depth_market_data.AskVolume3 data["AskPrice3"] = _depth_market_data.AskPrice3 if _depth_market_data.AskVolume4 > 0: data["AskVolume4"] = _depth_market_data.AskVolume4 data["AskPrice4"] = _depth_market_data.AskPrice4 if _depth_market_data.AskVolume5 > 0: data["AskVolume5"] = _depth_market_data.AskVolume5 data["AskPrice5"] = _depth_market_data.AskPrice5 if _depth_market_data.AskVolume1 > 0: data["BidVolume1"] = _depth_market_data.BidVolume1 data["BidPrice1"] = _depth_market_data.BidPrice1 if _depth_market_data.BidVolume2 > 0: data["BidVolume2"] = _depth_market_data.BidVolume2 data["BidPrice2"] = _depth_market_data.BidPrice2 if _depth_market_data.BidVolume3 > 0: data["BidVolume3"] = _depth_market_data.BidVolume3 data["BidPrice3"] = _depth_market_data.BidPrice3 if _depth_market_data.BidVolume4 > 0: data["BidVolume4"] = _depth_market_data.BidVolume4 data["BidPrice4"] = _depth_market_data.BidPrice4 if _depth_market_data.BidVolume5 > 0: data["BidVolume5"] = _depth_market_data.BidVolume5 data["BidPrice5"] = _depth_market_data.BidPrice5 self.mSocketClient.send( self.DEF_DEPTH_MARKET, data={'inst_id': _depth_market_data.InstrumentID, 'data': data} )
class MyTrader(TraderApi): DEF_CREATE_FINISH = 'trader_create_finish' DEF_INIT_FINISH = 'trader_init_finish' DEF_FRONT_CONNECTED = 'trader_front_connected' DEF_FRONT_DISCONNECTED = 'trader_front_disconnected' DEF_LOGIN = '******' DEF_INSTRUMENT = 'trader_instrument' DEF_QRY_SETTLEMENT_INFO = 'trader_qry_settlement_info' DEF_SETTLEMENT_INFO_CONFIRM = 'trader_settlement_info_confirm' DIRECTION_BUY = 'buy' DIRECTION_SELL = 'sell' def __init__(self, _brokder_id, _user_id, _password, _flow_path, _front_address): # request index self.mRequestId = 0 self.mOrderRef = 0 # account info self.mBrokerId = _brokder_id self.mUserId = _user_id self.mPassword = _password self.mFlowPath = _flow_path self.mFrontAddress = _front_address # init socket self.mSocketClient = MySocketClient() # init functions self.Create() self.Init() self.mSocketClient.send(self.DEF_INIT_FINISH) def Create(self): super(TraderApi, self).Create(self.mFlowPath) def Init(self): logging.info('') super(TraderApi, self).SubscribePublicTopic(ApiStruct.TERT_RESUME) super(TraderApi, self).SubscribePrivateTopic(ApiStruct.TERT_RESUME) super(TraderApi, self).Init() # register front def RegisterFront(self): logging.info('') super(TraderApi, self).RegisterFront(self.mFrontAddress) def OnFrontConnected(self): logging.info('') self.mSocketClient.send(self.DEF_FRONT_CONNECTED) def OnFrontDisconnected(self, _reason): logging.warning('reason: 0x%x' % (_reason)) self.mSocketClient.send(self.DEF_FRONT_DISCONNECTED) # login def ReqUserLogin(self): logging.info('') req = ApiStruct.ReqUserLogin( BrokerID=self.mBrokerId, UserID=self.mUserId, Password=self.mPassword ) super(TraderApi, self).ReqUserLogin(req, self.mRequestId) self.mRequestId += 1 def OnRspUserLogin(self, _rsp_user_login, _rsp_info, _request_id, _is_last): logging.info("ErrorID: " + str(_rsp_info.ErrorID) + ", ErrorMsg: " + _rsp_info.ErrorMsg.decode('gbk')) self.mSocketClient.send(self.DEF_LOGIN, data=_rsp_info.ErrorID) def OnRspUserLogout(self, _user_logout, _rsp_info, _request_id, _is_last): logging.info(str(_user_logout)) # qry instrument def ReqQryInstrument(self, _instrument_id): req = ApiStruct.QryInstrument( InstrumentID=_instrument_id ) super(TraderApi, self).ReqQryInstrument(req, self.mRequestId) self.mRequestId += 1 def OnRspQryInstrument(self, _instrument, _rsp_info, _request_id, _is_last): format = "%Y%m%d" open_date = datetime.strptime(_instrument.OpenDate, format) expire_date = datetime.strptime(_instrument.ExpireDate, format) data = {'InstrumentID': _instrument.InstrumentID, 'ProductID': _instrument.ProductID, 'OpenDate': open_date, 'ExpireDate': expire_date, 'MaxMarketOrderVolume': _instrument.MaxMarketOrderVolume, 'MinMarketOrderVolume': _instrument.MinMarketOrderVolume, 'MaxLimitOrderVolume': _instrument.MaxLimitOrderVolume, 'MinLimitOrderVolume': _instrument.MinLimitOrderVolume, 'VolumeMultiple': _instrument.VolumeMultiple, 'PriceTick': _instrument.PriceTick, 'LongMarginRatio': _instrument.LongMarginRatio, 'ShortMarginRatio': _instrument.ShortMarginRatio } self.mSocketClient.send(self.DEF_INSTRUMENT, data=data) def ReqQryTradingAccount(self): logging.info('') req = ApiStruct.QryTradingAccount( BrokerID=self.mBrokerId, InvestorID=self.mUserId ) super(TraderApi, self).ReqQryTradingAccount(req, self.mRequestId) self.mRequestId += 1 def OnRspQryTradingAccount(self, _trading_account, _rsp_info, _request_id, _is_last): print _trading_account def ReqQrySettlementInfo(self): logging.info('') req = ApiStruct.SettlementInfo( BrokerID=self.mBrokerId, InvestorID=self.mUserId, TradingDay='' ) super(TraderApi, self).ReqQrySettlementInfo(req, self.mRequestId) self.mRequestId += 1 def OnRspQrySettlementInfo(self, _settlement_info, _rsp_info, _request_id, _is_last): logging.info('') print _settlement_info self.mSocketClient.send(self.DEF_QRY_SETTLEMENT_INFO) def ReqSettlementInfoConfirm(self): logging.info('') req = ApiStruct.SettlementInfoConfirm( BrokerID=self.mBrokerId, InvestorID=self.mUserId ) super(TraderApi, self).ReqSettlementInfoConfirm(req, self.mRequestId) self.mRequestId += 1 def OnRspSettlementInfoConfirm(self, _settlement_info_confirm, _rsp_info, _request_id, _is_last): logging.info('') print _settlement_info_confirm self.mSocketClient.send(self.DEF_SETTLEMENT_INFO_CONFIRM) def ReqOrderInsert(self, _instrument_id, _direction, _volume): logging.info(_instrument_id + ' ' + _direction + ' ' + str(_volume)) self.mOrderRef += 1 req = ApiStruct.InputOrder( BrokerID=self.mBrokerId, InvestorID=self.mUserId, InstrumentID=_instrument_id, OrderRef=str(self.mOrderRef), Direction=ApiStruct.D_Buy if _direction == self.DIRECTION_BUY else ApiStruct.D_Sell, CombOffsetFlag=ApiStruct.OF_Open, CombHedgeFlag=ApiStruct.HF_Speculation, VolumeTotalOriginal=_volume, VolumeCondition=ApiStruct.VC_AV, MinVolume=1, ForceCloseReason=ApiStruct.FCC_NotForceClose, IsAutoSuspend=0, UserForceClose=0, OrderPriceType=ApiStruct.OPT_LimitPrice, LimitPrice=0, TimeCondition=ApiStruct.TC_IOC ) super(TraderApi, self).ReqOrderInsert(req, self.mRequestId) self.mRequestId += 1 def OnRspOrderInsert(self, _input_order, _rsp_info, _request_id, _is_last): logging.info('') print _input_order print _rsp_info.ErrorMsg.decode('gbk') def OnRtnOrder(self, _order): logging.info('') print _order def OnErrRtnOrderInsert(self, _input_order, _rsp_info): logging.info('') print _rsp_info def OnRtnTrade(self, _trade): logging.info('') print _trade def ReqQryInvestorPositionDetail(self, _instrument_id): logging.info('') req = ApiStruct.QryInvestorPosition( BrokerID=self.mBrokerId, InvestorID=self.mUserId, InstrumentID=_instrument_id ) super(TraderApi, self).ReqQryInvestorPositionDetail(req, self.mRequestId) self.mRequestId += 1 def OnRspQryInvestorPositionDetail(self, _investor_position_detail, _rsp_info, _request_id, _is_last): print _investor_position_detail