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