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