From 7eb1a8ed1a007d80de41d131071ee38f5872700c Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期五, 07 二月 2025 14:26:37 +0800 Subject: [PATCH] 辨识度票策略修改/恢复P撤/上传订阅涨幅 --- trade/buy_radical/radical_buy_data_manager.py | 6 + third_data/kpl_limit_up_data_manager.py | 7 + l2/l2_transaction_data_processor.py | 2 utils/middle_api_protocol.py | 5 + trade/trade_constant.py | 3 + servers/huaxin_trade_server.py | 40 ++----------- l2/code_price_manager.py | 36 +++++++++++ trade/buy_radical/block_special_codes_manager.py | 53 ++++++++++++++++- l2/l2_data_manager_new.py | 12 ++-- 9 files changed, 114 insertions(+), 50 deletions(-) diff --git a/l2/code_price_manager.py b/l2/code_price_manager.py index 0f00fbe..df76595 100644 --- a/l2/code_price_manager.py +++ b/l2/code_price_manager.py @@ -2,8 +2,12 @@ 浠g爜浠锋牸绠$悊 """ import json +import threading +import time + +from code_attribute.gpcode_manager import CodePrePriceManager from db.redis_manager_delegate import RedisUtils -from utils import tool +from utils import tool, middle_api_protocol from db import redis_manager_delegate as redis_manager from log_module.log import logger_trade_queue_price_info @@ -73,7 +77,6 @@ (limit_up_time, open_limit_up_time)) RedisUtils.setex_async(self.__db, f"buy1_price_limit_up_info-{code}", tool.get_expire(), json.dumps((limit_up_time, open_limit_up_time))) - def __get_buy1_price_limit_up_info_cache(self, code): cache_result = tool.CodeDataCacheUtil.get_cache(self.__buy1_price_limit_up_info_cache, code) @@ -200,5 +203,34 @@ return self.__latest_3m_buy1_money_list_dict.get(code) +class CurrentPriceManager: + """ + 鐜颁环绠$悊 + """ + # 浠g爜娑ㄥ箙鏁版嵁 + __current_rate_dict = {} + # 鏈�杩戜笂浼犳椂闂� + __latest_upload_time = 0 + + @classmethod + def set_current_price(cls, code, price): + """ + 璁剧疆鐜颁环 + @param code: + @param price: + @return: + """ + pre_close_price = CodePrePriceManager.get_price_pre_cache(code) + if pre_close_price: + rate = round((price - pre_close_price) * 100 / pre_close_price, 2) + cls.__current_rate_dict[code] = rate + # 鍒ゆ柇鏄惁瑕佷笂浼� + if time.time() - cls.__latest_upload_time >= 3: + # 闂撮殧3s涓婁紶 + cls.__latest_upload_time = time.time() + threading.Thread(target=lambda: middle_api_protocol.request( + middle_api_protocol.load_l2_subscript_codes_rate(cls.__current_rate_dict)), daemon=True).start() + + if __name__ == "__main__": print(Buy1PriceManager().get_limit_up_info("002777")) diff --git a/l2/l2_data_manager_new.py b/l2/l2_data_manager_new.py index 594b9a4..15c035a 100644 --- a/l2/l2_data_manager_new.py +++ b/l2/l2_data_manager_new.py @@ -816,11 +816,11 @@ average_rate = cls.__Buy1PriceManager.get_average_rate(code) if average_rate : if tool.is_ge_code(code): - if average_rate <= 0.07: - return False, True, f"鍧囦环娑ㄥ箙({average_rate})灏忎簬7%", True + if average_rate <= 0.1: + return False, True, f"鍧囦环娑ㄥ箙({average_rate})灏忎簬10%", True else: - if average_rate <= 0.03: - return False, True, f"鍧囦环娑ㄥ箙({average_rate})灏忎簬3%", True + if average_rate <= 0.05: + return False, True, f"鍧囦环娑ㄥ箙({average_rate})灏忎簬5%", True return True, False, f"", False @classmethod @@ -1307,13 +1307,13 @@ # 鏄惁鏄氦鏄撻槦鍒楄Е鍙� # 鎵叆涓嬪崟鍙湁L鎾よ兘鎾ゅ崟 if order_begin_pos and order_begin_pos.mode == OrderBeginPosInfo.MODE_RADICAL and cancel_type not in { - trade_constant.CANCEL_TYPE_L_DOWN, trade_constant.CANCEL_TYPE_L, trade_constant.CANCEL_TYPE_RD}: + trade_constant.CANCEL_TYPE_L_DOWN, trade_constant.CANCEL_TYPE_L, trade_constant.CANCEL_TYPE_RD, trade_constant.CANCEL_TYPE_P}: l2_log.cancel_debug(code, "鎾ゅ崟涓柇锛屽師鍥狅細{}", "鎵叆涓嬪崟涓嶆槸L鎾�") return False # 鍔犵豢鍙湁L鎾�/浜烘挙鐢熸晥 if gpcode_manager.GreenListCodeManager().is_in_cache(code): if cancel_type not in {trade_constant.CANCEL_TYPE_L, trade_constant.CANCEL_TYPE_L_UP, - trade_constant.CANCEL_TYPE_L_DOWN, trade_constant.CANCEL_TYPE_RD}: + trade_constant.CANCEL_TYPE_L_DOWN, trade_constant.CANCEL_TYPE_RD, trade_constant.CANCEL_TYPE_P}: l2_log.cancel_debug(code, "鎾ゅ崟涓柇锛屽師鍥狅細{}", "鍔犵豢涓嶆槸L鎾�") return False diff --git a/l2/l2_transaction_data_processor.py b/l2/l2_transaction_data_processor.py index 3bb47fb..fd6f162 100644 --- a/l2/l2_transaction_data_processor.py +++ b/l2/l2_transaction_data_processor.py @@ -163,7 +163,7 @@ if not need_cancel: need_cancel, cancel_msg = FCancelBigNumComputer().need_cancel_for_p(code, order_begin_pos) - cancel_type = trade_constant.CANCEL_TYPE_F + cancel_type = trade_constant.CANCEL_TYPE_P # 鍒ゆ柇鏃堕棿鏄惁涓庢湰鍦版椂闂寸浉宸�5s浠ヤ笂 if tool.trade_time_sub(tool.get_now_time_str(), l2_huaxin_util.convert_time(datas[-1][3])) > 10: now_seconds = int(tool.get_now_time_str().replace(":", "")) diff --git a/servers/huaxin_trade_server.py b/servers/huaxin_trade_server.py index 60a844e..373af9c 100644 --- a/servers/huaxin_trade_server.py +++ b/servers/huaxin_trade_server.py @@ -392,41 +392,15 @@ @classmethod def l2_market_data(cls, code, data): - - def update_kpl_jx_block(code_, buy_1_price_, limit_up_price_): - # ----------------------------------鏉垮潡鐩稿叧------------------------------ - try: - if code_ in cls.__updating_jx_blocks_codes: - return - cls.__updating_jx_blocks_codes.add(code_) - cls.__KPLCodeJXBlockManager.load_jx_blocks(code_, buy_1_price_, limit_up_price_, - kpl_data_manager.KPLLimitUpDataRecordManager.get_current_reasons()) - # 鏇存柊鏉垮潡淇℃伅 - latest_current_limit_up_records = kpl_data_manager.get_latest_current_limit_up_records() - - codes_delegate = set(CodesTradeStateManager().get_codes_by_trade_states_cache( - {trade_constant.TRADE_STATE_BUY_DELEGATED, trade_constant.TRADE_STATE_BUY_PLACE_ORDER})) - codes_success = set(CodesTradeStateManager().get_codes_by_trade_states_cache( - {trade_constant.TRADE_STATE_BUY_SUCCESS})) - - CodePlateKeyBuyManager.update_can_buy_blocks(code_, - kpl_data_manager.KPLLimitUpDataRecordManager.latest_origin_datas, - kpl_data_manager.KPLLimitUpDataRecordManager.total_datas, - latest_current_limit_up_records, - block_info.get_before_blocks_dict(), - kpl_data_manager.KPLLimitUpDataRecordManager.get_current_limit_up_reason_codes_dict(), - codes_delegate, codes_success) - finally: - cls.__updating_jx_blocks_codes.discard(code_) - time_str = f"{data['dataTimeStamp']}" - if time_str.startswith("9"): - time_str = "0" + time_str - time_str = time_str[:6] - time_str = f"{time_str[0:2]}:{time_str[2:4]}:{time_str[4:6]}" + time_str = l2_huaxin_util.convert_time(time_str) buy_1_price, buy_1_volume = data["buy"][0] sell_1_price, sell_1_volume = data["sell"][0] limit_up_price = gpcode_manager.get_limit_up_price_as_num(code) + # 娑ㄥ箙 + price = data['lastPrice'] + + code_price_manager.CurrentPriceManager.set_current_price(code, price) code_price_manager.Buy1PriceManager().set_latest_buy1_money(code, buy_1_price, buy_1_volume) @@ -443,11 +417,11 @@ except Exception as e: logger_debug.exception(e) - if limit_up_price is not None: + pre_close_price = CodePrePriceManager.get_price_pre_cache(code) + if pre_close_price is not None: average_rate = None try: average_price = data["totalValueTrade"] / data["totalVolumeTrade"] - pre_close_price = CodePrePriceManager.get_price_pre_cache(code) average_rate = round((average_price - pre_close_price) / pre_close_price, 4) except: pass diff --git a/third_data/kpl_limit_up_data_manager.py b/third_data/kpl_limit_up_data_manager.py index d106874..fef51f5 100644 --- a/third_data/kpl_limit_up_data_manager.py +++ b/third_data/kpl_limit_up_data_manager.py @@ -330,5 +330,8 @@ if __name__ == "__main__": - datas = LatestLimitUpBlockManager().statistics_limit_up_block_infos() - print(datas) \ No newline at end of file + # datas = LatestLimitUpBlockManager().statistics_limit_up_block_infos() + # print(datas) + code = "600126" + blocks = LimitUpCodesBlockRecordManager().get_radical_buy_blocks(code) + print(blocks) \ No newline at end of file diff --git a/trade/buy_radical/block_special_codes_manager.py b/trade/buy_radical/block_special_codes_manager.py index e413b7a..4b930ed 100644 --- a/trade/buy_radical/block_special_codes_manager.py +++ b/trade/buy_radical/block_special_codes_manager.py @@ -59,6 +59,11 @@ f"SELECT r.`_hot_block_name`, r.`_code`, COUNT(*) FROM kpl_limit_up_record r WHERE r.`_day`>'{min_day}' and r.`_day`<'{max_day}' and r._code not like '68%' group by r.`_hot_block_name`, r.`_code`") return results + def __list_code_blocks(self, min_day, max_day): + results = self.__mysql.select_all( + f"SELECT r.`_hot_block_name`, r.`_code`, r.`_day` FROM kpl_limit_up_record r WHERE r.`_day`>'{min_day}' and r.`_day`<'{max_day}' and r._code not like '68%'") + return results + def __get_limit_up_info(self, min_day): sql = f"SELECT r.`_code`, COUNT(r.`_code`),r.`_code_name`,IF( r.`_zylt_val` is null, 1, r.`_zylt_val`/100000000 ) FROM (SELECT * FROM kpl_limit_up_record r ORDER BY r.`_create_time` DESC) r WHERE r.`_day`>'{min_day}' GROUP BY r.`_code`" results = self.__mysql.select_all(sql) @@ -122,13 +127,46 @@ 鑾峰彇鏉垮潡鏈夎鲸璇嗗害鐨勪唬鐮� @return: """ - trading_dates = HistoryKDatasUtils.get_latest_trading_date(8) - max_day = trading_dates[-1] + trading_dates = HistoryKDatasUtils.get_latest_trading_date(9) + max_day = trading_dates[0] min_day = tool.date_sub(max_day, 180) block_map = self.__get_block_map() - # [(鏉垮潡鍚嶇О,浠g爜, 鍦ㄦ澘鍧椾腑鐨勬定鍋滄鏁�)] - code_block_infos = self.__get_code_blocks(min_day, max_day) + # 缁熻鏈�杩�180澶╂定鍋滄暟鎹� + # [(鏉垮潡鍚嶇О,浠g爜, 鏃ユ湡)] + code_block_infos = self.__list_code_blocks(min_day, max_day) + + # 缁熻鏈�杩�8澶╃殑娑ㄥ仠鏁版嵁 + min_day = trading_dates[-1] + code_block_infos_8 = self.__get_code_blocks(min_day, max_day) + # 缁熻娑ㄥ仠娆℃暟澶т簬3娆$殑娑ㄥ仠浠g爜 + # 鏍煎紡锛歿"浠g爜":娑ㄥ仠娆℃暟} + count_dict = {} + filter_codes = set() + for d in code_block_infos_8: + if d[1] not in count_dict: + count_dict[d[1]] = 0 + count_dict[d[1]] += d[2] + if count_dict[d[1]] > 3: + filter_codes.add(d[1]) + count_dict.clear() + code_block_infos_8.clear() + + # 鍒犻櫎鏁版嵁 + temp_data_dict = {} + for d in code_block_infos: + if d[1] in filter_codes and int(d[2].replace("-", "")) > int(min_day.replace("-", "")): + # 闇�瑕佽繃婊や笖鏈�杩�8澶╂定鍋� + continue + block, code = d[0], d[1] + k = f"{block}#{code}" + if k not in temp_data_dict: + temp_data_dict[k] = [block, code, 0] + temp_data_dict[k][2] += 1 + code_block_infos = [temp_data_dict[k] for k in temp_data_dict] + + min_day = tool.date_sub(max_day, 180) + code_block_dict = {} # {"浠g爜":{"鏉垮潡": 娑ㄥ仠娆℃暟}} for b in code_block_infos: if b[1] not in code_block_dict: @@ -139,7 +177,11 @@ for bb in bs: if bb not in code_block_dict[b[1]]: code_block_dict[b[1]][bb] = 0 - code_block_dict[b[1]][bb] += b[2] + if tool.is_ge_code(b[1]): + # 鍒涗笟鏉�1娆℃定鍋滅畻2娆℃定鍋� + code_block_dict[b[1]][bb] += b[2] * 2 + else: + code_block_dict[b[1]][bb] += b[2] block_codes_dict = {} # {"鏉垮潡":[锛堜唬鐮�,娑ㄥ仠娆℃暟锛塢} for code in code_block_dict: for b in code_block_dict[code]: @@ -214,4 +256,5 @@ if __name__ == "__main__": # print(datas) datas = AnalysisBlockSpecialCodesManager().get_block_special_codes() + print(datas) # print(BlockSpecialCodesManager().get_code_blocks("002582")) diff --git a/trade/buy_radical/radical_buy_data_manager.py b/trade/buy_radical/radical_buy_data_manager.py index a384de8..e32d16b 100644 --- a/trade/buy_radical/radical_buy_data_manager.py +++ b/trade/buy_radical/radical_buy_data_manager.py @@ -295,7 +295,11 @@ return money_list = [x[0] for x in fmoney_list] money_list = money_list[:2] - # 璁$畻澶у崟: 鍓�2涓ぇ鍗曠殑鍧囧�� + # 璁$畻澶у崟: 鍓�2涓ぇ鍗�+涓囨墜鐨勫潎鍊� + # if tool.is_ge_code(code): + # money_list.append(gpcode_manager.get_limit_up_price_as_num(code) * 300000) + # else: + # money_list.append(gpcode_manager.get_limit_up_price_as_num(code) * 1000000) self.__temp_big_order_threshold[code] = ( int(sum(money_list) // len(money_list)), time.time() + 10, len(money_list) < 2) async_log_util.info(logger_l2_radical_buy_data, diff --git a/trade/trade_constant.py b/trade/trade_constant.py index 3ad9173..3a3c25b 100644 --- a/trade/trade_constant.py +++ b/trade/trade_constant.py @@ -51,3 +51,6 @@ # RD鎾� CANCEL_TYPE_RD = 12 + +# P鎾� +CANCEL_TYPE_P = 13 diff --git a/utils/middle_api_protocol.py b/utils/middle_api_protocol.py index e42f4dc..2888577 100644 --- a/utils/middle_api_protocol.py +++ b/utils/middle_api_protocol.py @@ -70,6 +70,11 @@ fdata = {"type": "l2_subscript_codes", "data": {"ctype": "l2_subscript_codes", "data": datas}} return fdata +# ------------------------------L2璁㈤槄浠g爜鐨勫疄鏃舵定骞�------------------------------------ +def load_l2_subscript_codes_rate(datas): + fdata = {"type": "l2_subscript_codes_rate", "data": {"ctype": "l2_subscript_codes_rate", "data": datas}} + return fdata + # ------------------------------娑堟伅鎺ㄩ��------------------------------------ def load_push_msg(data): -- Gitblit v1.8.0