From 2c707e6083d8d60b088a7f91a0020370e65c8c7f Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期二, 29 十月 2024 17:10:24 +0800 Subject: [PATCH] 昨日跌幅过大不扫入/添加日志记录 --- trade/trade_result_manager.py | 11 ++- code_attribute/code_nature_analyse.py | 30 ++++++++- trade/radical_buy_data_manager.py | 9 ++ code_attribute/gpcode_manager.py | 18 +++++- servers/huaxin_trade_server.py | 8 ++ l2/l2_data_manager_new.py | 75 +++++++++++++------------ 6 files changed, 101 insertions(+), 50 deletions(-) diff --git a/code_attribute/code_nature_analyse.py b/code_attribute/code_nature_analyse.py index 0984759..269b26a 100644 --- a/code_attribute/code_nature_analyse.py +++ b/code_attribute/code_nature_analyse.py @@ -220,8 +220,8 @@ p11 = __is_latest_open_limit_up(code, record_datas, 5) # 90澶╁唴鏄惁鏈夋定鍋� p12 = __has_limit_up(code, record_datas, 90) - # 鏈�杩�5澶╂槸鍚﹁穼鍋� - p13 = __is_latest_limit_down(code, record_datas, 5) + # 涓婁釜浜ゆ槗鏃ユ槸鍚﹁穼骞呰繃澶� + p13 = __is_pre_day_limit_rate_too_low(code, record_datas) # 60涓氦鏄撴棩鏄惁鏇炬定鍋� p14 = __has_limited_up(code, record_datas, 60) # 鏄ㄦ棩鏄惁娑ㄥ仠杩� @@ -578,6 +578,26 @@ return False +def __is_pre_day_limit_rate_too_low(code, datas): + """ + 涓婁釜浜ゆ槗鏃ユ槸鍚﹁穼骞呰繃澶� + @param code: + @param datas: + @return: + """ + datas = copy.deepcopy(datas) + datas.sort(key=lambda x: x["bob"]) + items = datas[-1:] + for item in items: + # 鏄惁鏈夎穼鍋� + # 鑾峰彇褰撴棩娑ㄥ箙 + rate = (item["close"] - item["pre_close"])/item["pre_close"] + threshold_rate_ = round(0 - ((1 - tool.get_limit_down_rate(code))*0.9), 2) + if rate < threshold_rate_: + return True + return False + + # V瀛楀舰 def __is_v_model(code, datas): datas = copy.deepcopy(datas) @@ -738,6 +758,6 @@ if __name__ == "__main__": - HighIncreaseCodeManager().add_code("000333") - print(HighIncreaseCodeManager().is_in("000333")) - print(HighIncreaseCodeManager().is_in("000222")) + code = "000333" + threshold_rate = 0 - ((1 - tool.get_limit_down_rate(code)) * 0.9) + print(threshold_rate) diff --git a/code_attribute/gpcode_manager.py b/code_attribute/gpcode_manager.py index 98f25de..64bd83d 100644 --- a/code_attribute/gpcode_manager.py +++ b/code_attribute/gpcode_manager.py @@ -22,6 +22,17 @@ class CodesNameManager: __mysqldb = Mysqldb() __code_name_dict = {} + __instance = None + + def __new__(cls, *args, **kwargs): + if not cls.__instance: + cls.__instance = super(CodesNameManager, cls).__new__(cls, *args, **kwargs) + cls.__load_data() + return cls.__instance + + @classmethod + def __load_data(cls): + cls.__code_name_dict = cls.list_code_name_dict() @classmethod def list_code_name_dict(cls): @@ -98,6 +109,7 @@ # 鎯宠涔扮殑浠g爜 class WantBuyCodesManager: __instance = None + __db = 0 redisManager = redis_manager.RedisManager(0) __redis_key = "want_buy_codes" @@ -126,7 +138,7 @@ def remove_code(self, code): self.__want_buy_codes_cache.discard(code) - RedisUtils.srem(self.__get_redis(), self.__redis_key, code) + RedisUtils.srem_async(self.__db, self.__redis_key, code) def sync(self): codes = self.list_code() @@ -397,7 +409,7 @@ def remove_code(self, code): self.__codes_set.discard(code) - RedisUtils.srem(self.__get_redis(), "green-trade-codes", code) + RedisUtils.srem_async(self.__db, "green-trade-codes", code) def is_in(self, code): return RedisUtils.sismember(self.__get_redis(), "green-trade-codes", code) @@ -532,7 +544,7 @@ # 鑾峰彇浠g爜鐨勫悕绉� def get_code_name(code): - return CodesNameManager.get_code_name(code) + return CodesNameManager().get_code_name(code) def get_name_codes(): diff --git a/l2/l2_data_manager_new.py b/l2/l2_data_manager_new.py index a93f09d..1f6c604 100644 --- a/l2/l2_data_manager_new.py +++ b/l2/l2_data_manager_new.py @@ -724,7 +724,8 @@ return False, True, f"14:57鍚庝笉鑳戒氦鏄�", True if cls.__TradeTargetCodeModeManager.get_mode_cache() == TradeTargetCodeModeManager.MODE_ONLY_BUY_WANT_CODES: - if not cls.__WantBuyCodesManager.is_in_cache(code) and not gpcode_manager.GreenListCodeManager().is_in_cache(code): + if not cls.__WantBuyCodesManager.is_in_cache( + code) and not gpcode_manager.GreenListCodeManager().is_in_cache(code): return False, True, f"鍙拱鎯充拱锛氭病鍦ㄦ兂涔板崟鍜岀豢鍗�", True return True, False, f"", False @@ -1156,10 +1157,7 @@ k_format = code_nature_analyse.CodeNatureRecordManager().get_k_format_cache(code) # 鏄惁鏈夎鲸璇嗗害 is_special = True if k_format and k_format[8][0] else False - # 涓�5涓氦鏄撴棩鏈夌偢鏉夸箣鍚� - has_open_limit_up_in_5 = True if k_format and len(k_format) >= 11 and k_format[10] else False - # 涓�5涓氦鏄撴棩鏈夎穼鍋� - has_limit_down_in_5 = True if k_format and len(k_format) >= 13 and k_format[12] else False + # 鏄惁鏄己鍔�10鍒嗛挓 is_in_strong_time = now_timestamp <= int("094000") # 鏄惁鏄己鍔�30鍒嗛挓 @@ -1519,7 +1517,7 @@ max_num_set=set(), buy_volume_rate=buy_volume_rate, mode=OrderBeginPosInfo.MODE_RADICAL, - mode_desc="鎬绘姏鍘嬪皬鎵叆", + mode_desc=f"鎬绘姏鍘嬪皬鎵叆", sell_info=sell_info, threshold_money=threshold_money) order_begin_pos_info.at_limit_up = cls.__is_at_limit_up_buy(code) @@ -1933,43 +1931,48 @@ @param end_index: @return: (鏄惁鑾峰彇鍒颁俊鍙�, 淇″彿浣嶇疆, 娑堟伅) """ + # 婵�杩涗拱淇″彿鐨勬椂闂� + + def __can_order(): + # 鍒ゆ柇鏄惁鏄澘涓婃斁閲� + if cls.__is_at_limit_up_buy(code, start_index): + return False, None, "鏉夸笂鏀鹃噺" + total_datas = local_today_datas[code] + min_num = int(29900 / gpcode_manager.get_limit_up_price_as_num(code)) + # 濡傛灉鏈夊ぇ鍗曟垚浜ゅ氨涓嶉渶瑕佺湅澶у崟 + deal_money_list = BigOrderDealManager().get_total_buy_money_list(code) + if deal_money_list: + for m in deal_money_list: + if m >= 2990000: + min_num = int(5000 / gpcode_manager.get_limit_up_price_as_num(code)) + break + + single_index = None + for i in range(start_index, end_index + 1): + data = total_datas[i] + val = data["val"] + if not L2DataUtil.is_limit_up_price_buy(val): + continue + if val["num"] < min_num: + continue + if int(val["orderNo"]) <= radical_data[1]: + # 涓诲姩涔板崟鍚庣殑鏁版嵁涓嶇畻 + continue + single_index = i + break + if single_index is not None: + return True, single_index, "鏈夊ぇ鍗�" + return False, None, "鏃犲ぇ鍗�" radical_data = RadicalBuyDealCodesManager.buy_by_l2_delegate_expire_time_dict.get(code) if not radical_data: return False, None, "涓嶆弧瓒虫縺杩涗拱鐨勬潯浠�" if t.time() > radical_data[0]: return False, None, "瓒呰繃鐢熸晥鏃堕棿" - - # 鍒ゆ柇鏄惁鏄澘涓婃斁閲� - if cls.__is_at_limit_up_buy(code, start_index): - return False, None, "鏉夸笂鏀鹃噺" - total_datas = local_today_datas[code] - min_num = int(29900 / gpcode_manager.get_limit_up_price_as_num(code)) - # 濡傛灉鏈夊ぇ鍗曟垚浜ゅ氨涓嶉渶瑕佺湅澶у崟 - deal_money_list = BigOrderDealManager().get_total_buy_money_list(code) - if deal_money_list: - for m in deal_money_list: - if m >= 2990000: - min_num = int(5000 / gpcode_manager.get_limit_up_price_as_num(code)) - break - - single_index = None - for i in range(start_index, end_index + 1): - data = total_datas[i] - val = data["val"] - if not L2DataUtil.is_limit_up_price_buy(val): - continue - if val["num"] < min_num: - continue - if int(val["orderNo"]) <= radical_data[1]: - # 涓诲姩涔板崟鍚庣殑鏁版嵁涓嶇畻 - continue - single_index = i - break - if single_index is not None: - return True, single_index, "鏈夊ぇ鍗�" - return False, None, "鏃犲ぇ鍗�" + result = __can_order() + l2_log.debug(code, f"L2鎵叆鍒ゆ柇锛歿result}") + return result @classmethod def test__compute_active_order_begin_pos(cls, code, continue_count, start_index, end_index): diff --git a/servers/huaxin_trade_server.py b/servers/huaxin_trade_server.py index b688be3..88940e2 100644 --- a/servers/huaxin_trade_server.py +++ b/servers/huaxin_trade_server.py @@ -18,7 +18,7 @@ from cancel_strategy.s_l_h_cancel_strategy import SCancelBigNumComputer from code_attribute import gpcode_manager, code_volumn_manager, global_data_loader, zyltgb_util, code_nature_analyse from code_attribute.code_l1_data_manager import L1DataManager -from code_attribute.gpcode_manager import CodePrePriceManager +from code_attribute.gpcode_manager import CodePrePriceManager, CodesNameManager from huaxin_client import l2_data_transform_protocol from huaxin_client.trade_transform_protocol import TradeResponse from l2 import l2_data_manager_new, l2_log, code_price_manager, l2_data_util, transaction_progress, \ @@ -232,6 +232,7 @@ # 鑾峰彇level1鐨勪唬鐮� list_ = JueJinApi.get_exchanges_codes(["SHSE", "SZSE"]) fdatas = [] + code_name_map = {} for d in list_: if not tool.is_target_code(d["sec_id"]): continue @@ -244,6 +245,11 @@ days=100)).timestamp() > datetime.datetime.now().timestamp(): continue fdatas.append(d["sec_id"]) + code_name_map[d["sec_id"]] = d["sec_name"] + # 淇濆瓨浠g爜鍚嶇О + for k in code_name_map: + CodesNameManager.add_code_name(k, code_name_map[k]) + sk.sendall( socket_util.load_header(json.dumps({"code": 0, "data": fdatas}).encode(encoding='utf-8'))) diff --git a/trade/radical_buy_data_manager.py b/trade/radical_buy_data_manager.py index 8aaa89a..e68e42a 100644 --- a/trade/radical_buy_data_manager.py +++ b/trade/radical_buy_data_manager.py @@ -50,8 +50,13 @@ zyltgb_as_yi = round(zyltgb / 100000000, 2) if zyltgb_as_yi > constant.MAX_CODE_RADICAL_BUY_ZYLTGB_AS_YI: return False, "鑷敱娴侀�氬競鍊艰繃澶�" - elif zyltgb_as_yi < constant.MIN_CODE_RADICAL_BUY_ZYLTGB_AS_YI: + elif zyltgb_as_yi < constant.MIN_CODE_RADICAL_BUY_ZYLTGB_AS_YI: return False, "鑷敱娴侀�氬競鍊艰繃灏�" + # 鍒ゆ柇鏄ㄦ棩鏄惁璺屽箙杩囧ぇ + k_format = code_nature_analyse.CodeNatureRecordManager().get_k_format_cache(code) + if k_format and len(k_format) > 12 and k_format[12]: + return False, "涓婁釜浜ゆ槗鏃ヨ穼骞呰繃澶�" + if gpcode_manager.BlackListCodeManager().is_in_cache(code): if deal_codes is not None and code in deal_codes: pass @@ -93,7 +98,7 @@ cls.__deal_big_order_nos_dict[code].clear() @classmethod - def add_big_buy_order_deal(cls, code, order_nos:list): + def add_big_buy_order_deal(cls, code, order_nos: list): if code not in cls.__deal_big_order_nos_dict: cls.__deal_big_order_nos_dict[code] = set() for order_no in order_nos: diff --git a/trade/trade_result_manager.py b/trade/trade_result_manager.py index 71c454e..86d164f 100644 --- a/trade/trade_result_manager.py +++ b/trade/trade_result_manager.py @@ -4,7 +4,7 @@ from cancel_strategy.s_l_h_cancel_strategy import HourCancelBigNumComputer from cancel_strategy.s_l_h_cancel_strategy import LCancelBigNumComputer from cancel_strategy.s_l_h_cancel_strategy import SCancelBigNumComputer -from code_attribute.gpcode_manager import MustBuyCodesManager, GreenListCodeManager +from code_attribute.gpcode_manager import MustBuyCodesManager, GreenListCodeManager, WantBuyCodesManager from l2 import l2_data_manager, place_order_single_data_manager from l2.cancel_buy_strategy import FCancelBigNumComputer, \ NewGCancelBigNumComputer, JCancelBigNumComputer, NBCancelBigNumComputer @@ -142,7 +142,11 @@ __latest_cancel_l2_data_dict[code] = total_datas[-1] # 鎾ゅ崟鎴愬姛闇�瑕佺Щ闄ょ孩鍚嶅崟 - if not GreenListCodeManager().is_in_cache(code): + if GreenListCodeManager().is_in_cache(code): + GreenListCodeManager().remove_code(code) + if WantBuyCodesManager().is_in_cache(code): + WantBuyCodesManager().remove_code(code) + if MustBuyCodesManager().is_in_cache(code): MustBuyCodesManager().remove_code(code) @@ -151,7 +155,8 @@ if code not in __latest_cancel_l2_data_dict: return True threshold_time_space = buy_condition_util.get_cancel_and_buy_space_time(code) - if L2DataUtil.time_sub_as_ms(buy_exec_data["val"], __latest_cancel_l2_data_dict[code]["val"]) >= threshold_time_space: + if L2DataUtil.time_sub_as_ms(buy_exec_data["val"], + __latest_cancel_l2_data_dict[code]["val"]) >= threshold_time_space: return True return False -- Gitblit v1.8.0