From 1471480f5307d9f75b6e87e246cc14c131fb4639 Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期五, 14 六月 2024 15:36:21 +0800 Subject: [PATCH] L2订阅接口更新 --- huaxin_client/l2_client.py | 110 ++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 73 insertions(+), 37 deletions(-) diff --git a/huaxin_client/l2_client.py b/huaxin_client/l2_client.py index 8172dca..ae2f8e1 100644 --- a/huaxin_client/l2_client.py +++ b/huaxin_client/l2_client.py @@ -53,6 +53,8 @@ set_codes_data_queue = queue.Queue() market_code_dict = {} +ENABLE_NGST = True + class Lev2MdSpi(lev2mdapi.CTORATstpLev2MdSpi): latest_codes_set = set() @@ -91,10 +93,14 @@ logger_local_huaxin_l2_subscript.info(f"鍙栨秷璁㈤槄涓婅瘉锛歿sh}") logger_local_huaxin_l2_subscript.info(f"鍙栨秷璁㈤槄娣辫瘉锛歿sz}") if sh: - # 鍙栨秷璁㈤槄閫愮瑪濮旀墭 - self.__api.UnSubscribeOrderDetail(sh, lev2mdapi.TORA_TSTP_EXD_SSE) - # 鍙栨秷璁㈤槄閫愮瑪鎴愪氦 - self.__api.UnSubscribeTransaction(sh, lev2mdapi.TORA_TSTP_EXD_SSE) + if ENABLE_NGST: + result = self.__api.UnSubscribeNGTSTick(sh, lev2mdapi.TORA_TSTP_EXD_SSE) + logger_local_huaxin_l2_subscript.info(f"閫愮瑪NGTS璁㈤槄缁撴灉sh锛歿result}") + else: + # 鍙栨秷璁㈤槄閫愮瑪濮旀墭 + self.__api.UnSubscribeOrderDetail(sh, lev2mdapi.TORA_TSTP_EXD_SSE) + # 鍙栨秷璁㈤槄閫愮瑪鎴愪氦 + self.__api.UnSubscribeTransaction(sh, lev2mdapi.TORA_TSTP_EXD_SSE) self.__api.UnSubscribeMarketData(sh, lev2mdapi.TORA_TSTP_EXD_SSE) if sz: self.__api.UnSubscribeOrderDetail(sz, lev2mdapi.TORA_TSTP_EXD_SZSE) @@ -106,12 +112,16 @@ logger_local_huaxin_l2_subscript.info(f"璁㈤槄涓婅瘉锛歿sh}") logger_local_huaxin_l2_subscript.info(f"璁㈤槄娣辫瘉锛歿sz}") if sh: - # 璁㈤槄閫愮瑪濮旀墭 - result = self.__api.SubscribeOrderDetail(sh, lev2mdapi.TORA_TSTP_EXD_SSE) - logger_local_huaxin_l2_subscript.info(f"閫愮瑪濮旀墭璁㈤槄缁撴灉sh锛歿result}") - # 璁㈤槄閫愮瑪鎴愪氦 - result = self.__api.SubscribeTransaction(sh, lev2mdapi.TORA_TSTP_EXD_SSE) - logger_local_huaxin_l2_subscript.info(f"閫愮瑪鎴愪氦璁㈤槄缁撴灉sh锛歿result}") + if ENABLE_NGST: + result = self.__api.SubscribeNGTSTick(sh, lev2mdapi.TORA_TSTP_EXD_SSE) + logger_local_huaxin_l2_subscript.info(f"閫愮瑪NGTS璁㈤槄缁撴灉sh锛歿result}") + else: + # 璁㈤槄閫愮瑪濮旀墭 + result = self.__api.SubscribeOrderDetail(sh, lev2mdapi.TORA_TSTP_EXD_SSE) + logger_local_huaxin_l2_subscript.info(f"閫愮瑪濮旀墭璁㈤槄缁撴灉sh锛歿result}") + # 璁㈤槄閫愮瑪鎴愪氦 + result = self.__api.SubscribeTransaction(sh, lev2mdapi.TORA_TSTP_EXD_SSE) + logger_local_huaxin_l2_subscript.info(f"閫愮瑪鎴愪氦璁㈤槄缁撴灉sh锛歿result}") result = self.__api.SubscribeMarketData(sh, lev2mdapi.TORA_TSTP_EXD_SSE) logger_local_huaxin_l2_subscript.info(f"甯傚満璁㈤槄缁撴灉sh锛歿result}") @@ -149,7 +159,7 @@ self.l2_data_upload_manager.distribute_upload_queue(c) l2_data_manager.add_target_code(c) except Exception as e: - #TODO 娓呴櫎鍘熸潵杩樻病閲婃斁鎺夌殑鏁版嵁 + # TODO 娓呴櫎鍘熸潵杩樻病閲婃斁鎺夌殑鏁版嵁 logger_system.error(f"L2浠g爜鍒嗛厤涓婁紶闃熷垪鍑洪敊:{str(e)}") logger_system.exception(e) self.__subscribe(add_codes) @@ -246,6 +256,26 @@ except Exception as e: logging.exception(e) + def OnRspSubNGTSTick(self, pSpecificSecurity, pRspInfo, nRequestID, bIsLast): + async_log_util.info(logger_local_huaxin_l2_subscript, + f"璁㈤槄缁撴灉锛歿pSpecificSecurity['SecurityID']} {pRspInfo['ErrorID']} {pRspInfo['ErrorMsg']}") + if pRspInfo["ErrorID"] == 0: + print("璁㈤槄鎴愬姛") + self.subscripted_codes.add(pSpecificSecurity['SecurityID']) + if bIsLast == 1: + print("璁㈤槄鍝嶅簲缁撴潫", self.subscripted_codes) + l2_data_manager.add_subscript_codes(self.subscripted_codes) + + def OnRspUnSubNGTSTick(self, pSpecificSecurity, pRspInfo, nRequestID, bIsLast): + try: + code = pSpecificSecurity['SecurityID'] + self.subscripted_codes.discard(code) + if bIsLast == 1: + print("鍙栨秷璁㈤槄鍝嶅簲缁撴潫", self.subscripted_codes) + l2_data_manager.add_subscript_codes(self.subscripted_codes) + except Exception as e: + logging.exception(e) + def OnRspSubBondMarketData(self, pSpecificSecurity, pRspInfo, nRequestID, bIsLast): print("OnRspSubBondMarketData") @@ -260,10 +290,6 @@ def OnRspSubXTSTick(self, pSpecificSecurity, pRspInfo, nRequestID, bIsLast): print("OnRspSubXTSTick") - - # 4.0.5鐗堟湰鎺ュ彛 - def OnRspSubNGTSTick(self, pSpecificSecurity, pRspInfo, nRequestID, bIsLast): - print("OnRspSubNGTSTick") def OnRtnMarketData(self, pDepthMarketData, FirstLevelBuyNum, FirstLevelBuyOrderVolumes, FirstLevelSellNum, FirstLevelSellOrderVolumes): @@ -345,28 +371,6 @@ self.l2_data_upload_manager.add_transaction_detail(item) def OnRtnOrderDetail(self, pOrderDetail): - # can_listen = False - # code = str(pOrderDetail['SecurityID']) - # start_time = 0 - # if code in self.special_code_volume_for_order_dict: - # start_time = time.time() - # if self.special_code_volume_for_order_dict[code][0] == pOrderDetail[ - # 'Volume'] or constant.SHADOW_ORDER_VOLUME == pOrderDetail['Volume']: - # # 鐩戞帶鐩爣璁㈠崟涓庡奖瀛愯鍗� - # if self.special_code_volume_for_order_dict[code][1] > time.time(): - # # 鐗规畩閲忕洃鍚� - # can_listen = True - # else: - # self.special_code_volume_for_order_dict.pop(code) - # if not can_listen: - # min_volume, limit_up_price = self.codes_volume_and_price_dict.get(code) - # if min_volume is None: - # # 榛樿绛涢��50w - # if pOrderDetail['Price'] * pOrderDetail['Volume'] < 500000: - # return - # elif pOrderDetail['Volume'] < min_volume: - # return - # 杈撳嚭閫愮瑪濮旀墭鏁版嵁 # 涓婅瘉OrderStatus=b"D"琛ㄧず鎾ゅ崟 item = {"SecurityID": pOrderDetail['SecurityID'], "Price": pOrderDetail['Price'], "Volume": pOrderDetail['Volume'], @@ -376,6 +380,38 @@ "OrderStatus": pOrderDetail['OrderStatus'].decode()} self.l2_data_upload_manager.add_l2_order_detail(item, 0) + def OnRtnNGTSTick(self, pTick): + """ + 涓婅瘉鑲$エ鐨勯�愮瑪濮旀墭涓庢垚浜� + @param pTick: + @return: + """ + try: + if pTick['TickType'] == b'T': + # 鎴愪氦 + item = {"SecurityID": pTick['SecurityID'], "TradePrice": pTick['Price'], + "TradeVolume": pTick['Volume'], + "OrderTime": pTick['TickTime'], "MainSeq": pTick['MainSeq'], + "SubSeq": pTick['SubSeq'], "BuyNo": pTick['BuyNo'], + "SellNo": pTick['SellNo'], + "ExecType": '1'} + self.l2_data_upload_manager.add_transaction_detail(item) + elif pTick['TickType'] == b'A' or pTick['TickType'] == b'D': + # 鎾ゅ崟 + item = {"SecurityID": pTick['SecurityID'], "Price": pTick['Price'], + "Volume": pTick['Volume'], + "Side": pTick['Side'].decode(), "OrderType": pTick['TickType'].decode(), + "OrderTime": pTick['TickTime'], "MainSeq": pTick['MainSeq'], + "SubSeq": pTick['SubSeq'], "OrderNO": '', + "OrderStatus": pTick['TickType'].decode()} + if pTick['Side'] == b'1': + item['OrderNO'] = pTick['BuyNo'] + elif pTick['Side'] == b'2': + item['OrderNO'] = pTick['SellNo'] + self.l2_data_upload_manager.add_l2_order_detail(item, 0) + except Exception as e: + logger_local_huaxin_l2_subscript.exception(e) + def OnRtnBondMarketData(self, pDepthMarketData, FirstLevelBuyNum, FirstLevelBuyOrderVolumes, FirstLevelSellNum, FirstLevelSellOrderVolumes): # 杈撳嚭琛屾儏蹇収鏁版嵁 -- Gitblit v1.8.0