From b92c5507bc73f043882ccf39fa5376686b4684d6 Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期五, 12 四月 2024 11:07:13 +0800 Subject: [PATCH] 新版深证下单完善 --- l2/place_order_single_data_manager.py | 96 ++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 93 insertions(+), 3 deletions(-) diff --git a/l2/place_order_single_data_manager.py b/l2/place_order_single_data_manager.py index 9b37b6c..0446460 100644 --- a/l2/place_order_single_data_manager.py +++ b/l2/place_order_single_data_manager.py @@ -2,10 +2,12 @@ 涓嬪崟淇″彿绠$悊 """ from l2 import l2_log +from l2.huaxin import l2_huaxin_util from log_module.log import logger_l2_trade_buy, logger_debug +from utils import tool -class L2TradeSingleManager: +class L2TradeSingleDataProcessor: """ L2閫愮瑪鎴愪氦鏁版嵁淇″彿绠$悊 """ @@ -23,7 +25,6 @@ @param data: @return: """ - l2_log.info(code, logger_l2_trade_buy, f"娑ㄥ仠鍗栨暟鎹細{data['val']['orderNo']}") if code not in cls.__latest_limit_up_sell_list_dict: cls.__latest_limit_up_sell_list_dict[code] = [] cls.__latest_limit_up_sell_list_dict[code].append(data) @@ -69,15 +70,104 @@ else: cls.__latest_sell_data[code] = [sell_no, data[2]] # 鍒ゆ柇鏄惁鏄渶鍚庝竴绗斿崠鍗� + l2_log.info(code, logger_l2_trade_buy, f"琚姩鍗栨暟鎹細{data}") # 鍒ゆ柇杩欎釜璁㈠崟鍙锋槸鍚︽垚浜ゅ畬 sell_list = cls.__latest_limit_up_sell_list_dict.get(code) if not sell_list: return sell_info = sell_list[-1] + l2_log.info(code, logger_l2_trade_buy, f"鏈�杩戞定鍋滃崠锛歿sell_info['val']['orderNo']}") if sell_no == sell_info['val']['orderNo'] and sell_info["val"]["num"] == cls.__latest_sell_data[code][ 1] // 100: # 鎴愪氦瀹屾垚 - l2_log.info(code, logger_l2_trade_buy, f"鎵惧埌鏈�杩戠殑琚姩娑ㄥ仠鍗栧崟鏁版嵁锛歿data['val']['orderNo']}, 鍙互瑙﹀彂涓嬪崟") + L2TradeSingleDataManager.set_latest_sell_data(code, data) + logger_l2_trade_buy.info(f"{code}#鎵惧埌鏈�杩戠殑琚姩娑ㄥ仠鍗栧崟鏁版嵁锛歿data['val']['orderNo']}, 鍙互瑙﹀彂涓嬪崟") + # l2_log.info(code, logger_l2_trade_buy, f"鎵惧埌鏈�杩戠殑琚姩娑ㄥ仠鍗栧崟鏁版嵁锛歿data['val']['orderNo']}, 鍙互瑙﹀彂涓嬪崟") except Exception as e: logger_debug.exception(e) + + +class L2TradeSingleDataManager: + TYPE_PASSIVE = 0 + TYPE_ACTIVE = 1 + + """ + 涔板叆淇″彿绠$悊 + """ + # 鏈�杩戠殑娑ㄥ仠鍗栬鍔ㄦ垚浜ゆ暟鎹� + __latest_sell_data_dict = {} # 鏍煎紡涓猴細{code:(閫愮瑪鎴愪氦鏁版嵁,鐢熸晥鏃堕棿锛堝甫ms锛�)} + + # 鐢辫鍔ㄥ悜涓诲姩鍗栨垚浜よ浆鍙樼殑鏁版嵁 + __latest_sell_active_deal_data_dict = {} # 鏍煎紡涓猴細{code:(閫愮瑪鎴愪氦鏁版嵁,鐢熸晥鏃堕棿锛堝甫ms锛�)} + + @classmethod + def set_latest_sell_data(cls, code, data): + """ + 璁剧疆鏈�杩戞垚浜ょ殑娑ㄥ仠鍗栬鍔ㄦ垚浜ゆ暟鎹� + @param code: 浠g爜 + @param data: L2閫愮瑪鎴愪氦鏁版嵁 鏁版嵁鏍煎紡锛�(data['SecurityID'], data['TradePrice'], data['TradeVolume'], + # data['OrderTime'], data['MainSeq'], data['SubSeq'], data['BuyNo'], + # data['SellNo'], data['ExecType']) + @return: + """ + deal_time = l2_huaxin_util.convert_time(data[3], True) + # 鐢熸晥鏃堕棿鍦�1s浠ュ唴 + cls.__latest_sell_data_dict[code] = (data, tool.trade_time_add_millionsecond(deal_time, 1000)) + + @classmethod + def set_sell_passive_to_active_datas(cls, code, passive_data, active_data): + """ + 璁剧疆琚姩鍗栨垚浜ゅ悜涓诲姩鍗栨垚浜ょ殑杞彉鏁版嵁 + @param code: 浠g爜 + @param passive_data: 琚姩鍗栨垚浜ら�愮瑪 + @param active_data: 涓诲姩鍗栨垚浜ら�愮瑪 + @return: + """ + deal_time = l2_huaxin_util.convert_time(passive_data[3], True) + # 鐢熸晥鏃堕棿鍦�1s浠ュ唴 + cls.__latest_sell_active_deal_data_dict[code] = ( + active_data, tool.trade_time_add_millionsecond(deal_time, 1000)) + + @classmethod + def get_valid_trade_single(cls, code, latest_time_with_ms): + """ + 鑾峰彇鏈夋晥鐨勬垚浜や笅鍗曚俊鍙� + @param code: + @param latest_time_with_ms: + @return: 锛堥�愮瑪鎴愪氦鏁版嵁, 绫诲瀷锛� + """ + # 濡傛灉鏈夋渶杩戝崠娑ㄥ仠鎴愪氦瀹屽氨鐢ㄦ渶杩戠殑鏁版嵁 + data = cls.__latest_sell_data_dict.get(code) + if data and tool.trade_time_sub_with_ms(latest_time_with_ms, data[1]) <= 0: + return data, cls.TYPE_PASSIVE + data = cls.__latest_sell_active_deal_data_dict.get(code) + if data and tool.trade_time_sub_with_ms(latest_time_with_ms, data[1]) <= 0: + return data, cls.TYPE_ACTIVE + return None + + @classmethod + def is_can_place_order(cls, code, buy_data): + """ + 鏄惁鍙互涓嬪崟 + @param code: 浠g爜 + @param buy_data: L2閫愮瑪濮旀墭澶т簬50w鐨勪拱鍏ユ暟鎹� + @return: (鏄惁鍙互涓嬪崟, 鍘熷洜) + """ + buy_data_time_with_ms = tool.to_time_with_ms(buy_data['val']['time'], buy_data['val']['tms']) + single = cls.get_valid_trade_single(code, buy_data_time_with_ms) + if not single: + return False, "娌℃湁鎵惧埌鍙敤淇″彿" + if single[0][6] < buy_data['val']['orderNo']: + # 淇″彿浣嶇疆鐨勬垚浜や拱鍗曞彿瑕佸皬浜庝拱鍏ユ暟鎹殑涔板崟鍙锋墠琛� + return True, f"鎵惧埌淇″彿锛歿single}" + else: + return False, f"涔板崟娌℃湁鍦ㄤ俊鍙蜂綅涔嬪悗 淇″彿锛歿single}" + + @classmethod + def clear_data(cls, code): + if code in cls.__latest_sell_data_dict: + cls.__latest_sell_data_dict.pop(code) + + if code in cls.__latest_sell_active_deal_data_dict: + cls.__latest_sell_active_deal_data_dict.pop(code) -- Gitblit v1.8.0