From 6a0d3ff5832e57ee1b1374d086f24b3c1679b332 Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期五, 05 九月 2025 18:22:24 +0800 Subject: [PATCH] bug修复/降低测撤单率 --- servers/huaxin_trade_server.py | 511 +++++++++++++++++++++++++++++++++++-------------------- 1 files changed, 323 insertions(+), 188 deletions(-) diff --git a/servers/huaxin_trade_server.py b/servers/huaxin_trade_server.py index 373af9c..813ef72 100644 --- a/servers/huaxin_trade_server.py +++ b/servers/huaxin_trade_server.py @@ -14,17 +14,17 @@ import constant import outside_api_command_manager -from cancel_strategy.s_l_h_cancel_strategy import SCancelBigNumComputer +from cancel_strategy.s_l_h_cancel_strategy import SCancelBigNumComputer, DCancelBigNumComputer from code_attribute import gpcode_manager, code_volumn_manager, global_data_loader, zyltgb_util from code_attribute.code_l1_data_manager import L1DataManager from code_attribute.gpcode_manager import CodePrePriceManager, CodesNameManager, \ - WantBuyCodesManager -from huaxin_client import l2_data_transform_protocol + WantBuyCodesManager, CodesContinueBuyMoneyManager +from code_attribute.today_max_price_manager import MaxPriceInfoManager +from huaxin_client import l2_data_transform_protocol, l1_subscript_codes_manager 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, \ - l2_data_source_util, l2_data_log -from l2.cancel_buy_strategy import GCancelBigNumComputer, \ - DCancelBigNumComputer, RDCancelBigNumComputer + l2_data_source_util, l2_data_log, data_callback +from l2.cancel_buy_strategy import GCancelBigNumComputer from l2.code_price_manager import Buy1PriceManager from l2.huaxin import huaxin_target_codes_manager, l2_huaxin_util from l2.huaxin.huaxin_target_codes_manager import HuaXinL1TargetCodesManager @@ -37,14 +37,15 @@ from log_module import async_log_util, log_export from log_module.log import hx_logger_contact_debug, hx_logger_trade_callback, \ hx_logger_l2_orderdetail, hx_logger_l2_market_data, logger_l2_g_cancel, logger_debug, \ - logger_system, logger_trade, logger_l2_radical_buy -from third_data import block_info, kpl_data_manager, history_k_data_manager, huaxin_l1_data_manager, kpl_api, kpl_util -from third_data.code_plate_key_manager import KPLCodeJXBlockManager, CodePlateKeyBuyManager, RealTimeKplMarketData, \ + logger_system, logger_trade, logger_l2_radical_buy, logger_l2_trade +from third_data import block_info, kpl_data_manager, history_k_data_manager, huaxin_l1_data_manager, kpl_api, kpl_util, \ + third_blocks_manager +from third_data.code_plate_key_manager import KPLCodeJXBlockManager, RealTimeKplMarketData, \ KPLPlateForbiddenManager +from third_data.history_k_data_manager import HistoryKDataManager from third_data.history_k_data_util import JueJinApi, HistoryKDatasUtils -from third_data.kpl_limit_up_data_manager import LatestLimitUpBlockManager from trade import l2_trade_util, \ - trade_data_manager, trade_constant, buy_open_limit_up_strategy + trade_data_manager, trade_constant, buy_open_limit_up_strategy, auto_add_want_buy_strategy from trade.buy_radical import radical_buy_data_manager, radical_buy_strategy from trade.buy_money_count_setting import BuyMoneyAndCountSetting, BuyMoneyUtil @@ -53,8 +54,9 @@ from api.outside_api_command_callback import OutsideApiCommandCallback from trade.huaxin.huaxin_trade_record_manager import DelegateRecordManager from trade.order_statistic import DealAndDelegateWithBuyModeDataManager -from trade.buy_radical.radical_buy_data_manager import RadicalBuyDataManager, RadicalBuyBlockManager, \ - EveryLimitupBigDealOrderManager, RadicalCodeMarketInfoManager, BeforeSubDealBigOrderManager +from trade.buy_radical.radical_buy_data_manager import RadicalBuyDataManager, \ + EveryLimitupBigDealOrderManager, RadicalCodeMarketInfoManager, BeforeSubDealBigOrderManager, \ + EveryLimitupBigDelegateOrderManager from trade.sell.sell_rule_manager import TradeRuleManager from trade.trade_data_manager import RadicalBuyDealCodesManager from trade.trade_manager import CodesTradeStateManager @@ -78,6 +80,8 @@ __TradeBuyQueue = transaction_progress.TradeBuyQueue() __KPLCodeJXBlockManager = KPLCodeJXBlockManager() __GCancelBigNumComputer = GCancelBigNumComputer() + # L2杩涚▼瀵瑰簲璁㈤槄鐨勪唬鐮侊細 {"杩涚▼ID": 浠g爜鍒楄〃} + __pid_l2_subscript_codes = {} def setup(self): self.__init() @@ -231,7 +235,7 @@ code, gpcode_manager.get_limit_up_price_as_num(code)) deal_big_order_info = ( output_util.money_desc(th), output_util.money_desc(deal_big_money_info[1]), - output_util.money_desc(deal_big_money_info[2])) + output_util.money_desc(deal_big_money_info[2]), deal_big_money_info[0] <= 0) except: deal_big_order_info = None code_name = gpcode_manager.get_code_name(code) @@ -241,6 +245,44 @@ middle_api_protocol.request(fdata) finally: sk.sendall(socket_util.load_header(json.dumps({"code": 0}).encode(encoding='utf-8'))) + elif data_json["type"] == "l2_subscript_codes_v2": + try: + data = data_json["data"] + datas = data["data"] + pid, datas = datas[0], datas[1] + self.__pid_l2_subscript_codes[pid] = datas + # print("l2_subscript_codes", data_json) + fcodes = [] + for pid in self.__pid_l2_subscript_codes: + codes = self.__pid_l2_subscript_codes[pid] + fcodes.extend(codes) + # 璁㈤槄鐨勪唬鐮� + huaxin_target_codes_manager.HuaXinL2SubscriptCodesManager.save_subscript_codes(fcodes) + # 涓婁紶鏁版嵁 + codes = huaxin_target_codes_manager.HuaXinL2SubscriptCodesManager.get_subscript_codes() + l2_log.codeLogQueueDistributeManager.set_l2_subscript_codes(codes) + + fresults = [] + if codes: + for code in codes: + try: + # 鑾峰彇鎴愪氦澶у崟锛�(鍙傝�冨ぇ鍗曢噾棰�,宸叉垚浜ゅぇ鍗曢噾棰�,澶у崟瑕佹眰閲戦) + th, is_temp = BeforeSubDealBigOrderManager().get_big_order_threshold_info(code) + deal_big_money_info = radical_buy_data_manager.get_total_deal_big_order_info( + code, gpcode_manager.get_limit_up_price_as_num(code)) + deal_big_order_info = ( + output_util.money_desc(th), output_util.money_desc(deal_big_money_info[1]), + output_util.money_desc(deal_big_money_info[2]), deal_big_money_info[0] <= 0) + except: + deal_big_order_info = None + code_name = gpcode_manager.get_code_name(code) + fresults.append((code, code_name, deal_big_order_info)) + + fdata = middle_api_protocol.load_l2_subscript_codes(fresults) + middle_api_protocol.request(fdata) + finally: + sk.sendall(socket_util.load_header(json.dumps({"code": 0}).encode(encoding='utf-8'))) + elif data_json["type"] == "get_level1_codes": # print("get_level1_codes") # 鑾峰彇level1鐨勪唬鐮� @@ -256,7 +298,7 @@ # if d["pre_close"] * tool.get_limit_up_rate(d["sec_id"]) > constant.MAX_SUBSCRIPT_CODE_PRICE: # continue if (d["listed_date"] + datetime.timedelta( - days=100)).timestamp() > datetime.datetime.now().timestamp(): + days=20)).timestamp() > datetime.datetime.now().timestamp(): continue fdatas.append(d["sec_id"]) code_name_map[d["sec_id"]] = d["sec_name"] @@ -322,13 +364,16 @@ def __process_buy_open_limit_up_datas(cls, datas): """ 澶勭悊鎺�1鐨勬暟鎹� - @param datas: [(浠g爜, 鐜颁环, 娑ㄥ箙, 閲�, 褰撳墠鏃堕棿, 涔�1浠�, 涔�1閲�, 涔�2浠�, 涔�2閲�, 鏇存柊鏃堕棿)] + @param datas: [(浠g爜, 鐜颁环, 娑ㄥ箙, 閲�, 褰撳墠鏃堕棿, 涔�1浠�, 涔�1閲�, 涔�2浠�, 涔�2閲�, 鏇存柊鏃堕棿, 鏄ㄦ棩鏀剁洏浠�(闆嗗悎绔炰环鎵嶆湁))] @return: """ # 9:25涔嬪悗涓嶅啀澶勭悊 if tool.get_now_time_as_int() > int("092500"): return for d in datas: + # 璁$畻褰撳墠鏄惁鏄定鍋滅姸鎬� + if len(d) == 11: + async_log_util.info(logger_debug, f"寮�1鏁版嵁锛歿d}") if gpcode_manager.BuyOpenLimitUpCodeManager().is_in_cache(d[0]): # 09:19:50 鍒� 09:20:00鍒ゆ柇鏄惁瑕佹挙鍗� if int("091950") <= int(d[9].replace(":", "")) < int("092000"): @@ -354,6 +399,20 @@ datas = data["data"] cls.__save_l1_current_price(datas) cls.__process_buy_open_limit_up_datas(datas) + + try: + # 璁板綍浠婃棩鏈�楂樹环 + # 09:25涔嬪悗鎵嶅紑濮嬭褰� + if datas and tool.get_now_time_str() > '09:25:00': + for d in datas: + MaxPriceInfoManager().set_price_info(d[0], price=d[1], time_str=d[9], sell1_info=(d[10], d[11])) + except Exception as e: + logger_debug.exception(e) + + # 鏍规嵁楂樻爣鐨勫疄鏃舵定骞呰绠楁媺榛戞澘鍧� + rate_dict = {d[0]: d[2] for d in datas} + cls.__process_l1_data_thread_pool.submit( + lambda: KPLPlateForbiddenManager().compute(rate_dict)) # 9:30涔嬪墠閲囩敤闈炵嚎绋� if int(tool.get_now_time_str().replace(":", "")) < int("093000") or True: HuaXinL1TargetCodesManager.set_level_1_codes_datas(datas, request_id=request_id) @@ -372,8 +431,8 @@ thread_id = random.randint(0, 100000) l2_log.threadIds[code] = thread_id l2_data_count = len(_datas) - l2_log.info(code, hx_logger_l2_orderdetail, - f"{code}#鑰楁椂锛歿use_time}-{thread_id}#鏁伴噺锛歿l2_data_count}#{_datas[-1]}") + # l2_log.info(code, hx_logger_l2_orderdetail, + # f"{code}#鑰楁椂锛歿use_time}-{thread_id}#鏁伴噺锛歿l2_data_count}#{_datas[-1]}") # l2_data_log.l2_time_log(code, "寮�濮嬪鐞哃2閫愮瑪濮旀墭") try: @@ -406,18 +465,20 @@ # -----------------------鍒ゆ柇鏄槸鍚︽湁鑷姩鎾ゅ崟瑙勫垯----------------------- try: - if DCancelBigNumComputer().has_auto_cancel_rules(code): - need_cancel, rule_id = DCancelBigNumComputer().need_cancel(code, buy_1_volume) + if True: + need_cancel, msg = DCancelBigNumComputer().need_cancel(code, (buy_1_price, buy_1_volume), + limit_up_price, time_str) if need_cancel: try: - l2_data_manager_new.L2TradeDataProcessor.cancel_buy(code, f"鐩皝鍗曟挙:{time_str}-{buy_1_volume}", + l2_data_manager_new.L2TradeDataProcessor.cancel_buy(code, + f"鐩皝鍗曟挙:{time_str}-{buy_1_volume} , {msg}", cancel_type=trade_constant.CANCEL_TYPE_D) finally: - TradeRuleManager().excuted(rule_id) + pass except Exception as e: logger_debug.exception(e) - pre_close_price = CodePrePriceManager.get_price_pre_cache(code) + pre_close_price = CodePrePriceManager().get_price_pre_cache(code) if pre_close_price is not None: average_rate = None try: @@ -431,7 +492,9 @@ sell_1_price, sell_1_volume // 100, average_rate) latest_3m_buy1_money_list = code_price_manager.Buy1PriceManager().get_latest_3m_buy1_money_list(code) # 鎷夊彇鎬诲ぇ鍗曟垚浜� - threading.Thread(target=lambda: radical_buy_data_manager.TotalDealBigOrderInfoManager.update_big_order_info(code, data["totalValueTrade"]), daemon=True).start() + threading.Thread( + target=lambda: radical_buy_data_manager.TotalDealBigOrderInfoManager.update_big_order_info(code, data[ + "totalValueTrade"]), daemon=True).start() async_log_util.info(hx_logger_l2_market_data, f"{code}#{data}") @@ -464,10 +527,10 @@ # 鍗冲皢鐐稿紑 total_deal_big_order_info = radical_buy_data_manager.get_total_deal_big_order_info(code, limit_up_price) if total_deal_big_order_info and total_deal_big_order_info[0] <= 0: - EveryLimitupBigDealOrderManager.clear(code) + EveryLimitupBigDealOrderManager.clear(code, f"鏉夸笂鏀鹃噺锛歿time_str}") # 澶у崟瓒冲 - l2_trade_single_callback.process_limit_up_active_buy(code, [], is_almost_open_limit_up=True, - l2_market_time_str=time_str) + # l2_trade_single_callback.process_limit_up_active_buy(code, [], is_almost_open_limit_up=True, + # l2_market_time_str=time_str) @classmethod def trading_order_canceled(cls, code, order_no): @@ -580,6 +643,8 @@ huaxin_trade_record_manager.DelegateRecordManager.add([data]) if huaxin_util.is_deal(order_status): if int(str(data["direction"])) == huaxin_util.TORA_TSTP_D_Buy: + # 璁㈠崟鎴愪氦鍥炶皟锛岀Щ闄ょ画涔伴噾棰�+鎷夐粦 + CodesContinueBuyMoneyManager().remove_continue_buy_money(data["securityID"]) l2_trade_util.forbidden_trade(data["securityID"], msg="宸叉垚浜�", force=True) if TradePointManager.get_latest_place_order_mode( data["securityID"]) == OrderBeginPosInfo.MODE_RADICAL: @@ -601,98 +666,33 @@ __radical_buy_by_blocks_result_cache = {} def OnTradeSingle(self, code, big_buy_order_count, _type, data): - # 鍙鐞嗘繁璇佺殑绁� - try: - # 鍒ゆ柇鏄惁涓嬪崟 - state = CodesTradeStateManager().get_trade_state_cache(code) - if state == trade_constant.TRADE_STATE_BUY_DELEGATED or state == trade_constant.TRADE_STATE_BUY_PLACE_ORDER or state == trade_constant.TRADE_STATE_BUY_SUCCESS: - # 宸茬粡涓嬪崟浜� - return + """ + 鏈�杩戞定鍋滃崠琚悆鎺� + @param code: + @param big_buy_order_count: + @param _type: + @param data: + @return: + """ + l2_log.debug(code, "鏈�杩戞定鍋滃崠琚悆鎺墈}, {}", code, f"{data}") + # 鏆傛椂涓嶅鐞� + refer_sell_data = L2MarketSellManager().get_current_total_sell_data(code) + # 鍙傝�冩�诲崠棰� + refer_sell_money = 0 + if refer_sell_data: + refer_sell_money = refer_sell_data[1] + if refer_sell_money < 1000e4: + l2_log.debug(code, "鏈�杩戞定鍋滃崠琚悆,鎬绘姏鍘嬪皬浜�1000w") + return - l2_log.debug(code, "鎴愪氦瑙﹀彂涔板叆璁$畻 瑙﹀彂妯″紡锛歿} 澶у崟鏁伴噺:{}", _type, big_buy_order_count) - - total_datas = l2_data_util.local_today_datas.get(code) - - mode_descs = [] - # if big_buy_order_count > 0: - # mode_descs.append("300w") - if l2_data_manager_new.L2TradeDataProcessor.get_active_buy_blocks(code): - mode_descs.append("韬綅") - - current_total_sell_data = L2MarketSellManager().get_current_total_sell_data(code) - sell_info = None - if current_total_sell_data: - sell_info = (current_total_sell_data[0], current_total_sell_data[1]) - - if _type == L2TradeSingleDataManager.TYPE_PASSIVE and mode_descs: - # 鍙互婵�杩涗笅鍗曚笖蹇呴』鏄娆′笅鍗曟墠鑳芥縺杩� - place_order_count = trade_data_manager.PlaceOrderCountManager().get_place_order_count(code) - if tool.is_sz_code(code) and place_order_count == 0 and current_total_sell_data[ - 1] > 500 * 10000 and global_util.zyltgb_map.get( - code) < 50 * 100000000: - # 棣栨涓嬪崟锛岃嚜鐢辨祦閫�50浜夸互涓嬶紝鎬诲崠棰�500w鎵嶈兘婵�杩涗笅鍗� - mode_descs.insert(0, "鎴愪氦瑙﹀彂") - last_index = total_datas[-1]["index"] - volume_rate = code_volumn_manager.CodeVolumeManager().get_volume_rate(code) - order_begin_pos = OrderBeginPosInfo(buy_single_index=last_index, - buy_exec_index=last_index, - buy_compute_index=last_index, - num=0, count=1, - max_num_set=set(), - buy_volume_rate=volume_rate, - mode=OrderBeginPosInfo.MODE_ACTIVE, - mode_desc=",".join(mode_descs), - sell_info=sell_info, - threshold_money=0) - l2_data_manager_new.L2TradeDataProcessor.save_order_begin_data(code, order_begin_pos) - l2_log.debug(code, "绉瀬涓嬪崟锛岃幏鍙栧埌涔板叆鎵ц浣嶇疆锛歿} 鎴愪氦鏁版嵁瑙﹀彂妯″紡锛歿} 澶у崟鏁伴噺锛歿}", - order_begin_pos.buy_exec_index, - _type, big_buy_order_count) - l2_data_manager_new.L2TradeDataProcessor.start_buy(code, total_datas[-1], total_datas[-1]["index"], - True, None) - else: - l2_log.debug(code, "绉瀬涓嬪崟锛屼笉婊¤冻鎵叆涓嬪崟鏉′欢锛屾棤娉曟壂鍏�") - else: - if not tool.is_sz_code(code): - return - # 鎵惧埌鏈�杩戠殑澶т拱鍗� - for i in range(len(total_datas) - 1, -1, -1): - d = total_datas[i] - val = d['val'] - if not L2DataUtil.is_limit_up_price_buy(val): - continue - if val['num'] * float(val['price']) < 5000: - continue - if val['orderNo'] < data[0][6]: - continue - result = L2TradeSingleDataManager.is_can_place_order(code, d) - if result and result[0]: - volume_rate = code_volumn_manager.CodeVolumeManager().get_volume_rate(code) - order_begin_pos = OrderBeginPosInfo(buy_single_index=i, - buy_exec_index=i, - buy_compute_index=i, - num=0, count=1, - max_num_set=set(), - buy_volume_rate=volume_rate, - mode=OrderBeginPosInfo.MODE_FAST, - mode_desc="鎴愪氦瑙﹀彂", - sell_info=sell_info, - threshold_money=0) - l2_data_manager_new.L2TradeDataProcessor.save_order_begin_data(code, order_begin_pos) - l2_log.debug(code, "闈炴縺杩涗笅鍗曪紝鑾峰彇鍒颁拱鍏ユ墽琛屼綅缃細{} 鎴愪氦鏁版嵁瑙﹀彂妯″紡锛歿}", - order_begin_pos.buy_exec_index, - _type) - l2_data_manager_new.L2TradeDataProcessor.start_buy(code, total_datas[-1], - total_datas[-1]["index"], - True, None) - break - except Exception as e: - logger_debug.exception(e) + self.process_limit_up_active_buy(code, [data[0]], is_last_sell_deal=True) def process_limit_up_active_buy(self, code, transaction_datas, is_almost_open_limit_up=False, - l2_market_time_str=''): + l2_market_time_str='', no_left_limit_up_sell=False, is_last_sell_deal=False): """ 澶勭悊娑ㄥ仠涓诲姩涔� + @param is_last_sell_deal: 鏄惁鏈�杩戜竴绗旀定鍋滃崠琚悆 + @param no_left_limit_up_sell: 鏄惁杩樻湁鍓╀綑娑ㄥ仠鍗栧皻鏈垚浜� @param code: @param transaction_datas: @param is_almost_open_limit_up: 鏄惁鍗冲皢鐐告澘 @@ -707,55 +707,32 @@ # 涓嶅浜庡彲涓嬪崟鐘舵�� return True if transaction_datas: - async_log_util.info(logger_l2_radical_buy, f"娑ㄥ仠涓诲姩涔帮細{code}-{transaction_datas[-1]}") + l2_log.info(code, logger_l2_radical_buy, f"娑ㄥ仠涓诲姩涔帮細{code}-{transaction_datas[-1]}") else: - async_log_util.info(logger_l2_radical_buy, - f"鍗冲皢鐐告澘锛歿code}-{is_almost_open_limit_up}-{l2_market_time_str}") + l2_log.info(code, logger_l2_radical_buy, f"鍗冲皢鐐告澘锛歿code}-{is_almost_open_limit_up}-{l2_market_time_str}") deal_codes = RadicalBuyDealCodesManager().get_deal_codes() # 鍒ゆ柇浠婃棩鎵叆鐨勪唬鐮佹暟閲忔槸鍚﹀ぇ浜庨槇鍊� - radical_buy_setting = BuyMoneyAndCountSetting().get_radical_buy_setting() - MAX_COUNT = 4 if radical_buy_setting is None else radical_buy_setting[0] - if not WantBuyCodesManager().is_in_cache(code): - # 鍔犵豢涓嶅垽鏂澘鍧楁槸鍚︽垚浜� - if len(deal_codes) >= MAX_COUNT: - async_log_util.info(logger_l2_radical_buy, f"鎵叆鎴愪氦浠g爜涓暟澶т簬{MAX_COUNT}涓細{code}-{deal_codes}") - return True - if code in deal_codes: - async_log_util.info(logger_l2_radical_buy, f"璇ヤ唬鐮佸凡缁忔垚浜わ細{code}") + # radical_buy_setting = BuyMoneyAndCountSetting().get_radical_buy_setting() + # MAX_COUNT = 4 if radical_buy_setting is None else radical_buy_setting[0] + # if not WantBuyCodesManager().is_in_cache(code): + # # 鍔犵豢涓嶅垽鏂澘鍧楁槸鍚︽垚浜� + # if len(deal_codes) >= MAX_COUNT: + # l2_log.info(code, logger_l2_radical_buy, f"鎵叆鎴愪氦浠g爜涓暟澶т簬{MAX_COUNT}涓細{code}-{deal_codes}") + # return True + if code in deal_codes and not CodesContinueBuyMoneyManager().get_continue_buy_money(code): + l2_log.info(code, logger_l2_radical_buy, f"璇ヤ唬鐮佸凡缁忔垚浜わ細{code}") return True # 鍗曠エ鏄惁鍙拱 can_buy_result = RadicalBuyDataManager.is_code_can_buy(code) if can_buy_result[0]: # 鑾峰彇婵�杩涗拱鐨勬澘鍧� - result_cache = self.__radical_buy_by_blocks_result_cache.get(code) - if not result_cache or result_cache[0] < time.time(): - # 涓嶅瓨鍦�/杩囨湡 - yesterday_codes = kpl_data_manager.get_yesterday_limit_up_codes() - if yesterday_codes is None: - yesterday_codes = set() - # 璁$畻鏄惁鍙互鎵叆 - radical_result = RadicalBuyBlockManager.is_radical_buy(code, yesterday_codes) - async_log_util.info(logger_l2_radical_buy, f"璁$畻鏉垮潡缁撴灉锛歿code}-{radical_result}") - result_cache = (time.time() + 3, radical_result) - self.__radical_buy_by_blocks_result_cache[code] = result_cache - RadicalBuyDealCodesManager().set_code_blocks(code, radical_result[0]) - # 鍙栫紦瀛� - result = result_cache[1] - if result[0]: + f_buy_blocks, orgin_buy_blocks = radical_buy_strategy.compute_can_radical_buy_blocks(code, deal_codes) + if orgin_buy_blocks: + if not f_buy_blocks: + return True # 涔板叆鐨勬澘鍧� - buy_blocks = result[0] - # 濡傛灉鍏抽敭璇嶅寘鍚凡鎴愪氦鐨勫師鍥犲氨涓嶅啀涓嬪崟 - # 鑾峰彇宸茬粡鎴愪氦浠g爜鐨勬澘鍧� - try: - # ---------------鍒ゆ柇鏉垮潡鏄惁杩樺彲浠ヤ拱鍏�---------------- - f_buy_blocks = radical_buy_data_manager.is_block_can_radical_buy(code, buy_blocks, deal_codes) - if not f_buy_blocks: - return True - buy_blocks = f_buy_blocks - except Exception as e: - logger_debug.exception(e) - + buy_blocks = f_buy_blocks # 鍒ゆ柇褰撳墠鏃堕棿娈垫槸鍚﹀彲浠ヤ拱鍏� mode = OrderBeginPosInfo.MODE_RADICAL can_buy, money, msg = BuyMoneyUtil.get_buy_data(tool.get_now_time_str(), mode, @@ -764,13 +741,26 @@ DealAndDelegateWithBuyModeDataManager().get_delegates_codes_info( mode)) if not can_buy: - async_log_util.info(logger_l2_radical_buy, f"褰撳墠鏃堕棿娈靛凡涓嶈兘鎵叆锛歿code}-{msg}") + l2_log.info(code, logger_l2_radical_buy, f"褰撳墠鏃堕棿娈靛凡涓嶈兘鎵叆锛歿code}-{msg}") return True # -----鏍规嵁鎴愪氦姣斾緥鍒ゆ柇鏄惁鍙拱------ - result_by_volume = radical_buy_strategy.process_limit_up_active_buy_deal(code, transaction_datas, - is_almost_open_limit_up) - async_log_util.info(logger_l2_radical_buy, f"閲忎拱鍏ョ粨鏋滃垽鏂細{code}, 缁撴灉锛歿result_by_volume} 鏉垮潡锛歿buy_blocks}") + if not is_last_sell_deal: + result_by_volume = radical_buy_strategy.process_limit_up_active_buy_deal(code, + transaction_datas, + is_almost_open_limit_up, + no_left_limit_up_sell=no_left_limit_up_sell) + else: + result_by_volume = radical_buy_strategy.BUY_MODE_BY_L2, f"鏈�鍚庝竴绗旀定鍋滃崠鎴愪氦" + # 鍒ゆ柇鎬诲崠鏄惁澶т簬0 + huaxin_timestamp = transaction_datas[-1][3] + # 鑾峰彇鍙傝�冩�诲崠棰� + refer_sell_data = L2MarketSellManager().get_refer_sell_data(code, l2_huaxin_util.convert_time( + huaxin_timestamp)) + if not refer_sell_data or refer_sell_data[1] <= 0: + result_by_volume = radical_buy_strategy.BUY_MODE_NONE, f"鎬诲崠棰濅负0" + l2_log.info(code, logger_l2_radical_buy, + f"閲忎拱鍏ョ粨鏋滃垽鏂細{code}, 缁撴灉锛歿result_by_volume} 鏉垮潡锛歿buy_blocks} 鍙傝�冩�诲崠-{refer_sell_data}") in_blocks = RealTimeKplMarketData.get_top_market_jingxuan_blocks() buy_blocks_with_money = [(b, RealTimeKplMarketData.get_jx_block_in_money(b), in_blocks.index(b) if b in in_blocks else -1) for b in buy_blocks] @@ -785,8 +775,7 @@ # 鍒ゆ柇鏄惁寮�寰楀お楂� open_price = L1DataManager.get_open_price(code) if not radical_buy_strategy.is_can_buy_with_open_price(code, open_price): - async_log_util.info(logger_l2_radical_buy, - f"寮�寰楀お楂橈細{code}") + l2_log.info(code, logger_l2_radical_buy, f"寮�寰楀お楂橈細{code}") radical_buy_data_manager.ExcludeIndexComputeCodesManager.add_code(code) return True # if not RadicalCodeMarketInfoManager().is_opened_limit_up(code): @@ -798,7 +787,7 @@ radical_buy_data_manager.ExcludeIndexComputeCodesManager.remove_code(code) - if result_by_volume[0] == radical_buy_strategy.BUY_MODE_DIRECT and not tool.is_sh_code(code): + if result_by_volume[0] == radical_buy_strategy.BUY_MODE_DIRECT: # 涓婅瘉涓嶈兘鏍规嵁鎴愪氦涔板叆 latest_deal_time = l2_huaxin_util.convert_time(transaction_datas[-1][3]) refer_sell_data = L2MarketSellManager().get_refer_sell_data(code, latest_deal_time) @@ -809,6 +798,13 @@ if refer_sell_data: sell_info = (refer_sell_data[0], refer_sell_data[1]) threshold_money = 0 + every_deal_orders = EveryLimitupBigDealOrderManager.list_big_buy_deal_orders(code) + if every_deal_orders: + min_order_no_info = min(every_deal_orders, key=lambda x: x[0]) + min_order_no = min_order_no_info[0] + else: + min_order_no = transaction_datas[-1][6] + order_begin_pos_info = OrderBeginPosInfo(buy_single_index=buy_single_index, buy_exec_index=buy_exec_index, buy_compute_index=buy_exec_index, @@ -816,9 +812,11 @@ max_num_set=set(), buy_volume_rate=buy_volume_rate, mode=OrderBeginPosInfo.MODE_RADICAL, - mode_desc=f"鎵叆涔板叆锛歿buy_blocks}", + mode_desc=f"鎵叆涔板叆锛歿buy_blocks}, 澶у崟鎴愪氦鏈�灏忚鍗曞彿锛歿min_order_no}", sell_info=sell_info, - threshold_money=threshold_money) + threshold_money=threshold_money, + min_order_no=min_order_no + ) L2TradeDataProcessor.save_order_begin_data(code, order_begin_pos_info) buy_result = L2TradeDataProcessor.start_buy(code, total_datas[-1], total_datas[-1]["index"], True, block_info=buy_blocks_with_money) @@ -826,9 +824,9 @@ # 涓嬪崟鎴愬姛 radical_buy_data_manager.BlockPlaceOrderRecordManager().add_record(code, buy_blocks) radical_buy_strategy.clear_data(code, force=True) - RDCancelBigNumComputer().clear_data(code) + # RDCancelBigNumComputer().clear_data(code) # 澶у崟鎴愪氦瓒冲 - RadicalBuyDataManager().big_order_deal_enough(code) + # RadicalBuyDataManager().big_order_deal_enough(code) return True else: if transaction_datas: @@ -845,37 +843,142 @@ latest_deal_time = l2_market_time_str RadicalBuyDealCodesManager.buy_by_l2_delegate_expire_time_dict[code] = ( time.time() + 60, latest_buy_no, buy_blocks, - latest_deal_time, buy_blocks_with_money) + latest_deal_time, buy_blocks_with_money, is_almost_open_limit_up) return False else: - async_log_util.info(logger_l2_radical_buy, f"涓嶈兘涓嬪崟锛歿code}-{result_by_volume}") + l2_log.info(code, logger_l2_radical_buy, f"涓嶈兘涓嬪崟锛歿code}-{result_by_volume}") return False else: volume_rate = code_volumn_manager.CodeVolumeManager().get_volume_rate(code) - async_log_util.info(logger_l2_radical_buy, f"娌℃湁鍙壂鍏ョ殑鏉垮潡锛歿code},閲忔瘮锛歿volume_rate}") + l2_log.info(code, logger_l2_radical_buy, f"娌℃湁鍙壂鍏ョ殑鏉垮潡锛歿code},閲忔瘮锛歿volume_rate}") return True else: - async_log_util.info(logger_l2_radical_buy, f"鐩墠浠g爜涓嶅彲浜ゆ槗锛歿code}-{can_buy_result[1]}") + l2_log.info(code, logger_l2_radical_buy, f"鐩墠浠g爜涓嶅彲浜ゆ槗锛歿code}-{can_buy_result[1]}") return True except Exception as e: - async_log_util.info(logger_debug, f"婵�杩涗拱璁$畻寮傚父锛歿str(e)}") + l2_log.info(code, logger_debug, f"婵�杩涗拱璁$畻寮傚父锛歿str(e)}") logger_debug.exception(e) finally: use_time = time.time() - __start_time if use_time > 0.005: - async_log_util.info(logger_debug, f"鎵叆澶勭悊鏃堕暱锛歿code}-{use_time}") + l2_log.info(code, logger_debug, f"鎵叆澶勭悊鏃堕暱锛歿code}-{use_time}") - def OnLimitUpActiveBuy(self, code, transaction_datas): - can_clear_before_data = self.process_limit_up_active_buy(code, transaction_datas) + def OnLimitUpActiveBuy(self, code, transaction_datas, no_left_limit_up_sell): + can_clear_before_data = self.process_limit_up_active_buy(code, transaction_datas, + no_left_limit_up_sell=no_left_limit_up_sell) if can_clear_before_data: # 娓呴櫎 - EveryLimitupBigDealOrderManager.clear(code) + EveryLimitupBigDealOrderManager.clear(code, "澶勭悊娑ㄥ仠鎴愪氦鏁版嵁") + pass + + def OnLastLimitUpSellDeal(self, code, data): + """ + 鏈�鍚庝竴绗旀定鍋滃崠鏁版嵁鎴愪氦 + @param code: + @param data: (data['SecurityID'], data['TradePrice'], data['TradeVolume'], data['OrderTime'], data['MainSeq'], data['SubSeq'], data['BuyNo'], data['SellNo'], data['ExecType']) + @return: + """ + if True: + return + + if data[6] < data[7]: + # 闈炰富鍔ㄤ拱 + return + # 鏍规嵁鏉垮潡鍒ゆ柇鏄惁鍙拱 + state = CodesTradeStateManager().get_trade_state_cache(code) + if not trade_util.is_can_order_by_state(state): + # 涓嶅浜庡彲涓嬪崟鐘舵�� + return + + l2_log.info(code, logger_l2_radical_buy, f"鏈�鍚庝竴绗旀定鍋滃崠琚悆锛歿code}-{data}") + deal_codes = RadicalBuyDealCodesManager().get_deal_codes() + # 鍒ゆ柇浠婃棩鎵叆鐨勪唬鐮佹暟閲忔槸鍚﹀ぇ浜庨槇鍊� + radical_buy_setting = BuyMoneyAndCountSetting().get_radical_buy_setting() + MAX_COUNT = 4 if radical_buy_setting is None else radical_buy_setting[0] + if not WantBuyCodesManager().is_in_cache(code): + # 鍔犵豢涓嶅垽鏂澘鍧楁槸鍚︽垚浜� + if len(deal_codes) >= MAX_COUNT: + l2_log.info(code, logger_l2_radical_buy, f"鎵叆鎴愪氦浠g爜涓暟澶т簬{MAX_COUNT}涓細{code}-{deal_codes}") + return + if code in deal_codes: + l2_log.info(code, logger_l2_radical_buy, f"璇ヤ唬鐮佸凡缁忔垚浜わ細{code}") + return + + # 鍗曠エ鏄惁鍙拱 + can_buy_result = RadicalBuyDataManager.is_code_can_buy(code) + if not can_buy_result[0]: + return + # 鑾峰彇婵�杩涗拱鐨勬澘鍧� + f_buy_blocks, orgin_buy_blocks = radical_buy_strategy.compute_can_radical_buy_blocks(code, deal_codes) + if not orgin_buy_blocks: + l2_log.info(code, logger_l2_radical_buy, f"娌℃湁鍙壂鍏ョ殑鏉垮潡锛歿code}") + return + + if not f_buy_blocks: + return + # 涔板叆鐨勬澘鍧� + buy_blocks = f_buy_blocks + # 鍒ゆ柇褰撳墠鏃堕棿娈垫槸鍚﹀彲浠ヤ拱鍏� + mode = OrderBeginPosInfo.MODE_RADICAL + can_buy, money, msg = BuyMoneyUtil.get_buy_data(tool.get_now_time_str(), mode, + DealAndDelegateWithBuyModeDataManager().get_deal_codes_info( + mode), + DealAndDelegateWithBuyModeDataManager().get_delegates_codes_info( + mode)) + if not can_buy: + l2_log.info(code, logger_l2_radical_buy, f"褰撳墠鏃堕棿娈靛凡涓嶈兘鎵叆锛歿code}-{msg}") + return + + in_blocks = RealTimeKplMarketData.get_top_market_jingxuan_blocks() + buy_blocks_with_money = [(b, RealTimeKplMarketData.get_jx_block_in_money(b), + in_blocks.index(b) if b in in_blocks else -1) for b in buy_blocks] + if not WantBuyCodesManager().is_in_cache(code): + # 鍒ゆ柇鏄惁寮�寰楀お楂� + open_price = L1DataManager.get_open_price(code) + if not radical_buy_strategy.is_can_buy_with_open_price(code, open_price): + l2_log.info(code, logger_l2_radical_buy, f"寮�寰楀お楂橈細{code}") + radical_buy_data_manager.ExcludeIndexComputeCodesManager.add_code(code) + return + radical_buy_data_manager.ExcludeIndexComputeCodesManager.remove_code(code) + + # 鏍规嵁L2涓嬪崟 + latest_buy_no = data[6] + latest_deal_time = l2_huaxin_util.convert_time(data[3]) + # 娓呴櫎澶у崟濮旀墭鏁版嵁 + EveryLimitupBigDelegateOrderManager.clear(code, '') + + l2_log.info(code, logger_l2_trade, f"璁$畻瀹屾澘鍧椾笌澶у崟锛屽噯澶囦笅鍗曪細{data}") + RadicalBuyDealCodesManager.buy_by_l2_delegate_expire_time_dict[code] = ( + time.time() + 1, latest_buy_no, buy_blocks, + latest_deal_time, buy_blocks_with_money, False) # 鍥炶皟 my_l2_data_callback = MyL2DataCallback() my_l2_data_callbacks = [MyL2DataCallback() for i in range(constant.HUAXIN_L2_MAX_CODES_COUNT)] my_trade_response = MyTradeResponse() + + +def run_l2_market_info_reciever(queues: list): + """ + 鎺ユ敹L2 market鏁版嵁 + @param queues: + @return: + """ + + def recieve_data(queue): + while True: + try: + d = queue.get() + # {"type": "l2_market", "data": (code, data)} + if d["type"] == "l2_market": + code, market_data = d["data"] + my_l2_data_callback.OnMarketData(code, market_data) + except: + pass + + for q in queues: + threading.Thread(target=recieve_data, args=(q,), daemon=True).start() # 棰勫煁鍗� @@ -901,7 +1004,7 @@ result = huaxin_trade_api.order(huaxin_trade_api.TRADE_DIRECTION_BUY, code, volume, limit_up_price, blocking=False, shadow_price=shadow_price, shadow_volume=volume) - async_log_util.info(logger_trade, f"{code}涓嬪崟缁撴潫锛歿result}") + l2_log.info(code, logger_trade, f"{code}涓嬪崟缁撴潫锛歿result}") buy_open_limit_up_strategy.BuyOpenLimitupDataManager().set_place_order_info(code, volume, volume, result.get("order_ref")) except Exception as e: @@ -922,7 +1025,7 @@ if not limit_up_price: init_data_util.re_set_price_pre(code) limit_up_price = gpcode_manager.get_limit_up_price_as_num(code) - min_volume = int(round(50 * 10000 / limit_up_price)) + min_volume = int(round(constant.L2_MIN_MONEY / limit_up_price)) special_volumes = BuyMoneyUtil.get_possible_buy_volumes(limit_up_price) special_volumes |= set([tool.get_buy_volume_by_money(limit_up_price, x) for x in constant.AVAILABLE_BUY_MONEYS]) @@ -945,6 +1048,20 @@ logger_debug.info("鏇存柊鏄ㄦ棩寮�鐩樺暒瀹炴椂娑ㄥ仠鏁版嵁") +def __update_l1_target_codes(): + try: + codes_sh, codes_sz = l1_subscript_codes_manager.request_l1_subscript_target_codes() + if codes_sh and codes_sz: + l1_subscript_codes_manager.save_codes(codes_sh, codes_sz) + # 鎷夊彇涓夋柟鏉垮潡 + codes = [] + codes.extend(codes_sh) + codes.extend(codes_sz) + third_blocks_manager.load_if_less(codes) + except Exception as e: + logger_debug.error(e) + + # 鍋氫竴浜涘垵濮嬪寲鐨勬搷浣� def __init(): def run_pending(): @@ -957,13 +1074,17 @@ # 鏇存柊K绾� schedule.every().day.at("08:00:01").do(history_k_data_manager.update_history_k_bars) schedule.every().day.at("08:30:01").do(history_k_data_manager.update_history_k_bars) - schedule.every().day.at("09:00:01").do(history_k_data_manager.update_history_k_bars) + schedule.every().day.at("09:02:01").do(lambda: history_k_data_manager.update_history_k_bars(force=True)) # 鏇存柊璐︽埛淇℃伅 schedule.every().day.at("09:00:01").do(huaxin_trade_data_update.add_money_list) schedule.every().day.at("09:15:20").do(huaxin_trade_data_update.add_money_list) - schedule.every().day.at("09:15:20").do(huaxin_trade_data_update.add_money_list) # 鏇存柊鏄ㄦ棩瀹炴椂娑ㄥ仠鏁版嵁 schedule.every().day.at("07:58:00").do(__update_yesterday_kpl_limit_up_datas) + # 鏇存柊浠g爜 + schedule.every().day.at("15:58:00").do(__update_l1_target_codes) + schedule.every().day.at("08:56:00").do(__update_l1_target_codes) + # 鏇存柊K绾� + schedule.every().day.at("16:30:00").do(history_k_data_manager.update_history_k_bars) while True: try: @@ -984,22 +1105,36 @@ # L2鎴愪氦淇″彿鍥炶皟 global l2_trade_single_callback l2_trade_single_callback = MyL2TradeSingleCallback() + data_callback.l2_trade_single_callback = l2_trade_single_callback L2TradeSingleDataManager.set_callback(l2_trade_single_callback) # 鍔犺浇鑷敱娴侀�氶噺 global_data_loader.load_zyltgb_volume_from_db() # 鑾峰彇鏈�杩�7澶╂定鍋滄暟鏈�澶氱殑鏉垮潡 - try: - if not KPLPlateForbiddenManager().list_all_cache() and tool.get_now_time_as_int() > int("070000"): - # 娌℃湁娣诲姞杩囩殑鏃跺�欓渶瑕侀噸鏂版坊鍔� - datas_ = LatestLimitUpBlockManager().statistics_limit_up_block_infos() - if datas_: - for data_ in datas_: - # 杩炵画2澶╃殑鏉垮潡灏变笉涔� - if data_[2] >= 2: - KPLPlateForbiddenManager().save_plate(data_[0]) - except: - pass + # try: + # if not KPLPlateForbiddenManager().list_all_cache() and tool.get_now_time_as_int() > int("070000"): + # # 娌℃湁娣诲姞杩囩殑鏃跺�欓渶瑕侀噸鏂版坊鍔� + # datas_ = LatestLimitUpBlockManager().statistics_limit_up_block_infos() + # if datas_: + # for data_ in datas_: + # # 杩炵画2澶╃殑鏉垮潡灏变笉涔� + # if data_[2] >= 2: + # KPLPlateForbiddenManager().save_plate(data_[0]) + # except: + # pass + + # 鍒濆鍖栨暟鎹� + BuyMoneyAndCountSetting() + gpcode_manager.WantBuyCodesManager() + # 鍔犺浇鍘嗗彶K绾挎暟鎹� + HistoryKDataManager().load_data() + # 闃熷垪鎸佷箙鍖� + threading.Thread(target=lambda: DelegateRecordManager().run(), daemon=True).start() + # 鑷姩鍔犳兂绛栫暐 + threading.Thread(target=lambda: auto_add_want_buy_strategy.run(), daemon=True).start() + + # 鍔犺浇寮�鐩樺暒浠婃棩鍘嗗彶娑ㄥ仠鏁版嵁 + kpl_data_manager.KPLLimitUpDataRecordManager.load_total_datas() def run(queue_strategy_r_trade_w, queue_strategy_w_trade_r, queue_strategy_w_trade_r_for_read, trade_ipc_addr): -- Gitblit v1.8.0