From ad615df734b4d82f9a83a7d1805ac9fabdf01a53 Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期四, 21 八月 2025 18:27:39 +0800 Subject: [PATCH] 200元股价以下的不足4手算4手/撤单率设置为100%不计算L后后半段撤单 --- servers/data_server.py | 259 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 237 insertions(+), 22 deletions(-) diff --git a/servers/data_server.py b/servers/data_server.py index fcdc461..bbc7b06 100644 --- a/servers/data_server.py +++ b/servers/data_server.py @@ -10,9 +10,14 @@ import constant import inited_data -from code_attribute.gpcode_manager import BlackListCodeManager, HumanRemoveForbiddenManager +from api import low_suction_data_pusher +from code_attribute.code_l1_data_manager import L1DataManager +from code_attribute.gpcode_manager import BlackListCodeManager, HumanRemoveForbiddenManager, CodePrePriceManager, \ + HumanForbiddenManager +from l2.code_price_manager import CurrentPriceManager from l2.huaxin import huaxin_target_codes_manager from l2.l2_transaction_data_manager import HuaXinBuyOrderManager +from l2.l2_transaction_data_processor import HuaXinTransactionDatasProcessor from log_module.log import logger_system, logger_debug, logger_kpl_limit_up, logger_request_api, \ logger_kpl_market_strong, logger_kpl_new_blocks from third_data.custom_block_in_money_manager import CodeInMoneyManager @@ -25,11 +30,15 @@ from trade.buy_radical.new_block_processor import BeforeBlocksComputer from trade.buy_strategy import OpenLimitUpGoodBlocksBuyStrategy from trade.buy_radical.radical_buy_data_manager import RadicalBuyBlockManager, BeforeSubDealBigOrderManager -from utils import global_util, tool, data_export_util, init_data_util -from code_attribute import gpcode_manager, code_nature_analyse +from trade.huaxin import huaxin_trade_record_manager +from trade.order_statistic import DealAndDelegateWithBuyModeDataManager +from trade.trade_data_manager import RadicalBuyDealCodesManager +from utils import global_util, tool, data_export_util, init_data_util, huaxin_util +from code_attribute import gpcode_manager, code_nature_analyse, code_volumn_manager from log_module import log_analyse, log_export, async_log_util from l2 import code_price_manager, l2_data_util, transaction_progress -from cancel_strategy.s_l_h_cancel_strategy import HourCancelBigNumComputer, LCancelRateManager +from cancel_strategy.s_l_h_cancel_strategy import HourCancelBigNumComputer, LCancelRateManager, \ + CancelRateHumanSettingManager, LCancelBigNumComputer from output.limit_up_data_filter import IgnoreCodeManager from third_data import kpl_util, kpl_data_manager, kpl_api, block_info from third_data.code_plate_key_manager import RealTimeKplMarketData, KPLPlateForbiddenManager @@ -328,6 +337,7 @@ date = ps_dict.get('date') time_str = ps_dict.get('time') end_index = ps_dict.get('end_index') + fast = ps_dict.get('fast', 0) if end_index: end_index = int(end_index) total_datas = l2_data_util.local_today_datas.get(code) @@ -337,14 +347,30 @@ total_datas = None else: date = tool.get_now_date_str() - delegate_datas = data_export_util.get_l2_datas(code, total_datas, date=date, end_index=end_index) - transaction_datas = data_export_util.get_l2_transaction_datas(code, date=date) + delegate_datas = data_export_util.get_l2_datas(code, total_datas, date=date, end_index=end_index, + fast_mode=int(fast)) code_name = gpcode_manager.get_code_name(code) response_data = json.dumps({"code": 0, "data": {"code": code, "code_name": code_name, "data": {"delegates": delegate_datas, + "transactions": []}}}) + except Exception as e: + logger_debug.exception(e) + elif url.path == "/get_l2_datas_of_sell_orders": + try: + # 鑾峰彇L2鍗栧崟鏁版嵁 + ps_dict = dict([(k, v[0]) for k, v in parse_qs(url.query).items()]) + code = ps_dict['code'] + date = ps_dict.get('date') + if not date: + date = tool.get_now_date_str() + transaction_datas = data_export_util.get_l2_transaction_datas(code, date=date) + code_name = gpcode_manager.get_code_name(code) + response_data = json.dumps({"code": 0, "data": {"code": code, "code_name": code_name, + "data": {"delegates": [], "transactions": transaction_datas}}}) except Exception as e: logger_debug.exception(e) + elif url.path == "/get_trade_progress": # 鑾峰彇浜ゆ槗杩涘害 ps_dict = dict([(k, v[0]) for k, v in parse_qs(url.query).items()]) @@ -929,14 +955,16 @@ elif url.path == "/get_l2_subscript_codes": # 鑾峰彇L2璁㈤槄鐨勪唬鐮� ps_dict = dict([(k, v[0]) for k, v in parse_qs(url.query).items()]) - code = ps_dict.get('code') + single_code = ps_dict.get('code') fresults = [] try: - if code: - codes = [code] + if single_code: + codes = [single_code] else: codes = huaxin_target_codes_manager.HuaXinL2SubscriptCodesManager.get_subscript_codes() if codes: + current_rate_dict = CurrentPriceManager.get_current_rate_dict() + current_price_dict = CurrentPriceManager.get_current_price_dict() for code in codes: deal_big_order_detail_info = None try: @@ -948,10 +976,11 @@ th_sell = BeforeSubDealBigOrderManager().get_big_sell_order_threshold(code) except: th_sell = 0 + # (缂哄皯鐨勮祫閲�, 鍑�鎴愪氦閲戦, 瑕佹眰鐨勫ぇ鍗曢噾棰�, 璁$畻寰楀埌鐨勫ぇ鍗曢槇鍊奸噾棰�, 浜轰负璁剧疆鐨勫ぇ鍗�) deal_big_money_info = radical_buy_data_manager.get_total_deal_big_order_info( code, gpcode_manager.get_limit_up_price_as_num(code)) if deal_big_money_info[1] == 0 and len(codes) == 1: - + # 鎬绘垚浜ら噾棰濅负0 deal_big_money_info = list(deal_big_money_info) # 娌℃湁璁㈤槄L2浼氬嚭鐜版病鏈夊�肩殑鎯呭喌锛屽鏋滄定鍋滆繃灏辨媺鍙栦箣鍓嶇殑娑ㄥ仠涔�/鍗栧ぇ鍗� deal_big_orders_result = radical_buy_data_manager.request_deal_big_orders(code) @@ -969,25 +998,35 @@ th_buy = threshold_money buy_money = sum(limit_up_price_money_list) sell_money = sum([x[0] for x in sell_datas if x[1] == limit_up_price]) - # 娑ㄥ仠澶у崟鍑�涔板叆 + # 娑ㄥ仠涔板噣鎴愪氦閲戦鍑�涔伴 deal_big_money_info[1] = buy_money - sell_money + # 瑕佹眰鐨勫ぇ鍗曠疮璁¢噾棰� deal_big_money_info[ 2] = radical_buy_data_manager.compute_total_deal_big_order_threshold_money(code, limit_up_price, threshold_money) - logger_debug.info(f"{code}-绱澶у崟闃堝�硷細{deal_big_money_info[2]}") - logger_debug.info(f"{code}闈炶闃呭ぇ鍗曪紝 buy_money-{buy_money}, sell_money-{sell_money}") + # logger_debug.info(f"{code}-绱澶у崟闃堝�硷細{deal_big_money_info[2]}") + # logger_debug.info(f"{code}闈炶闃呭ぇ鍗曪紝 buy_money-{buy_money}, sell_money-{sell_money}") big_money_rate = radical_buy_data_manager.TotalDealBigOrderInfoManager.get_big_order_rate( code) if not big_money_rate: big_money_rate = 0 + + # 璁$畻娑ㄥ仠鎴愪氦澶у崟鍗犵疮璁″ぇ鍗曢槇鍊肩殑姣斾緥 + if deal_big_money_info: + big_deal_rate_of_threashold_total_money = round( + deal_big_money_info[1] / deal_big_money_info[3], 2) + else: + big_deal_rate_of_threashold_total_money = 0 + # 澶у崟鎴愪氦淇℃伅 deal_big_order_info = [ (output_util.money_desc(th_temp_buy_info[0] if th_temp_buy_info else 0), # 涓存椂涔板ぇ鍗曢槇鍊� output_util.money_desc(th_buy), # 涔板ぇ鍗曢槇鍊� output_util.money_desc(th_sell), # 鍗栧崟闃堝�� - big_money_rate * 100 # 澶у崟鎴愪氦姣� + big_money_rate * 100, # 澶у崟鎴愪氦姣�(鎴愪氦澶у崟鍗犳暣浣撴垚浜ら鐨勬瘮渚�) + big_deal_rate_of_threashold_total_money # 娑ㄥ仠鎴愪氦澶у崟鍗犵疮璁″ぇ鍗曢槇鍊肩殑姣斾緥 ), # 娑ㄥ仠澶у崟鍑�涔板叆 output_util.money_desc(deal_big_money_info[1]), @@ -995,19 +1034,25 @@ output_util.money_desc(deal_big_money_info[2]), # 鍘熺疮璁″ぇ鍗曢槇鍊硷紙闈炰汉涓鸿缃級 output_util.money_desc(deal_big_money_info[3]), - # 浜轰负璁剧疆鐨勫ぇ鍗� - output_util.money_desc(deal_big_money_info[4]) if deal_big_money_info[4] else '', + # 浜轰负璁剧疆鐨勫ぇ鍗�, 鍘熷璁$畻鍊� + (output_util.money_desc(deal_big_money_info[4]) if deal_big_money_info[4] else '', + output_util.money_desc(deal_big_money_info[5]) if deal_big_money_info[5] else '') ] - if len(codes) == 1: + if single_code: # 鍔犺浇澶у崟璇︽儏 deal_big_order_detail_info = radical_buy_data_manager.get_l2_big_order_deal_info(code) # 鍔犺浇娑ㄥ仠澶у崟璇︽儏 + # 涔板ぇ鍗�, 涓婃澘鍓嶄拱澶у崟, 鍗栧ぇ鍗�, 涓婃澘鍓嶅崠澶у崟 limit_up_big_order_detail = radical_buy_data_manager.get_total_detal_big_order_details( code) - deal_big_order_info.append( - output_util.money_desc(limit_up_big_order_detail[0] + limit_up_big_order_detail[1])) - deal_big_order_info.append( - output_util.money_desc(limit_up_big_order_detail[2] + limit_up_big_order_detail[3])) + # 绱娑ㄥ仠涔伴噾棰� + buy_money = output_util.money_desc( + limit_up_big_order_detail[0] + limit_up_big_order_detail[1]) + sell_money = output_util.money_desc( + limit_up_big_order_detail[2] + limit_up_big_order_detail[3]) + deal_big_order_info.append(buy_money) + # 绱娑ㄥ仠鍗栭噾棰� + deal_big_order_info.append(sell_money) deal_big_order_info.append( radical_buy_data_manager.TotalDealBigOrderInfoManager().get_big_order_rate(code)) @@ -1018,7 +1063,50 @@ logger_debug.exception(e) deal_big_order_info = None code_name = gpcode_manager.get_code_name(code) - fresults.append((code, code_name, deal_big_order_info, deal_big_order_detail_info)) + + # 0 - 涓嶅 1-鍗冲皢澶� 2-瓒冲 + big_order_enough_type = 0 + try: + total_deal_big_order_result = radical_buy_data_manager.get_total_deal_big_order_info(code, + gpcode_manager.get_limit_up_price_as_num( + code)) + # 鍙栬姹傚ぇ鍗曠殑10% + threshold_lack_money = int(round(total_deal_big_order_result[2] / 10)) + if total_deal_big_order_result: + if total_deal_big_order_result[0] <= 0: + big_order_enough_type = 2 + elif total_deal_big_order_result[0] <= threshold_lack_money: + big_order_enough_type = 1 + except: + pass + try: + is_limit_up = 1 if abs( + current_price_dict.get(code, 0) - gpcode_manager.get_limit_up_price_as_num( + code)) < 0.001 else 0 + except: + is_limit_up = 0 + pass + + # 鑾峰彇L鍚庝汉涓鸿缃殑鎾ゅ崟姣斾緥 + l_down_human_rate = None + if single_code: + # 鑾峰彇鎸傚崟 + try: + current_delegates = huaxin_trade_record_manager.DelegateRecordManager().list_current_delegates() + codes_set = set() + if current_delegates: + for c in current_delegates: + if int(c["direction"]) != huaxin_util.TORA_TSTP_D_Buy: + continue + codes_set.add(c["securityID"]) + if code not in codes_set: + # 娌℃湁鎸傚崟 + l_down_human_rate = CancelRateHumanSettingManager().get_l_down(code) + except: + pass + fresults.append( + (code, code_name, deal_big_order_info, deal_big_order_detail_info, big_order_enough_type, + current_rate_dict.get(code, 0), is_limit_up, l_down_human_rate)) response_data = json.dumps({"code": 0, "data": fresults}) except Exception as e: response_data = json.dumps({"code": 1, "data": str(1)}) @@ -1037,6 +1125,125 @@ for k in code_blocks_dict: fdata[k] = list(code_blocks_dict[k]) response_data = json.dumps({"code": 0, "data": fdata}) + elif url.path == "/get_want_buy_detail_list": + # 鑾峰彇鎯充拱鍗曡缁嗕俊鎭� + try: + history_limit_up_datas = LimitUpDataConstant.history_limit_up_datas + codes = set() + if history_limit_up_datas: + codes |= set([x[3] for x in history_limit_up_datas]) + want_codes = gpcode_manager.WantBuyCodesManager().list_code_cache() + if want_codes: + codes |= want_codes + # 鎷夊彇娑ㄥ仠鏃堕棿 + # 鎷夊彇鏈�杩戞垚浜や俊鎭� + fdatas = [] + yesterday_codes = kpl_data_manager.get_yesterday_limit_up_codes() + deal_codes = DealAndDelegateWithBuyModeDataManager().get_deal_codes() + for code in codes: + try: + if code in yesterday_codes: + continue + + if l2_trade_util.is_in_forbidden_trade_codes(code) and code not in deal_codes: + # 鎷夐粦浣嗘槸娌℃垚浜� + continue + + # 浜轰负鎷夐粦鐨勯渶瑕佺Щ闄� + if HumanForbiddenManager().is_in_cache(code): + continue + + if not tool.is_can_buy_code(code): + continue + # (浠g爜,鍚嶇О,娑ㄥ仠鏃堕棿,娑ㄥ箙,鐜版墜,鑷敱甯傚��,鐜颁环) + data = [code, gpcode_manager.get_code_name(code)] + limit_up_time = LimitUpDataConstant.get_first_limit_up_time(code) + limit_up_price = gpcode_manager.get_limit_up_price_as_num(code) + data.append(limit_up_time) + pre_close_price = CodePrePriceManager().get_price_pre_cache(code) + latest_transaction_data = HuaXinTransactionDatasProcessor.get_latest_transaction_data(code) + # 鑾峰彇L1鏁版嵁 + price = L1DataManager.get_l1_current_price(code) + if price: + data.append(round((price - pre_close_price) * 100 / pre_close_price, 2)) + else: + data.append("--") + zylt_volume = global_util.zylt_volume_map.get(code) + if limit_up_price and zylt_volume: + zyltgb = zylt_volume * limit_up_price + else: + zyltgb = None + if latest_transaction_data: + data.append( + (latest_transaction_data[2] // 100, + latest_transaction_data[6] - latest_transaction_data[7])) + else: + data.append(("--", 0)) + data.append(output_util.money_desc(zyltgb) if zyltgb else '--') + if price: + data.append(price) + else: + data.append("--") + # 鏄惁鏄兂涔板崟 + data.append(1 if code in want_codes else 0) + # 鏄剧ず浠g爜鏉垮潡韬綅 + block_rank_info = None + # 鑾峰彇褰撳墠鏉垮潡 + blocks = LimitUpCodesBlockRecordManager().get_radical_buy_blocks(code) + try: + if limit_up_time: + # 娑ㄥ仠杩囩殑鏁版嵁鎵嶆湁韬綅 + + if blocks: + blocks_info = [] + for b in blocks: + info = radical_buy_data_manager.RadicalBuyBlockManager.get_history_index(code, + b, + yesterday_codes) + blocks_info.append((b, info[0], info[2])) + max_info = max(blocks_info, key=lambda x: x[2]) + block_rank_info = max_info + except: + pass + # 鏉垮潡淇℃伅锛�(鏉垮潡韬綅, 鏈�鎬绘澘鍧�, 寮�鐩樺暒娑ㄥ仠鍘熷洜, 寮�鐩樺暒鎺ㄨ崘鍘熷洜) + history_limit_up_data = LimitUpDataConstant.get_history_limit_up_data(code) + data.append((block_rank_info, list(blocks) if blocks else [], + history_limit_up_data[2] if history_limit_up_data else '', + history_limit_up_data[6] if history_limit_up_data else '')) + + # 浜ゆ槗鐘舵�侊細 + trade_state = trade_manager.CodesTradeStateManager().get_trade_state(code) + data.append(trade_state) + # 鍙傝�冮噺淇℃伅 + refer_volume_info = code_volumn_manager.CodeVolumeManager().get_radical_buy_refer_volume_info( + code, limit_up_price) + if refer_volume_info: + data.append(refer_volume_info[1]) + else: + data.append("--") + # L鍚庢挙鍗曟瘮渚� + rate_info = LCancelRateManager.get_cancel_rate(code) + if rate_info: + data.append(rate_info[0]) + else: + data.append("--") + fdatas.append(data) + except Exception as e1: + logger_debug.exception(e1) + fdatas.sort(key=lambda x: x[2] if x[2] else time.time()) + response_data = json.dumps({"code": 0, "data": fdatas}) + except Exception as e: + logger_debug.exception(e) + elif url.path == "/get_l_down_watch_index_overview": + try: + ps_dict = dict([(k, v[0]) for k, v in parse_qs(url.query).items()]) + code = ps_dict.get('code') + # 澶у崟姒傝 + l2_down_data = LCancelBigNumComputer().statistic_l_down_watch_indexes_of_big_order_info(code) + # total_big_order_info = LCancelBigNumComputer().statistic_total_big_order_info(code) + response_data = json.dumps({"code": 0, "data": l2_down_data}) + except Exception as e: + logger_debug.exception(e) async_log_util.info(logger_request_api, f"缁撴潫璇锋眰{tool.get_thread_id()}-{url}") self.send_response(200) @@ -1201,6 +1408,13 @@ lambda: request_new_blocks_codes(update_new_block_plates, new_block_codes.keys())) except Exception as e: logger_debug.exception(e) + + # 灏嗘暟鎹帹閫佽嚦鍏朵粬椤圭洰 + try: + low_suction_data_pusher.push_limit_up_list(result_list_) + except: + pass + self.__kplDataManager.save_data(type_, result_list_) except Exception as e: logger_debug.exception(e) @@ -1324,3 +1538,4 @@ if __name__ == "__main__": run("", 9004) + print("娴嬭瘯123123123") -- Gitblit v1.8.0