From f2dfe1818b6286e4ff25e97c4d72a17bae4eea42 Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期三, 22 一月 2025 23:05:22 +0800 Subject: [PATCH] 辨识度修改/临时大单bug修改 --- third_data/history_k_data_util.py | 3 trade/buy_radical/radical_buy_data_manager.py | 55 ++++++++++++++---- l2_test.py | 10 +++ l2/huaxin/huaxin_delegate_postion_manager.py | 55 ++++++++++++++++-- trade/buy_radical/radical_buy_strategy.py | 5 - constant.py | 4 trade/buy_radical/block_special_codes_manager.py | 15 +++- l2/l2_data_manager_new.py | 13 ++- l2/l2_transaction_data_manager.py | 3 9 files changed, 124 insertions(+), 39 deletions(-) diff --git a/constant.py b/constant.py index c010a0f..c0954fb 100644 --- a/constant.py +++ b/constant.py @@ -198,11 +198,11 @@ MAX_SUBSCRIPT_CODE_PRICE = 100 # 鎵叆浠锋牸鍖洪棿 -MAX_CODE_RADICAL_BUY_PRICE = 40 +MAX_CODE_RADICAL_BUY_PRICE = 50 MIN_CODE_RADICAL_BUY_PRICE = 2 # 鎵叆鐨勮嚜鐢辨祦閫氬競鍊煎尯闂达細[[(鑷敱娴侀�氭渶灏忓��,鑷敱娴侀�氭渶澶у��),(鑲′环鏈�灏忓��,鑲′环鏈�澶у��)]] -RADICAL_BUY_ZYLTGB_AS_YI_RANGES = [[(5, 1000), (3, 40)], [(50, 1000), (2, 3)]] +RADICAL_BUY_ZYLTGB_AS_YI_RANGES = [[(5, 1000), (3, 50)], [(50, 1000), (2, 3)]] # L2鏁版嵁鏄惁杞藉叆瀹屾垚 L2_DATA_IS_LOADED = False diff --git a/l2/huaxin/huaxin_delegate_postion_manager.py b/l2/huaxin/huaxin_delegate_postion_manager.py index b13087d..e53683f 100644 --- a/l2/huaxin/huaxin_delegate_postion_manager.py +++ b/l2/huaxin/huaxin_delegate_postion_manager.py @@ -8,6 +8,7 @@ from l2 import l2_data_util, l2_data_source_util from l2.huaxin import l2_huaxin_util from l2.l2_data_util import L2DataUtil +from l2.transaction_progress import TradeBuyQueue from log_module import async_log_util from log_module.log import hx_logger_trade_debug, logger_real_place_order_position, logger_debug from trade.huaxin import huaxin_trade_record_manager @@ -197,27 +198,37 @@ if set(target_volumes) != set(volumes_list[i:i + len(target_volumes)]): continue # 濮旀墭闂撮殧鏃堕棿涓嶈兘鐩稿樊100ms浠ヤ笂 + # volumes_info_list:鐩爣閲忓垪琛� temp_volumes_info_list = volumes_info_list[i:i + len(target_volumes)] sub_time_list = [] + sub_index_list = [] for j in range(0, len(temp_volumes_info_list) - 1): sub_ms = tool.trade_time_sub_with_ms( L2DataUtil.get_time_with_ms(temp_volumes_info_list[j + 1][2]["val"]), L2DataUtil.get_time_with_ms(temp_volumes_info_list[j][2]["val"])) + sub_index = temp_volumes_info_list[j + 1][2]["index"] - temp_volumes_info_list[j][2]["index"] sub_time_list.append(abs(sub_ms)) + sub_index_list.append(sub_index) max_sub_time = max(sub_time_list) + max_sub_index = max(sub_index_list) if max_sub_time > THRESHOLD_MS: continue - # 鏈�澶х殑鏃堕棿宸� - match_list.append((max_sub_time, temp_volumes_info_list[0][2])) + # 鏈�澶х殑鏃堕棿宸�,鏈�澶х殑绱㈠紩宸�, 鏁版嵁 + match_list.append((max_sub_time, max_sub_index, temp_volumes_info_list[0][2])) if not match_list: # 娌℃湁鎵惧埌鐪熷疄涓嬪崟浣� return None + # 鏈�鍚堥�傜殑鏄椂闂寸浉宸负0锛岀储寮曠浉宸负1 + for m in match_list: + if m[0] == 0 and m[1] == 1: + return m[2] + # 鑾峰彇鏃堕棿宸渶灏忕殑鏁版嵁 real_place_order_info = match_list[0] for x in match_list: if x[0] < real_place_order_info[0]: real_place_order_info = x - return real_place_order_info[1] + return real_place_order_info[2] @classmethod def compute_l2_place_order_position(cls, code, add_datas): @@ -259,17 +270,47 @@ return None, order_info, None @classmethod - def recompute_for_slow_time(cls, code, order_info, real_place_index, compute_type): + def recompute_l2_place_order_position(cls, code, order_info, real_place_index, compute_type): """ - 鍥犱负L2鏁版嵁寤惰繜闂鑰岄噸鏂拌绠楃湡瀹炰笅鍗曚綅 + 閲嶆柊璁$畻鐪熷疄涓嬪崟浣� @param code: @param order_info: @param real_place_index: @param compute_type: @return: """ - # TODO 閲嶆柊璁$畻, 鏍规嵁瀹為檯璁㈠崟鏉ヨ绠� - pass + # 閲嶆柊璁$畻, 鏍规嵁瀹為檯璁㈠崟鏉ヨ绠� + # 濡傛灉鐪熷疄涓嬪崟浣嶅湪瀹為檯鎴愪氦浣嶇疆涔嬪悗灏遍渶瑕佺煫姝� + trade_index, is_default = TradeBuyQueue().get_traded_index(code) + if is_default: + return None + # if real_place_index >= trade_index: + # return None + current_delegates = huaxin_trade_record_manager.DelegateRecordManager().list_current_delegates(code) + if not current_delegates: + return None + accept_time = current_delegates[0]["acceptTime"] + accept_time = int(accept_time.replace(":", "")) + # 浠庣湡瀹炰笅鍗曚綅缃紑濮嬶紝鍒板鎵樻椂闂存埅姝� + total_datas = l2_data_util.local_today_datas.get(code) + end_index = None + for i in range(trade_index + 1, total_datas[-1]["index"]): + data = total_datas[i] + val = data["val"] + if int(val["time"].replace(":", "")) > accept_time: + end_index = data["index"] + break + if end_index is None: + return None + + order_info_list = order_info[0] # [(閲�,浠锋牸, order_ref)] + exec_data = order_info[1] + place_order_data = cls.__compute_real_place_order_position(code, exec_data, order_info_list, + total_datas[trade_index + 1:end_index]) + if not place_order_data: + return None + real_place_index_info = place_order_data["index"], RELIABILITY_TYPE_REAL + return real_place_index_info[0] @classmethod def get_place_order_position(cls, code): diff --git a/l2/l2_data_manager_new.py b/l2/l2_data_manager_new.py index 89bc69d..f9f1910 100644 --- a/l2/l2_data_manager_new.py +++ b/l2/l2_data_manager_new.py @@ -1,6 +1,7 @@ import copy import logging import threading +import time import time as t from cancel_strategy.s_l_h_cancel_strategy import HourCancelBigNumComputer, LCancelRateManager @@ -392,10 +393,10 @@ @classmethod def __recompute_real_order_index(cls, code, pre_real_order_index, order_info, compute_type): - # 鍥犱负鏁版嵁鎱㈢殑闂閲嶆柊璁$畻 - real_order_index = huaxin_delegate_postion_manager.recompute_for_slow_time(code, order_info, - pre_real_order_index, compute_type) - if real_order_index: + # 1s涔嬪悗閲嶆柊璁$畻 + time.sleep(1) + real_order_index = huaxin_delegate_postion_manager.RealDelegateOrderPositionManager().recompute_l2_place_order_position(code, order_info, pre_real_order_index, compute_type) + if real_order_index and pre_real_order_index!=real_order_index: try: exec_index = order_info[6] order_begin_pos = cls.__get_order_begin_pos( @@ -1907,7 +1908,9 @@ return False, None, "璺濈涓婃缁熻澶у崟鏃堕棿杩囧幓60s", set() if lack_money == 0: - min_num = int(5000 / limit_up_price) + if not tool.is_sh_code(code): + # 闈炰笂璇佺殑绁ㄧ湅50w + min_num = int(5000 / limit_up_price) # 闇�瑕佺洃鍚殑澶у崟 watch_indexes = set() # 鎬诲鎵樺ぇ鍗曢噾棰� diff --git a/l2/l2_transaction_data_manager.py b/l2/l2_transaction_data_manager.py index 9a5efdb..ad2d8ac 100644 --- a/l2/l2_transaction_data_manager.py +++ b/l2/l2_transaction_data_manager.py @@ -230,7 +230,8 @@ cls.__dealing_order_info_dict[code][4] = data[3] cls.__dealing_order_info_dict[code][5] = data[1] cls.__dealing_order_info_dict[code][6] = data[7] - cls.__dealing_order_info_dict[code][7] += money + if is_limit_up: + cls.__dealing_order_info_dict[code][7] += money else: # 淇濆瓨涓婁竴鏉℃暟鎹� async_log_util.info(hx_logger_l2_transaction_desc, f"{code}#{cls.__dealing_order_info_dict[code]}") diff --git a/l2_test.py b/l2_test.py index 60914b8..07d0a4a 100644 --- a/l2_test.py +++ b/l2_test.py @@ -57,7 +57,15 @@ code = ps_dict.get('code') money_info = CodeInMoneyManager().get_money_info(code) response_data = json.dumps({"code": 0, "data": money_info}) - + elif url.path == "/get_codes_money_info": + ps_dict = dict([(k, v[0]) for k, v in parse_qs(url.query).items()]) + codes_str = ps_dict.get('codes') + codes = json.loads(codes_str) + fresults = {} + for code in codes: + money_info = CodeInMoneyManager().get_money_info(code) + fresults[code] = money_info + response_data = json.dumps({"code": 0, "data": fresults}) self.send_response(200) # 鍙戠粰璇锋眰瀹㈡埛绔殑鍝嶅簲鏁版嵁 self.send_header('Content-type', 'application/json') diff --git a/third_data/history_k_data_util.py b/third_data/history_k_data_util.py index aada0ae..a054626 100644 --- a/third_data/history_k_data_util.py +++ b/third_data/history_k_data_util.py @@ -242,7 +242,6 @@ except Exception as e: logger_debug.exception(e) - @classmethod def get_gp_current_info(cls, codes): return JueJinApi.get_gp_current_info(codes) @@ -372,10 +371,10 @@ latest_trading_date = tool.get_now_date_str() return latest_trading_date + if __name__ == "__main__": print(HistoryKDatasUtils.get_previous_trading_date("2024-12-31")) print(HistoryKDatasUtils.get_history_tick_n("000095", 10)) - # now_day = tool.get_now_date_str() # results = JueJinApi.get_history_instruments(JueJinApi.get_juejin_code_list_with_prefix(["600265"]), diff --git a/trade/buy_radical/block_special_codes_manager.py b/trade/buy_radical/block_special_codes_manager.py index e40993e..c4044bc 100644 --- a/trade/buy_radical/block_special_codes_manager.py +++ b/trade/buy_radical/block_special_codes_manager.py @@ -121,9 +121,9 @@ 鑾峰彇鏉垮潡鏈夎鲸璇嗗害鐨勪唬鐮� @return: """ - trading_dates = HistoryKDatasUtils.get_latest_trading_date(15) + trading_dates = HistoryKDatasUtils.get_latest_trading_date(8) max_day = trading_dates[-1] - min_day = tool.date_sub(max_day, 365) + min_day = tool.date_sub(max_day, 180) block_map = self.__get_block_map() # [(鏉垮潡鍚嶇О,浠g爜, 鍦ㄦ澘鍧椾腑鐨勬定鍋滄鏁�)] @@ -185,10 +185,15 @@ # 闈炴甯哥エ continue - if juejin_result_dict[code][2] < 3 or juejin_result_dict[code][2] > 40: - # 灏忎簬3鍧�/澶т簬40鍧� + if juejin_result_dict[code][2] < 3 or juejin_result_dict[code][2] > 50: + # 灏忎簬3鍧�/澶т簬50鍧� continue + + if int(float(limit_up_info_map[code][2])) < 50: + continue + index += 1 + # [(鏉垮潡, 浠g爜鍚嶇О, 浠g爜, 娑ㄥ仠娆℃暟, 鑷敱甯傚��)] fdatas.append( (b, limit_up_info_map[code][1], code, code_block_dict[code][b], int(float(limit_up_info_map[code][2])))) @@ -208,4 +213,4 @@ if __name__ == "__main__": # print(datas) - print( BlockSpecialCodesManager().get_code_blocks("002582")) + 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 6d85777..a07e982 100644 --- a/trade/buy_radical/radical_buy_data_manager.py +++ b/trade/buy_radical/radical_buy_data_manager.py @@ -4,6 +4,7 @@ import json import logging import time +import urllib import requests @@ -126,12 +127,13 @@ pre_limit_up_price_money_list = [] deal_order_list = BigOrderDealManager().get_total_buy_data_list(code) deal_order_ids = set() - for x in deal_order_list: - if opened_time and int(opened_time.replace(":", "")) > int( - l2_huaxin_util.convert_time(x[3]).replace(":", "")): - # 寮�鏉挎椂闂翠箣鍓� - continue - deal_order_ids.add(x[0]) + if deal_order_list: + for x in deal_order_list: + if opened_time and int(opened_time.replace(":", "")) > int( + l2_huaxin_util.convert_time(x[3]).replace(":", "")): + # 寮�鏉挎椂闂翠箣鍓� + continue + deal_order_ids.add(x[0]) for info in buy_money_list: if info[1] != limit_up_price: continue @@ -264,21 +266,30 @@ return False return True - def set_temp_deal_big_orders(self, code, money_list): + def set_temp_deal_big_orders(self, code, money_info_list): """ 璁剧疆涓存椂澶у崟 @param code: - @param money_list: 鎴愪氦鐨勫ぇ涔板崟 + @param money_info_list: 鎴愪氦鐨勫ぇ涔板崟:[(璁㈠崟鍙凤紝鎬昏偂鏁帮紝鎴愪氦閲戦,鎴愪氦寮�濮嬫椂闂�,鎴愪氦缁撴潫鏃堕棿, 鏈�杩戠殑鎴愪氦浠锋牸, 鏈�杩戠殑鍗栧崟鍙�, 娑ㄥ仠浠锋垚浜ら噾棰�)] @return: """ if code in self.__temp_big_order_threshold: return - if not money_list or len(money_list) < 2: + if not money_info_list or len(money_info_list) < 2: return + fmoney_list = [] + min_money = l2_data_util.get_big_money_val(gpcode_manager.get_limit_up_price_as_num(code), tool.is_ge_code(code)) + for info in money_info_list: + if info[7] >= min_money: + # 娑ㄥ仠浠锋垚浜ら儴鍒嗘槸澶у崟 + fmoney_list.append((info[7], info[0])) + if len(fmoney_list) < 2: + return + money_list = [x[0] for x in fmoney_list] # 璁$畻澶у崟: 鍓�2涓ぇ鍗曠殑鍧囧�� self.__temp_big_order_threshold[code] = int(sum(money_list[:2]) // 2) async_log_util.info(logger_l2_radical_buy_data, - f"棣栨涓婃澘涓存椂涔板ぇ鍗曪細{code}-{self.__temp_big_order_threshold[code]}-{money_list[:2]}") + f"棣栨涓婃澘涓存椂涔板ぇ鍗曪細{code}-{self.__temp_big_order_threshold[code]}-{fmoney_list[:2]}") def get_temp_deal_big_order_threshold(self, code): return self.__temp_big_order_threshold.get(code) @@ -522,7 +533,9 @@ @param code: @return: """ - + if 1 > 0: + # 澶у崟瓒冲鏆傛椂涓嶅仛澶勭悊 + return # 濡傛灉鍔犵豢浜嗗氨鐩存帴鎷夌櫧 if gpcode_manager.GreenListCodeManager().is_in_cache(code): if gpcode_manager.WhiteListCodeManager().is_in_cache(code): @@ -1641,7 +1654,9 @@ """ # 鍘熷洜涓嬮潰鐨勪唬鐮佷釜鏁� deal_reason_codes = {} - + # 鍔犳兂涓嶇鏉垮潡鏄惁鎴愪氦 + if gpcode_manager.WantBuyCodesManager().is_in_cache(code): + return radical_buy_blocks for dc in deal_codes: # 鑾峰彇娑ㄥ仠鍘熷洜 reasons = __get_deal_reasons(dc) @@ -1741,7 +1756,6 @@ logger_debug.exception(e) - def get_l2_big_order_deal_info(code_): """ 鑾峰彇鎴愪氦澶у崟淇℃伅 @@ -1758,6 +1772,21 @@ return None +def list_l2_big_order_deal_info(codes): + """ + 鑾峰彇鎴愪氦澶у崟淇℃伅 + @param code_: + @return:(鍑�娴佸叆閲戦, (澶у崟涔伴噾棰�, 澶у崟涔版暟閲�), (澶у崟鍗栭噾棰�, 澶у崟鍗栨暟閲�)) + """ + response_data = requests.get( + "http://127.0.0.1:9005/get_codes_money_info?codes=" + urllib.parse.quote(json.dumps(list(codes)))) + r_str = response_data.text + response_data = json.loads(r_str) + if response_data["code"] == 0: + datas = response_data["data"] + return datas + return None + def is_first_limit_up_buy(code): """ 鏄惁鏄灏佷笅鍗�: 锛堜笅鍗曟鏁颁负0+娌″湪娑ㄥ仠浠g爜涓級 鎴栬�� 锛堝浜庝笅鍗曠姸鎬� + 涓嬪崟娆℃暟涓�1锛屼笖涓嬪崟涓洪娆′笅鍗曪級 diff --git a/trade/buy_radical/radical_buy_strategy.py b/trade/buy_radical/radical_buy_strategy.py index a5d48de..7649883 100644 --- a/trade/buy_radical/radical_buy_strategy.py +++ b/trade/buy_radical/radical_buy_strategy.py @@ -127,9 +127,8 @@ # 鍒濇涓婃澘闇�瑕佽绠椾复鏃跺ぇ鍗� if radical_buy_data_manager.is_first_limit_up_buy(code): # 棣栧皝涓嬪崟 - money_list = BigOrderDealManager().get_total_buy_money_list(code) - radical_buy_data_manager.BeforeSubDealBigOrderManager().set_temp_deal_big_orders(code, money_list) - + money_info_list = BigOrderDealManager().get_total_buy_data_list(code) + radical_buy_data_manager.BeforeSubDealBigOrderManager().set_temp_deal_big_orders(code, money_info_list) price = transaction_datas[-1][1] huaxin_timestamp = transaction_datas[-1][3] -- Gitblit v1.8.0