def OnRspQryInvestor(self, pInvestor, pRspInfo, nRequestID, bIsLast): """请求查询投资者响应""" data = { "pInvestor": struct_to_dict(pInvestor), "pRspInfo": struct_to_dict(pRspInfo), "nRequestID": nRequestID, "bIsLast": bIsLast, } redis.publish(f"Trader:{self.account_name}:OnRspQryInvestor", ujson.dumps(data)) super().OnRspQryInvestor(pInvestor, pRspInfo, nRequestID, bIsLast)
def OnRspQryTradingAccount(self, pTradingAccount, pRspInfo, nRequestID, bIsLast): """请求查询资金账户响应""" data = { "pTradingAccount": struct_to_dict(pTradingAccount), "pRspInfo": struct_to_dict(pRspInfo), "nRequestID": nRequestID, "bIsLast": bIsLast, } redis.publish(f"Trader:{self.account_name}:OnRspQryTradingAccount", ujson.dumps(data)) super().OnRspQryTradingAccount(pTradingAccount, pRspInfo, nRequestID, bIsLast)
def OnRspOrderAction(self, pInputOrderAction, pRspInfo, nRequestID, bIsLast): """报单操作请求响应""" data = { "pInputOrderAction": struct_to_dict(pInputOrderAction), "pRspInfo": struct_to_dict(pRspInfo), "nRequestID": nRequestID, "bIsLast": bIsLast, } redis.publish(f"Trader:{self.account_name}:OnRspOrderAction", ujson.dumps(data)) super().OnRspOrderAction(pInputOrderAction, pRspInfo, nRequestID, bIsLast)
def OnRtnTrade(self, pTrade): """成交通知""" redis.publish("Trader:OnRtnTrade", ujson.dumps({"pTrade": struct_to_dict(pTrade)})) # super().OnRtnTrade(pTrade) TradingAPI.insert_ctp_trade(self.account_name, pTrade) self.getPosition() self.getAccount() self.getInvestor()
def OnRspQryInvestorPosition(self, pInvestorPosition, pRspInfo, nRequestID, bIsLast): """请求查询投资者持仓响应""" if pInvestorPosition is None: return data = struct_to_dict(pInvestorPosition) D = "L" if data['PosiDirection'] == '2' else 'S' position = ujson.loads( redis.hget("Position", data['InstrumentID']) or "{}") position[f'Total{D}Position'] = data['Position'] position[f'Yd{D}Position'] = data['YdPosition'] position[f'Today{D}Position'] = data['TodayPosition'] position['NetAmount'] = position.get( 'TotalLPosition', 0) - position.get('TotalSPosition', 0) redis.hset(f"Position:{self.account_name}", data['InstrumentID'], ujson.dumps(position))
def handler_data(self, data): try: instrument_id = data.InstrumentID.decode() except UnicodeDecodeError: return data = struct_to_dict(data) # hour = int(data['UpdateTime'].split(":")[0]) if "03:00" <= data['UpdateTime'] <= "09:00" or "15:00" < data[ 'UpdateTime'] <= "20:59": return del data["ExchangeID"], data["ExchangeInstID"], data["PreDelta"], \ data["CurrDelta"], data["BidPrice2"], data["BidPrice3"], \ data["BidPrice4"], data["BidPrice5"], \ data["BidVolume2"], data["BidVolume3"], \ data["BidVolume4"], data["BidVolume5"], \ data["AskPrice2"], data["AskPrice3"], \ data["AskPrice4"], data["AskPrice5"], \ data["AskVolume2"], data["AskVolume3"], \ data["AskVolume4"], data["AskVolume5"], data["ClosePrice"], \ data["SettlementPrice"] data["InstrumentID"] = instrument_id data[ 'TickTime'] = f"{date.today()} {data['UpdateTime']}.{data['UpdateMillisec']}" try: data['Timestamp'] = int( datetime.strptime(data['TickTime'], "%Y-%m-%d %H:%M:%S.%f").timestamp() * SECOND_UNIT) except ValueError: logger.error( f"time format error {date.today()} {data['UpdateTime']} {data['UpdateMillisec']}" ) raise channel = f"TICK:{instrument_id}" data = ujson.dumps(data) redis.publish(channel, data) redis.hset("Price", instrument_id, data)
def OnRtnTradingNotice(self, pTradingNoticeInfo): """交易通知""" redis.publish(f"Trader:{self.account_name}:OnRtnTradingNotice", ujson.dumps(struct_to_dict(pTradingNoticeInfo))) super().OnRtnTradingNotice(pTradingNoticeInfo)