From 245979e3907d34bcd88ac0c4547f399bf33a44de Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期三, 18 六月 2025 18:13:30 +0800
Subject: [PATCH] bug修复/策略完善

---
 trade/trade_manager.py |  150 +++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 130 insertions(+), 20 deletions(-)

diff --git a/trade/trade_manager.py b/trade/trade_manager.py
index 56ab205..ad55349 100644
--- a/trade/trade_manager.py
+++ b/trade/trade_manager.py
@@ -176,14 +176,11 @@
 
     def __init__(self):
         self.musql = Mysqldb()
+        # 鎴愪氦寰楄鍗曚俊鎭�
         self.__deal_code_orders_info = {}
-        self.redis_manager = redis_manager.RedisManager(12)
-        # 涓嬭繃鍗曠殑鏉垮潡浠g爜
-        self.__place_order_plate_codes_info = {}
+        # 濮旀墭寰楄鍗曚俊鎭細{code#order_ref:}
+        self.__delegate_code_orders = {}
         self.__load_data()
-
-    def __get_redis(self):
-        return self.redis_manager.getRedis()
 
     def __load_data(self):
         # 涓嶇畻鎵撴澘鐨勬暟鎹�
@@ -193,13 +190,9 @@
             for r in results:
                 self.add_deal_order(r[1], r[4], round(float(r[3]), 2), r[0], r[2])
 
-        val = RedisUtils.get(self.__get_redis(), "place_order_plate_codes_info")
-        if val:
-            self.__place_order_plate_codes_info = json.loads(val)
-
     def add_deal_order(self, code, volume, price, trade_id, order_sys_id):
         """
-        娣诲姞鎴愪氦澶у崟
+        娣诲姞鎴愪氦璁㈠崟
         @param code:
         @param volume:
         @param price:
@@ -217,31 +210,148 @@
             return
         self.__deal_code_orders_info[code][trade_id] = (volume, price, order_sys_id)
 
+    def set_order_status(self, code, order_ref, order_sys_id, price, volume, status):
+        """
+        璁剧疆璁㈠崟鐘舵��
+        @param code:
+        @param order_ref:
+        @param order_sys_id:
+        @param price:
+        @param volume:
+        @param status:
+        @return:
+        """
+        k = f"{code}#{order_ref}"
+        if k not in self.__delegate_code_orders:
+            return
+        # [浠g爜锛岃鍗曠储寮曪紝璁㈠崟鍙凤紝浠锋牸锛岄噺锛岀姸鎬侊紝鏉垮潡闆嗗悎]
+        data = self.__delegate_code_orders[k]
+        data[2] = order_sys_id
+        data[5] = status
+        data[3] = price
+        data[4] = volume
+        # 濡傛灉璁㈠崟宸茬粡鍙栨秷灏遍渶瑕佸垹闄�
+        if status == huaxin_util.TORA_TSTP_OST_AllCanceled or status == huaxin_util.TORA_TSTP_OST_Rejected:
+            data = self.__delegate_code_orders.pop(k)
+            if data:
+                PlatePlaceOrderManager().remove_plates_code(data[6], code)
+
     def get_deal_codes(self):
         if not self.__deal_code_orders_info:
             return set()
         return set(self.__deal_code_orders_info.keys())
 
-    def place_order(self, plate, code):
+    def place_order(self, plates, code, order_ref, price, volume):
         """
         涓嬪崟
-        @param plate:
+        @param plates:
+        @param code:
+        @param order_ref:
+        @param price:
+        @param volume:
+        @return:
+        """
+        # 鍒濆鍖栧鎵樻暟鎹� [浠g爜锛岃鍗曠储寮曪紝璁㈠崟鍙凤紝浠锋牸锛岄噺锛岀姸鎬侊紝鏉垮潡闆嗗悎]
+        data = [code, order_ref, '', price, volume, huaxin_util.TORA_TSTP_OST_Unknown, plates]
+        k = f"{code}#{order_ref}"
+        if k not in self.__delegate_code_orders:
+            self.__delegate_code_orders[k] = data
+        PlatePlaceOrderManager().add_plates_code(plates, code)
+
+    def place_order_fail(self, code, order_ref):
+        """
+        涓嬪崟澶辫触浜�
+        @param code:
+        @param order_ref:
+        @return:
+        """
+        k = f"{code}#{order_ref}"
+        if k in self.__delegate_code_orders:
+            data = self.__delegate_code_orders.pop(k)
+            if data:
+                PlatePlaceOrderManager().remove_plates_code(data[6], code)
+
+    def get_deal_or_delegated_codes(self):
+        """
+        鑾峰彇宸茬粡鎴愪氦鎴栬�呭鎵樼殑浠g爜
+        @return:
+        """
+        codes = set()
+        if self.__delegate_code_orders:
+            for k in self.__delegate_code_orders:
+                codes.add(self.__delegate_code_orders[k][0])
+
+        if self.__deal_code_orders_info:
+            codes |= set(self.__deal_code_orders_info.keys())
+        return codes
+
+
+@tool.singleton
+class PlatePlaceOrderManager:
+    """
+    鏉垮潡涓嬪崟绠$悊
+    """
+
+    def __init__(self):
+        self.__db = 12
+        self.redis_manager = redis_manager.RedisManager(self.__db)
+        # 涓嬭繃鍗曠殑鏉垮潡浠g爜
+        self.__place_order_plate_codes_info = {}
+        self.__load_data()
+
+    def __get_redis(self):
+        return self.redis_manager.getRedis()
+
+    def __load_data(self):
+        val = RedisUtils.get(self.__get_redis(), "place_order_plate_codes_info")
+        if val:
+            self.__place_order_plate_codes_info = json.loads(val)
+
+    def add_plates_code(self, plates, code):
+        """
+        娣诲姞鏉垮潡涓嬪崟
+        @param plates:
         @param code:
         @return:
         """
-        if plate not in self.__place_order_plate_codes_info:
-            self.__place_order_plate_codes_info[plate] = []
-        if code not in self.__place_order_plate_codes_info[plate]:
-            self.__place_order_plate_codes_info[plate].append(code)
+        for plate in plates:
+            if plate not in self.__place_order_plate_codes_info:
+                self.__place_order_plate_codes_info[plate] = []
+            if code not in self.__place_order_plate_codes_info[plate]:
+                self.__place_order_plate_codes_info[plate].append(code)
+        self.__sync_plate_place_order_info()
+
+    def __sync_plate_place_order_info(self):
+        """
+        鍚屾鏉垮潡涓嬪崟淇℃伅
+        @return:
+        """
         RedisUtils.setex_async(self.__db, "place_order_plate_codes_info", tool.get_expire(),
                                json.dumps(self.__place_order_plate_codes_info))
 
-    def get_place_order_plate_codes(self):
+    def remove_plates_code(self, plates, code):
+        """
+        绉婚櫎鏉垮潡涓嬪崟
+        @param plates:
+        @param code:
+        @return:
+        """
+        for plate in plates:
+            if plate in self.__place_order_plate_codes_info:
+                if code in self.__place_order_plate_codes_info[plate]:
+                    self.__place_order_plate_codes_info[plate].remove(code)
+        self.__sync_plate_place_order_info()
+
+    def get_plate_codes(self):
         return self.__place_order_plate_codes_info
 
 
 __CodesTradeStateManager = CodesTradeStateManager()
 
 if __name__ == "__main__":
-    codes = DealCodesManager().get_codes()
-    print(codes)
+    PlatePlaceOrderManager().add_plates_code({"閫氫俊","璁$畻鏈�"}, "000333")
+    place_order_plate_codes = PlatePlaceOrderManager().get_plate_codes()
+    code_sets = [set(lst) for lst in place_order_plate_codes.values()]
+    # 2. 浣跨敤 set.union() 姹傚苟闆�
+    union_code_sets = set().union(*code_sets)
+    print(union_code_sets)

--
Gitblit v1.8.0