From 15ee75f52d3258b14670d0487b36eae15a4e9dbc Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期四, 18 四月 2024 17:07:42 +0800 Subject: [PATCH] 共享内存/zeromq通信测试 --- l2/l2_transaction_data_manager.py | 177 ++++++++++++++++++++++++++++++++++++---------------------- 1 files changed, 109 insertions(+), 68 deletions(-) diff --git a/l2/l2_transaction_data_manager.py b/l2/l2_transaction_data_manager.py index 147463e..d5ddc06 100644 --- a/l2/l2_transaction_data_manager.py +++ b/l2/l2_transaction_data_manager.py @@ -8,9 +8,10 @@ from l2 import l2_log from l2.huaxin import l2_huaxin_util from l2.l2_data_util import local_today_sellno_map, local_today_datas +from l2.place_order_single_data_manager import L2TradeSingleDataProcessor, L2TradeSingleDataManager from log_module import async_log_util -from log_module.log import hx_logger_l2_transaction_desc, hx_logger_l2_transaction_sell_order +from log_module.log import hx_logger_l2_transaction_desc, hx_logger_l2_transaction_sell_order, hx_logger_l2_active_sell from utils import tool @@ -104,15 +105,17 @@ # 鏈�杩戞墍鏈夌殑鍗栧崟 __latest_all_sell_orders_dict = {} + # 淇濆瓨鏈�杩戞垚浜ょ殑浠锋牸 + __latest_trade_price_dict = {} + + __last_trade_data_dict = {} + # 杩斿洖鏈�杩�1s鐨勫ぇ鍗曞崠锛�(鎬诲崠閲戦,[(鍗栧崟鍙�,鎬绘墜鏁�,浠锋牸,锛�'寮�濮嬫椂闂�',涔板崟鍙凤級,锛�'缁撴潫鏃堕棿',涔板崟鍙凤級),...]) @classmethod - def add_transaction_datas(cls, code, datas, buy_exec_index=None): + def add_transaction_datas(cls, code, datas, limit_up_price=None): # 鏄惁涓轰富鍔ㄥ崠 - def is_active_sell(sell_no): - if buy_exec_index is not None: - return sell_no > int(total_datas[buy_exec_index]["val"]["orderNo"]) - else: - return f"{sell_no}" not in sell_no_map + def is_active_sell(sell_no, buy_no): + return sell_no > buy_no # q.append((data['SecurityID'], data['TradePrice'], data['TradeVolume'], # data['OrderTime'], data['MainSeq'], data['SubSeq'], data['BuyNo'], @@ -134,36 +137,64 @@ total_datas = local_today_datas.get(code) if not sell_no_map: sell_no_map = {} - for d in datas: - cls.__latest_sell_order_info_list_dict[code].append(d) - if code not in cls.__latest_sell_order_dict: - cls.__latest_sell_order_dict[code] = [d[7], d[2], d[1], (d[3], d[6]), (d[3], d[6])] - else: - if cls.__latest_sell_order_dict[code][0] == d[7]: - cls.__latest_sell_order_dict[code][1] += d[2] - cls.__latest_sell_order_dict[code][2] = d[1] - cls.__latest_sell_order_dict[code][4] = (d[3], d[6]) - else: - info = cls.__latest_sell_order_dict[code] - # 涓婁釜鍗栧崟鎴愪氦瀹屾垚 - # 灏佸瓨鏁版嵁锛岃绠楁柊璧风偣 - # 澶т簬50w鐨勫崠鍗曟墠浼氫繚瀛� - # 澶т簬50w鍔犲叆鍗栧崟 - cls.__latest_all_sell_orders_dict[code].append(info) - money = info[1] * info[2] - if money >= 500000: - if is_active_sell(info[0]): + # 淇濆瓨鏈�杩戠殑鎴愪氦浠锋牸:(浠锋牸,鎴愪氦鏃堕棿) + cls.__latest_trade_price_dict[code] = (datas[-1][1], datas[-1][3]) + + L2TradeSingleDataProcessor.process_passive_limit_up_sell_data(code, datas, limit_up_price) + + for d in datas: + # 鑾峰彇褰撳墠鏄惁涓轰富鍔ㄤ拱 + try: + _is_active_sell = is_active_sell(d[7], d[6]) + if not _is_active_sell: + continue + + if d[1] == limit_up_price: + # 娑ㄥ仠涓诲姩鍗� + L2TradeSingleDataProcessor.add_active_limit_up_sell_data(d) + + # 鍒ゆ柇鏄惁鏄定鍋滆鍔ㄥ彉涓诲姩 + last_trade_data = cls.__last_trade_data_dict.get(code) + if last_trade_data and not is_active_sell(last_trade_data[7], last_trade_data[6]) and last_trade_data[ + 1] == limit_up_price: + if d[1] == limit_up_price: + # 娑ㄥ仠琚姩鍙樹富鍔� + L2TradeSingleDataManager.set_sell_passive_to_active_datas(code, last_trade_data, d) + cls.__latest_sell_order_info_list_dict[code].append(d) + if code not in cls.__latest_sell_order_dict: + cls.__latest_sell_order_dict[code] = [d[7], d[2], d[1], (d[3], d[6]), (d[3], d[6])] + else: + if cls.__latest_sell_order_dict[code][0] == d[7]: + cls.__latest_sell_order_dict[code][1] += d[2] + cls.__latest_sell_order_dict[code][2] = d[1] + cls.__latest_sell_order_dict[code][4] = (d[3], d[6]) + else: + info = cls.__latest_sell_order_dict[code] + + # 涓婁釜鍗栧崟鎴愪氦瀹屾垚 + # 灏佸瓨鏁版嵁锛岃绠楁柊璧风偣 + # 澶т簬50w鐨勫崠鍗曟墠浼氫繚瀛� + # 澶т簬50w鍔犲叆鍗栧崟 + money = info[1] * info[2] + if money >= 500000: + # 璁㈠崟閲岄潰鏈夋垚浜ゆ槸涓诲姩鍗栧氨绠椾富鍔ㄥ崠 l2_log.info(code, hx_logger_l2_transaction_sell_order, f"{cls.__latest_sell_order_dict[code]}") cls.__big_sell_order_ids_dict[code].add(info[0]) cls.__big_sell_order_info_dict[code][info[0]] = info cls.__big_sell_order_info_list_dict[code].append(info) - # 鍙繚鐣�10w浠ヤ笂鐨勫崟 - if money > 100000: - cls.__latest_all_sell_orders_dict[code].append(info) + # 鍙繚鐣�10w浠ヤ笂鐨勫崟 + if money > 100000: + cls.__latest_all_sell_orders_dict[code].append(info) + if limit_up_price == info[2]: + # 灏嗘定鍋滀富鍔ㄥ崠璁板叆鏃ュ織 + l2_log.info(code, hx_logger_l2_active_sell, f"{info}") - cls.__latest_sell_order_dict[code] = [d[7], d[2], d[1], (d[3], d[6]), (d[3], d[6])] + cls.__latest_sell_order_dict[code] = [d[7], d[2], d[1], (d[3], d[6]), (d[3], d[6])] + finally: + cls.__last_trade_data_dict[code] = d + latest_time = l2_huaxin_util.convert_time(datas[-1][3], with_ms=True) min_time = tool.trade_time_add_millionsecond(latest_time, -1000) min_time_int = int(min_time.replace(":", "").replace(".", "")) @@ -171,62 +202,72 @@ total_big_sell_datas = cls.__big_sell_order_info_list_dict.get(code) total_sell_info = [0, None] # 鎬昏祫閲�,寮�濮嬫垚浜や俊鎭�,缁撴潫鎴愪氦淇℃伅 - latest_sell_order_info = cls.__latest_sell_order_dict[code] - big_sell_order_ids = cls.__big_sell_order_ids_dict[code] - # print("澶у崠鍗�", big_sell_order_ids) - big_sell_orders = [] - temp_sell_order_ids = set() - # 缁熻宸茬粡缁撶畻鍑虹殑澶у崟 - for i in range(len(total_big_sell_datas) - 1, -1, -1): - bd = total_big_sell_datas[i] - if min_time_int > int( - l2_huaxin_util.convert_time(bd[3][0], with_ms=True).replace(":", "").replace(".", "")): - break - if bd[0] != latest_sell_order_info[0]: - # 涓嶆槸鏈�杩戠殑鎴愪氦涓斾笉鏄ぇ鍗曠洿鎺ヨ繃婊� - if bd[0] not in big_sell_order_ids: - continue + latest_sell_order_info = cls.__latest_sell_order_dict.get(code) + if latest_sell_order_info: + # 涓嶆槸绗竴娆¢潪涓诲姩鍗栦笂浼� + big_sell_order_ids = cls.__big_sell_order_ids_dict[code] + # print("澶у崠鍗�", big_sell_order_ids) + big_sell_orders = [] + temp_sell_order_ids = set() + # 缁熻宸茬粡缁撶畻鍑虹殑澶у崟 + for i in range(len(total_big_sell_datas) - 1, -1, -1): + bd = total_big_sell_datas[i] + if min_time_int > int( + l2_huaxin_util.convert_time(bd[3][0], with_ms=True).replace(":", "").replace(".", "")): + break + if bd[0] != latest_sell_order_info[0]: + # 涓嶆槸鏈�杩戠殑鎴愪氦涓斾笉鏄ぇ鍗曠洿鎺ヨ繃婊� + if bd[0] not in big_sell_order_ids: + continue + else: + if bd[0] not in temp_sell_order_ids: + big_sell_orders.append(cls.__big_sell_order_info_dict[code].get(bd[0])) + temp_sell_order_ids.add(bd[0]) else: - if bd[0] not in temp_sell_order_ids: - big_sell_orders.append(cls.__big_sell_order_info_dict[code].get(bd[0])) - temp_sell_order_ids.add(bd[0]) - else: - # 鏄渶杩戠殑浣嗕笉鏄ぇ鍗曢渶瑕佽繃婊� - if latest_sell_order_info[1] * latest_sell_order_info[2] < 500000: - continue - else: - if latest_sell_order_info[0] not in temp_sell_order_ids: - big_sell_orders.append(latest_sell_order_info) - temp_sell_order_ids.add(latest_sell_order_info[0]) + # 鏄渶杩戠殑浣嗕笉鏄ぇ鍗曢渶瑕佽繃婊� + if latest_sell_order_info[1] * latest_sell_order_info[2] < 500000: + continue + else: + if latest_sell_order_info[0] not in temp_sell_order_ids: + big_sell_orders.append(latest_sell_order_info) + temp_sell_order_ids.add(latest_sell_order_info[0]) - # 缁熻鏈�杩�1s鐨勫ぇ鍗栧崟鏁版嵁 - total_sell_info[0] += int(bd[1] * bd[2]) - # 缁熻鏈�杩戠殑澶у崟 - if latest_sell_order_info[1] * latest_sell_order_info[2] >= 500000: - if latest_sell_order_info[0] not in temp_sell_order_ids: - if is_active_sell(latest_sell_order_info[0]): + # 缁熻鏈�杩�1s鐨勫ぇ鍗栧崟鏁版嵁 + total_sell_info[0] += int(bd[1] * bd[2]) + # 缁熻鏈�杩戠殑澶у崟 + if latest_sell_order_info[1] * latest_sell_order_info[2] >= 500000: + if latest_sell_order_info[0] not in temp_sell_order_ids: + # if is_active_sell(latest_sell_order_info[0], latest_sell_order_info[3][1]): big_sell_orders.append(latest_sell_order_info) temp_sell_order_ids.add(latest_sell_order_info[0]) total_sell_info[0] += int(latest_sell_order_info[1] * latest_sell_order_info[2]) - big_sell_orders.reverse() - total_sell_info[1] = big_sell_orders + big_sell_orders.reverse() + total_sell_info[1] = big_sell_orders return total_sell_info # 鑾峰彇鏈�杩戞垚浜ゆ暟鎹� @classmethod - def get_latest_transaction_datas(cls, code, min_sell_order_no=None): + def get_latest_transaction_datas(cls, code, min_sell_order_no=None, min_deal_time=None): total_orders = [] sell_orders = cls.__latest_all_sell_orders_dict.get(code) if sell_orders: for i in range(len(sell_orders) - 1, -1, -1): - if min_sell_order_no and min_sell_order_no > sell_orders[i][0]: + if min_deal_time and tool.trade_time_sub(min_deal_time, + l2_huaxin_util.convert_time(sell_orders[i][3][0])) > 0: break + + if min_sell_order_no and min_sell_order_no > sell_orders[i][0]: + continue total_orders.append(sell_orders[i]) - total_orders.extend(sell_orders) if code in cls.__latest_sell_order_dict: - if min_sell_order_no : + if min_sell_order_no: if cls.__latest_sell_order_dict[code][0] >= min_sell_order_no: total_orders.append(cls.__latest_sell_order_dict[code]) else: total_orders.append(cls.__latest_sell_order_dict[code]) return total_orders + + # 鑾峰彇鏈�杩戞垚浜や环鏍间俊鎭�, 杩斿洖鏍煎紡锛氾紙浠锋牸,鏃堕棿锛� + @classmethod + def get_latest_trade_price_info(cls, code): + return cls.__latest_trade_price_dict.get(code) -- Gitblit v1.8.0