From e6cbb6c96b6576da5eaf089cfa3dd6098cc6baf9 Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期二, 27 五月 2025 15:40:30 +0800 Subject: [PATCH] 人为修改大单阈值 --- trade/buy_radical/radical_buy_data_manager.py | 52 ++++++++++++++++ api/outside_api_command_callback.py | 21 +++++- data_parser/transaction_big_order_parser.py | 70 ++++++++++++++++++---- 3 files changed, 123 insertions(+), 20 deletions(-) diff --git a/api/outside_api_command_callback.py b/api/outside_api_command_callback.py index 27088d6..5eaa25a 100644 --- a/api/outside_api_command_callback.py +++ b/api/outside_api_command_callback.py @@ -54,7 +54,8 @@ from trade.huaxin import huaxin_trade_api, huaxin_trade_data_update, \ huaxin_trade_record_manager, huaxin_trade_order_processor, huaxin_sell_util from trade.huaxin.huaxin_trade_record_manager import PositionManager, DealRecordManager, DelegateRecordManager -from trade.buy_radical.radical_buy_data_manager import RadicalBuyBlockManager, BeforeSubDealBigOrderManager +from trade.buy_radical.radical_buy_data_manager import RadicalBuyBlockManager, BeforeSubDealBigOrderManager, \ + TotalDealBigOrderThresholdMoneyManager from trade.sell import sell_manager from trade.sell.sell_rule_manager import TradeRuleManager, SellRule from trade.trade_data_manager import RadicalBuyDealCodesManager @@ -1319,7 +1320,9 @@ if volumes_data: is_new_top = code_nature_analyse.is_new_top(code, gpcode_manager.get_limit_up_price_by_preprice(code, - volumes_data[0]["close"]), + volumes_data[ + 0][ + "close"]), volumes_data) data = { @@ -1476,8 +1479,18 @@ client_id, request_id) - - + elif ctype == "set_total_deal_big_order_threshold_money": + code = data.get("code") + money = data.get("money") + if not code or not money: + self.send_response({"code": 1, "data": {}, "msg": "code/money涓虹┖"}, + client_id, + request_id) + return + TotalDealBigOrderThresholdMoneyManager().set_money(code, int(money)) + self.send_response({"code": 0, "data": {}}, + client_id, + request_id) except Exception as e: logging.exception(e) logger_debug.exception(e) diff --git a/data_parser/transaction_big_order_parser.py b/data_parser/transaction_big_order_parser.py index e986684..42aa437 100644 --- a/data_parser/transaction_big_order_parser.py +++ b/data_parser/transaction_big_order_parser.py @@ -194,9 +194,60 @@ )) -def extract_big_order_of_code(dir_path, code): +def extract_big_order_of_code(dir_path, code=None): """ 鎻愬彇浠g爜鐨勫ぇ鍗� + @param dir_path: 鏁版嵁鐩綍 + @param code: 涓虹┖琛ㄧず瀵煎嚭鍏ㄩ儴 + @return: + """ + + def first_last(group): + """ + 鑾峰彇绗竴鏉℃暟鎹笌鏈�鍚庝竴鏉� + @param group: + @return: + """ + return pd.Series({ + 'SecurityID': group['SecurityID'].iloc[0], + 'BuyNo': group['BuyNo'].iloc[0], + 'TotalVolume': group['TotalVolume'].sum(), + 'TotalAmount': group['TotalAmount'].sum(), + 'EndTime': group['EndTime'].iloc[-1], + 'EndPrice': group['EndPrice'].iloc[-1], + 'StartTime': group['StartTime'].iloc[0], + 'StartPrice': group['StartPrice'].iloc[0] + }) + + combined_path = os.path.join(dir_path, 'combined.csv') + if not os.path.exists(combined_path): + print("鎷兼帴鏁版嵁涓嶅瓨鍦�") + return + df = pd.read_csv(combined_path) + df_copy = df.copy() + if code: + df_copy = df_copy[df_copy["SecurityID"] == int(code)] + if df_copy.empty: + print("鐩爣浠g爜瀵瑰簲鎴愪氦鏁版嵁涓虹┖") + return + df_copy["SecurityID"] = df_copy["SecurityID"].apply(BigOrderDealParser.code_format) + # 鎸塖ecurityID鍜孊uyNo鍒嗙粍 + grouped = df_copy.groupby(['SecurityID', 'BuyNo']) + grouped_result = grouped.apply(first_last) + grouped_result = grouped_result[grouped_result["TotalAmount"] > 500000] + # print(grouped_result) + # 閬嶅巻鍐呭 + if code: + grouped_result.to_csv(os.path.join(dir_path, f"big_buy_{code}.csv"), index=False) + else: + grouped_result.to_csv(os.path.join(dir_path, f"big_buy.csv"), index=False) + print("淇濆瓨鎴愬姛") + + +def extract_big_order_codes(dir_path): + """ + 瀵煎嚭澶у崟浠g爜 + @param dir_path: 鏁版嵁鐩綍 @param code: @return: """ @@ -208,12 +259,6 @@ @return: """ return pd.Series({ - 'TotalAmount': group['TotalAmount'].sum(), - 'TotalVolume': group['TotalVolume'].sum(), - 'StartTime': group['StartTime'].iloc[0], - 'StartPrice': group['StartPrice'].iloc[0], - 'EndTime': group['EndTime'].iloc[-1], - 'EndPrice': group['EndPrice'].iloc[-1] }) combined_path = os.path.join(dir_path, 'combined.csv') @@ -222,21 +267,18 @@ return df = pd.read_csv(combined_path) df_copy = df.copy() - df_copy = df_copy[df_copy["SecurityID"] == int(code)] if df_copy.empty: print("鐩爣浠g爜瀵瑰簲鎴愪氦鏁版嵁涓虹┖") return df_copy["SecurityID"] = df_copy["SecurityID"].apply(BigOrderDealParser.code_format) # 鎸塖ecurityID鍜孊uyNo鍒嗙粍 - grouped = df_copy.groupby(['SecurityID', 'BuyNo']) - grouped_result = grouped.apply(first_last) - grouped_result = grouped_result[grouped_result["TotalAmount"] > 500000] - grouped_result.to_csv(os.path.join(dir_path, f"{code}.csv")) - print("淇濆瓨鎴愬姛") + grouped = df_copy.groupby(['SecurityID']) + return set(grouped.groups.keys()) if __name__ == "__main__": # pre_process_transactions("E:/娴嬭瘯鏁版嵁/Transaction_Test.csv") # pre_process_ngtsticks("E:/娴嬭瘯鏁版嵁/NGTSTick_Test.csv") # concat_pre_transactions("E:/娴嬭瘯鏁版嵁/Transaction_Test") - extract_big_order_of_code("E:/娴嬭瘯鏁版嵁/Transaction_Test", "000017") + # extract_big_order_codes("E:/娴嬭瘯鏁版嵁/Transaction_Test") + extract_big_order_of_code("E:/娴嬭瘯鏁版嵁/Transaction_Test") diff --git a/trade/buy_radical/radical_buy_data_manager.py b/trade/buy_radical/radical_buy_data_manager.py index e8a73e0..aab4f22 100644 --- a/trade/buy_radical/radical_buy_data_manager.py +++ b/trade/buy_radical/radical_buy_data_manager.py @@ -314,6 +314,45 @@ @tool.singleton +class TotalDealBigOrderThresholdMoneyManager: + """ + 绱鎴愪氦澶у崟闃堝�肩鐞嗭紙浜轰负璁剧疆锛� + """ + __db = 3 + __total_big_order_threshold = {} + + def __init__(self): + self.__load_data() + + def __load_data(self): + keys = redis_manager.RedisUtils.keys(self.__get_redis(), "total_radical_big_order_threshold-*") + for k in keys: + code = k.split("-")[1] + val = redis_manager.RedisUtils.get(self.__get_redis(), k) + val = int(val) + self.__total_big_order_threshold[code] = val + + def set_money(self, code, money): + """ + 璁剧疆閲戦 + @param code: + @param money: + @return: + """ + self.__total_big_order_threshold[code] = money + redis_manager.RedisUtils.setex_async(self.__db, f"total_radical_big_order_threshold-{code}", tool.get_expire(), + money) + + def get_money_cache(self, code): + """ + 鑾峰彇缂撳瓨 + @param code: + @return: + """ + return self.__total_big_order_threshold.get(code) + + +@tool.singleton class RadicalCodeMarketInfoManager: """ 婵�杩涗拱鐨勭エ琛屾儏鏁版嵁绠$悊 @@ -617,7 +656,12 @@ code) if deal_money >= 2 * THRESHOLD_MONEY: gpcode_manager.WhiteListCodeManager().add_code(code) - trade_record_log_util.add_common_msg(code, "鍔犵櫧", f"{code}澶у崟鎴愪氦瓒冲鍔犵櫧锛� 鏈壒娆℃垚浜ら噾棰�-{deal_money}/{THRESHOLD_MONEY * 2} 绱澶у崟閲戦锛歿total_deal_big_order_result[1]}/{total_deal_big_order_result[2]}") + trade_record_log_util.add_common_msg(code, "鍔犵櫧", + f"{code}澶у崟鎴愪氦瓒冲鍔犵櫧锛� 鏈壒娆℃垚浜ら噾棰�-{deal_money}/{THRESHOLD_MONEY * 2} 绱澶у崟閲戦锛歿total_deal_big_order_result[1]}/{total_deal_big_order_result[2]}") + else: + async_log_util.info(logger_debug, + f"{code}-鎴愪氦澶у崟灏�({deal_money}/{2 * THRESHOLD_MONEY}锛屾渶灏忚鍗曞彿-{order_begin_pos.min_order_no})锛屼笉鑳藉姞鐧�") + except Exception as e: logger_debug.exception(e) async_log_util.info(logger_debug, f"澶勭悊鎴愪氦澶у崟瓒冲鍔犵櫧鐨勯棶棰�:{str(e)}") @@ -1729,7 +1773,11 @@ if tool.is_ge_code(code): TOTAL_BIG_DEAL_MONEY_THRESHOLD_COUNT *= 3.3 - TOTAL_BIG_DEAL_MONEY_THRESHOLD_MONEY = TOTAL_BIG_DEAL_MONEY_THRESHOLD_COUNT * THRESHOLD_MONEY + human_setting_money = TotalDealBigOrderThresholdMoneyManager().get_money_cache(code) + if human_setting_money is not None: + TOTAL_BIG_DEAL_MONEY_THRESHOLD_MONEY = int(human_setting_money) + else: + TOTAL_BIG_DEAL_MONEY_THRESHOLD_MONEY = TOTAL_BIG_DEAL_MONEY_THRESHOLD_COUNT * THRESHOLD_MONEY # if is_for_buy and is_temp_threshold_money: # # 棣栨涓婃澘涔板叆锛屽ぇ鍗曢槇鍊兼墦3鎶� -- Gitblit v1.8.0