From cc2c7a8514d3d6eea4f73b5875c2500883d165f0 Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期一, 26 五月 2025 22:57:20 +0800 Subject: [PATCH] 增加自动加白接口 --- l2/l2_data_manager_new.py | 173 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 164 insertions(+), 9 deletions(-) diff --git a/l2/l2_data_manager_new.py b/l2/l2_data_manager_new.py index b1f6617..c1b0e7f 100644 --- a/l2/l2_data_manager_new.py +++ b/l2/l2_data_manager_new.py @@ -219,6 +219,70 @@ # round(t.time() * 1000) - start_time)) +class HumanRadicalBuySingleManager: + """ + 浜轰负涔板叆绠$悊 + """ + # 浜轰负涓嬪崟鏍囪:{"浠g爜":(淇″彿鏃堕棿, 闂撮殧鏃堕棿,淇″彿鎴嚦鏃堕棿, radical_result)} + __human_radical_buy_mark_info = {} + + @classmethod + def add_single(cls, code, latest_data, radical_result): + """ + 娣诲姞涔板叆淇″彿 + @param code: + @param latest_data: + @param radical_result: + @return: + """ + start_time_with_ms = L2DataUtil.get_time_with_ms(latest_data["val"]) + if tool.is_sh_code(code): + cls.__human_radical_buy_mark_info[code] = ( + start_time_with_ms, 400, tool.trade_time_add_millionsecond(start_time_with_ms, 3000), radical_result) + else: + cls.__human_radical_buy_mark_info[code] = ( + start_time_with_ms, 30, tool.trade_time_add_millionsecond(start_time_with_ms, 2000), radical_result) + + @classmethod + def remove_single(cls, code): + """ + 绉婚櫎淇″彿 + @param code: + @return: + """ + if code in cls.__human_radical_buy_mark_info: + cls.__human_radical_buy_mark_info.pop(code) + + @classmethod + def has_single(cls, code): + """ + 鏄惁鏈変俊鍙� + @param code: + @return: + """ + if code in cls.__human_radical_buy_mark_info: + return True + return False + + @classmethod + def is_valid(cls, code, data): + """ + 淇″彿鏄惁鏈夋晥 + @param code: + @return: 鏄惁鏈夋晥锛屾棤鏁堟秷鎭�/鏈夋晥瀵硅薄 + """ + if code not in cls.__human_radical_buy_mark_info: + return False, "娌℃湁浜轰拱鍏ヤ俊鍙�" + single_time_ms, space_time_ms, expire_time_ms, _ = cls.__human_radical_buy_mark_info[code] + now_time_ms = L2DataUtil.get_time_with_ms(data["val"]) + if tool.trade_time_sub_with_ms(now_time_ms, + expire_time_ms) > 0: + cls.__human_radical_buy_mark_info.pop(code) + async_log_util.info(logger_l2_not_buy_reasons, f"{code}#澶у崟瓒冲锛屼汉涓轰笅鍗曪細 瓒呰繃淇″彿鐢熸晥鏃堕棿-{now_time_ms}/{expire_time_ms}") + return False, "瓒呰繃淇″彿鐢熸晥鏃堕棿" + return True, cls.__human_radical_buy_mark_info[code] + + class L2TradeDataProcessor: unreal_buy_dict = {} volume_rate_info = {} @@ -1458,10 +1522,36 @@ _start_time = tool.get_now_timestamp() total_datas = local_today_datas[code] - # ---------璁$畻婵�杩涗拱鍏ョ殑淇″彿--------- - radical_result = cls.__compute_radical_order_begin_pos(code, compute_start_index, compute_end_index) + # 涓嶉渶瑕佹牴鎹汉涓轰笅鍗曟潵涓嬪崟 + # if not HumanRadicalBuySingleManager.has_single(code): + # # ---------璁$畻婵�杩涗拱鍏ョ殑淇″彿--------- + # radical_result = cls.__compute_radical_order_begin_pos(code, compute_start_index, compute_end_index) + # else: + # human_radical_result = cls.__compute_human_radical_order_begin_pos(code, compute_start_index, + # compute_end_index) + # l2_log.debug(code, f"澶у崟瓒冲锛屼汉涓轰笅鍗曡绠楃粨鏋�({compute_start_index}-{compute_end_index}):{human_radical_result}") + # if human_radical_result[0]: + # radical_result = list(human_radical_result[2]) + # # 鏀瑰彉鎵ц浣嶇疆 + # radical_result[1] = human_radical_result[1]["index"] + # else: + # radical_result = None - if radical_result[0]: + radical_result = cls.__compute_radical_order_begin_pos(code, compute_start_index, compute_end_index) + if radical_result and radical_result[0]: + + # if not HumanRadicalBuySingleManager.has_single(code): + # big_order_deal_enough_result = radical_buy_data_manager.is_big_order_deal_enough(code, + # code_volumn_manager.CodeVolumeManager().get_volume_rate_refer_in_5days( + # code), 0) + # if big_order_deal_enough_result[6] <= 0: + # HumanRadicalBuySingleManager.add_single(code, total_datas[-1], radical_result) + # async_log_util.info(logger_l2_not_buy_reasons, f"{code}#澶у崟瓒冲锛岄渶瑕佹牴鎹汉涓轰笅鍗�({compute_start_index}-{compute_end_index})锛歿radical_result[1]}") + # return + # #涓嬪崟鍓嶄竴姝ワ紝绉婚櫎浜轰负涓嬪崟淇″彿 + # is_human_radical_buy = HumanRadicalBuySingleManager.has_single(code) + # HumanRadicalBuySingleManager.remove_single(code) + buy_single_index, buy_exec_index = radical_result[1], radical_result[1] buy_volume_rate = cls.volume_rate_info[code][0] refer_sell_data = cls.__L2MarketSellManager.get_refer_sell_data(code, total_datas[buy_single_index]["val"][ @@ -1481,7 +1571,9 @@ mode=OrderBeginPosInfo.MODE_RADICAL, mode_desc=f"澶у崟涓嶈冻鎵叆:{radical_result[2]}", sell_info=sell_info, - threshold_money=threshold_money) + threshold_money=threshold_money, + min_order_no=radical_result[5] + ) order_begin_pos_info.at_limit_up = cls.__is_at_limit_up_buy(code) ordered = cls.__process_with_find_exec_index(code, order_begin_pos_info, compute_end_index, block_info=radical_result[3]) @@ -1934,11 +2026,10 @@ @param code: @param start_index: @param end_index: - @return: (鏄惁鑾峰彇鍒颁俊鍙�, 淇″彿浣嶇疆, 鎵叆鏉垮潡/娑堟伅, 鎵叆鏉垮潡澶у崟娴佸叆淇℃伅, 闇�瑕佺洃鍚殑澶у崟) + @return: (鏄惁鑾峰彇鍒颁俊鍙�, 淇″彿浣嶇疆, 鎵叆鏉垮潡/娑堟伅, 鎵叆鏉垮潡澶у崟娴佸叆淇℃伅, 闇�瑕佺洃鍚殑澶у崟, 缁熻涓婃澘澶у崟鎴愪氦鐨勬渶灏忚鍗曞彿) """ # 婵�杩涗拱淇″彿鐨勬椂闂� - def __can_order(): # 鍒ゆ柇鏄惁鏄澘涓婃斁閲� # if cls.__is_at_limit_up_buy(code, start_index): @@ -2039,8 +2130,13 @@ single_index = i break if single_index is not None: - return True, single_index, f"鏈夊ぇ鍗�,澶у崟鎯呭喌锛歿big_order_deal_enough_result[1]}", watch_indexes - return False, None, f"澶у崟涓嶈冻锛歿trade_index}-{end_index} 缂哄皯鐨勫ぇ鍗�-{max(current_lack_money, total_lack_money)} 澶у崟鎯呭喌锛歿big_order_deal_enough_result[1]}", watch_indexes + every_time_big_orders = EveryLimitupBigDealOrderManager.list_big_buy_deal_orders(code) + if every_time_big_orders: + min_order_no = min(min(every_time_big_orders, key=lambda e: e[0])[0], radical_data[1]) + else: + min_order_no = radical_data[1] + return True, single_index, f"鏈夊ぇ鍗�,澶у崟鎯呭喌锛歿big_order_deal_enough_result[1]}", watch_indexes, min_order_no + return False, None, f"澶у崟涓嶈冻锛歿trade_index}-{end_index} 缂哄皯鐨勫ぇ鍗�-{max(current_lack_money, total_lack_money)} 澶у崟鎯呭喌锛歿big_order_deal_enough_result[1]}", watch_indexes, None radical_data = RadicalBuyDealCodesManager.buy_by_l2_delegate_expire_time_dict.get(code) record_codes = radical_buy_data_manager.BlockPlaceOrderRecordManager().get_codes() @@ -2084,10 +2180,67 @@ # 濡傛灉鏉夸笂鏀鹃噺涓嶅彲涔板叆灏遍渶瑕佸垹闄や俊鍙� if not constant.CAN_RADICAL_BUY_AT_LIMIT_UP and code in RadicalBuyDealCodesManager.buy_by_l2_delegate_expire_time_dict: RadicalBuyDealCodesManager.buy_by_l2_delegate_expire_time_dict.pop(code) - return True, result[1], radical_data[2], radical_data[4], result[3] + return True, result[1], radical_data[2], radical_data[4], result[3], result[4] else: async_log_util.info(logger_l2_not_buy_reasons, f"{code}#{result[2]}") return result + + @classmethod + def __compute_human_radical_order_begin_pos(cls, code, start_index, end_index): + """ + 澶勭悊璺熶汉涔� + @param code: + @param start_index: + @param end_index: + @return: + """ + total_datas = local_today_datas.get(code) + result = HumanRadicalBuySingleManager.is_valid(code, total_datas[start_index]) + if not result[0]: + return False, None, result[1] + result = result[1] + single_time_ms, space_time_ms, expire_time_ms, radical_result = result[0], result[1], result[2], result[3] + + bigger_num = l2_data_util.get_big_money_val(gpcode_manager.get_limit_up_price_as_num(code), + tool.is_ge_code(code)) // ( + gpcode_manager.get_limit_up_price_as_num(code) * 100) + canceled_buyno_map = local_today_buyno_map.get(code) + 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"] < bigger_num: + continue + + left_count = l2_data_source_util.L2DataSourceUtils.get_limit_up_buy_no_canceled_count_v2(code, i, + total_datas, + canceled_buyno_map) + if left_count == 0: + continue + + # 鍒ゆ柇鏄惁瓒呰繃鐢熸晥鏃堕棿 + if tool.trade_time_sub_with_ms(L2DataUtil.get_time_with_ms(total_datas[i]["val"]), + expire_time_ms) > 0: + HumanRadicalBuySingleManager.remove_single(code) + return False, None, "瓒呰繃淇″彿鐢熸晥鏃堕棿" + is_valid = False + # 鍒ゆ柇璺濈涓婁釜50w涔板崟鐨勬椂闂存槸鍚﹁秴杩囦簡space_time_ms + buy_exec_index = radical_result[1] + for ii in range(i - 1, buy_exec_index, -1): + data_child = total_datas[ii] + val_child = data_child["val"] + if not L2DataUtil.is_limit_up_price_buy(val_child): + continue + if val_child["num"] * float(val_child["price"]) < 5000: + continue + if tool.trade_time_sub_with_ms(L2DataUtil.get_time_with_ms(val), + L2DataUtil.get_time_with_ms(val_child)) > space_time_ms: + is_valid = True + break + if is_valid: + return True, data, radical_result + return False, None, "娌℃湁鏈夋晥淇″彿" # 鎬诲崠棰濆弬鑰冩椂闂翠娇鐢ㄨ褰� __refer_sell_used_times = {} @@ -2101,6 +2254,8 @@ @param end_index: @return: 淇″彿淇℃伅锛堜俊鍙蜂綅,鎵ц浣嶏級, 娑堟伅, 鍙拱鍏ョ殑鏉垮潡 """ + if True: + return None, "姝ゆ潯涓嶇敓鏁�", None if not tool.is_sz_code(code): return None, "闈炴繁璇佺殑绁�", None # 鍒ゆ柇鎶涘帇鏄惁澶т簬5000w -- Gitblit v1.8.0