From c20c3c10635ce78db4a86ce9c0bb1d02e90f525d Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期二, 08 八月 2023 17:40:42 +0800 Subject: [PATCH] 单例+缓存优化 --- server.py | 307 ++++++++++++--------------------------------------- 1 files changed, 73 insertions(+), 234 deletions(-) diff --git a/server.py b/server.py index 61d52e2..eb8eff7 100644 --- a/server.py +++ b/server.py @@ -10,19 +10,19 @@ import threading import time -from utils import alert_util, data_process, global_util, ths_industry_util, tool, import_util +from utils import alert_util, data_process, global_util, ths_industry_util, tool, import_util, socket_util from code_attribute import code_volumn_manager, code_nature_analyse, global_data_loader, gpcode_manager, \ - gpcode_first_screen_manager + gpcode_first_screen_manager, first_target_code_data_processor import constant from user import authority import inited_data from l2 import l2_data_manager_new, l2_data_manager, l2_data_log, l2_log, code_price_manager import l2_data_util -from l2.cancel_buy_strategy import HourCancelBigNumComputer, L2LimitUpMoneyStatisticUtil, LCancelBigNumComputer +from l2.cancel_buy_strategy import HourCancelBigNumComputer, LCancelBigNumComputer import l2.l2_data_util from output import code_info_output -from third_data import hot_block_data_process, block_info, kpl_api +from third_data import block_info, kpl_api from third_data.code_plate_key_manager import CodesHisReasonAndBlocksManager from third_data.history_k_data_util import HistoryKDatasUtils from third_data.kpl_data_manager import KPLCodeLimitUpReasonManager, KPLLimitUpDataRecordManager @@ -32,7 +32,7 @@ from code_attribute.code_data_util import ZYLTGBUtil import l2.transaction_progress -from logs_.log import logger_l2_error, logger_device, logger_trade_delegate, logger_buy_1_volumn_record, \ +from log_module.log import logger_l2_error, logger_device, logger_trade_delegate, logger_buy_1_volumn_record, \ logger_l2_trade_queue, logger_l2_latest_data, logger_l2_trade_buy_queue, logger_first_code_record, logger_debug from trade.huaxin import huaxin_trade_record_manager from trade.trade_manager import TradeTargetCodeModeManager @@ -43,9 +43,11 @@ class MyTCPServer(socketserver.TCPServer): - def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True, pipe_juejin=None, pipe_ui=None): - self.pipe_juejin = pipe_juejin # 澧炲姞鐨勫弬鏁� + def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True, pipe_trade=None, pipe_ui=None): + self.pipe_trade = pipe_trade # 澧炲姞鐨勫弬鏁� self.pipe_ui = pipe_ui + # 鍒濆鍖栨暟鎹� + block_info.init() socketserver.TCPServer.__init__(self, server_address, RequestHandlerClass, bind_and_activate=bind_and_activate) @@ -79,8 +81,12 @@ def setup(self): super().setup() # 鍙互涓嶈皟鐢ㄧ埗绫荤殑setup()鏂规硶锛岀埗绫荤殑setup鏂规硶浠�涔堥兘娌″仛 # print("----setup鏂规硶琚墽琛�-----") - # print("鎵撳嵃浼犲叆鐨勫弬鏁帮細", self.server.pipe) + # print("鎵撳嵃浼犲叆鐨勫弬鏁帮細", self.server.pipe_trade) self.l2CodeOperate = l2_code_operate.L2CodeOperate.get_instance() + + def __notify_trade(self, type_): + if self.server.pipe_trade: + self.server.pipe_trade.send(json.dumps({"type": type_})) def handle(self): host = self.client_address[0] @@ -106,7 +112,6 @@ try: # 濡傛灉甯︽湁澶� if _str.startswith("##"): - total_length = int(_str[2:10]) _str = _str[10:] # 闃叉socket鏁版嵁鍙戠敓绮樿繛 @@ -268,199 +273,21 @@ # if limit_up_time_manager.get_limit_up_time(d["code"]) is None: # limit_up_time_manager.save_limit_up_time(d["code"], d["time"]) elif type == 22: + print("---鎺ュ彈鍒伴鏉夸唬鐮�") try: if int(tool.get_now_time_str().replace(":", "")) < int("092500"): raise Exception('鏈埌鎺ュ彈鏃堕棿') # 棣栨澘浠g爜 dataList, is_add = data_process.parseGPCode(_str) - limit_up_price_dict = {} - temp_codes = [] - codes = [] - tick_datas = [] - if dataList: - for data in dataList: - code = data["code"] - codes.append(code) - - # ---鏌ヨ鎯充拱鍗曪紝濡傛灉娌℃湁鍦ㄥ垪琛ㄤ腑灏遍渶瑕佸己琛屽姞鍏ュ垪琛� - want_codes = gpcode_manager.WantBuyCodesManager.list_code() - if want_codes: - # 娌℃湁鍦ㄧ幇浠烽噰闆嗕腑鐨勬兂涔颁唬鐮� - diff_codes = set(want_codes) - set(codes) - if diff_codes: - zyltgb_list = [] - for code in diff_codes: - # 鏌ヨ鏄惁鍦↙2鐜颁环涓� - if code in self.__l2_current_price_data: - item = self.__l2_current_price_data.get(code) - codes.append(code) - dataList.append(item) - # 淇濆瓨鑷敱娴侀�氳偂鏈� - zyltgb_list.append( - {"code": code, "zyltgb": item["zyltgb"], "zyltgb_unit": item["zyltgbUnit"]}) - else: - # 鑾峰彇娑ㄥ仠浠� - _limit_up_price = gpcode_manager.get_limit_up_price(code) - if not _limit_up_price: - inited_data.re_set_price_pres([code], True) - # 鍐嶆鑾峰彇娑ㄥ仠浠� - _limit_up_price = gpcode_manager.get_limit_up_price(code) - if _limit_up_price: - # 鎴愬姛鑾峰彇鍒颁簡娑ㄥ仠浠凤紝鏋勯�犺櫄鎷熺殑鐜颁环淇℃伅 - codes.append(code) - dataList.append({"code": code, "price": f"{_limit_up_price}", "volume": "0", - "volumeUnit": 0, "time": "00:00:00", "zyltgb": "100", - "zyltgbUnit": 0}) - # 寮哄埗鏇存柊鑷敱娴侀�氳偂鏈� - if zyltgb_list: - ZYLTGBUtil.save_list(zyltgb_list) - # 灏嗕繚瀛樼殑鏁版嵁鏇存柊鍒板唴瀛樹腑 - for z in zyltgb_list: - val = ZYLTGBUtil.get(z["code"]) - if val: - global_util.zyltgb_map[z["code"]] = val - - # ---淇濆瓨鏈瓫閫夌殑棣栨澘浠g爜 - new_add_codes = gpcode_first_screen_manager.set_target_no_screen_codes(codes) - # 淇濆瓨鑷敱娴侀�氳偂鏈� - if dataList: - zyltgb_list = [] - for data in dataList: - code = data["code"] - if code in global_util.zyltgb_map: - continue - zyltgb_list.append( - {"code": code, "zyltgb": data["zyltgb"], "zyltgb_unit": data["zyltgbUnit"]}) - if zyltgb_list: - ZYLTGBUtil.save_list(zyltgb_list) - global_data_loader.load_zyltgb() - - bad_codes = set() - - # 鑾峰彇鏄ㄦ棩鏀剁洏浠� - for code in codes: - # 濡傛灉娑ㄥ仠浠锋槸绌哄�煎氨闇�瑕佽缃槰鏃ユ敹鐩樹环鏍� - if gpcode_manager.get_limit_up_price(code) is None: - inited_data.re_set_price_pres([code], True) - - # 鏉垮潡鍏抽敭瀛楀噯澶� - for code in codes: - if not self.__CodesPlateKeysManager.get_history_limit_up_reason(code) is None: - self.__CodesPlateKeysManager.set_history_limit_up_reason(code, - KPLLimitUpDataRecordManager.get_latest_blocks_set( - code)) - if self.__CodesPlateKeysManager.get_blocks(code) is None: - try: - results = kpl_api.getStockIDPlate(code) - bs = [r[1] for r in results] - self.__CodesPlateKeysManager.set_blocks(code, bs) - except Exception as e: - logging.exception(e) - pass - - # 鑾峰彇60澶╂渶澶ц褰� - for code in codes: - need_get_volumn = False - if code not in global_util.max60_volumn or global_util.max60_volumn.get(code) is None: - need_get_volumn = True - if not need_get_volumn and code_nature_analyse.CodeNatureRecordManager.get_nature( - code) is None: - need_get_volumn = True - if need_get_volumn: - volumes_data = inited_data.get_volumns_by_code(code, 150) - volumes = inited_data.parse_max_volume(volumes_data[:90], - code_nature_analyse.is_new_top( - gpcode_manager.get_limit_up_price(code), - volumes_data[:90])) - logger_first_code_record.info("{} 鑾峰彇鍒伴鏉�60澶╂渶澶ч噺锛歿}", code, volumes) - code_volumn_manager.set_histry_volumn(code, volumes[0], volumes[1], volumes[2]) - # 鍒ゆ柇K绾垮舰鎬� - is_has_k_format, msg = code_nature_analyse.is_has_k_format( - gpcode_manager.get_limit_up_price(code), volumes_data) - if not is_has_k_format: - logger_first_code_record.info("{}棣栨澘K绾垮舰鎬佷笉濂�,{}", code, msg) - # 鑲℃�т笉濂斤紝灏变笉瑕佸姞鍏� - bad_codes.add(code) - # 鍔犲叆绂佹浜ゆ槗浠g爜 - l2_trade_util.forbidden_trade(code) - code_nature_analyse.set_record_datas(code, - gpcode_manager.get_limit_up_price(code), - volumes_data) - gpcode_manager.FirstCodeManager.add_record(codes) - if new_add_codes: - gpcode_manager.set_first_gp_codes_with_data(HistoryKDatasUtils.get_gp_latest_info(codes, - fields="symbol,sec_name,sec_type,sec_level")) - # 鍔犲叆棣栨澘鍘嗗彶璁板綍 - - logger_first_code_record.info("鏂板棣栨澘锛歿}", new_add_codes) - - # 绉婚櫎浠g爜 - listen_codes = gpcode_manager.get_listen_codes() - for lc in listen_codes: - if not gpcode_manager.is_in_gp_pool(lc): - # 绉婚櫎浠g爜 - l2_code_operate.L2CodeOperate.get_instance().add_operate(0, lc, "浠g爜琚Щ闄�") - - # 淇濆瓨鐜颁环 - if dataList: - for data in dataList: - code = data["code"] - codes.append(code) - limit_up_price = gpcode_manager.get_limit_up_price(code) - if limit_up_price is not None: - limit_up_price_dict[code] = limit_up_price - else: - temp_codes.append(code) - tick_datas.append({"code": code, "price": data["price"], "volume": data["volume"], - "volumeUnit": data["volumeUnit"]}) - # 鑾峰彇娑ㄥ仠浠� - if temp_codes: - # 鑾峰彇娑ㄥ仠浠� - inited_data.re_set_price_pres(temp_codes) - # 閲嶆柊鑾峰彇娑ㄥ仠浠� - for code in temp_codes: - limit_up_price = gpcode_manager.get_limit_up_price(code) - if limit_up_price is not None: - limit_up_price_dict[code] = limit_up_price + tick_datas = first_target_code_data_processor.process_first_codes_datas(dataList) # 淇濆瓨鐜颁环 self.first_tick_datas.clear() self.first_tick_datas.extend(tick_datas) - - # 棣栨澘鏁版嵁鍔犲伐 - prices = [] - for data in dataList: - code = data["code"] - price = data["price"] - limit_up_time = data["time"] - if limit_up_time == "00:00:00": - limit_up_time = None - if code not in limit_up_price_dict: - continue - is_limit_up = abs(float(limit_up_price_dict[code]) - float(price)) < 0.01 - # 绾犳鏁版嵁 - if is_limit_up and limit_up_time is None: - limit_up_time = tool.get_now_time_str() - if is_limit_up: - # 鍔犲叆棣栨澘娑ㄥ仠 - gpcode_manager.FirstCodeManager.add_limited_up_record([code]) - pricePre = gpcode_manager.get_price_pre(code) - if pricePre is None: - inited_data.re_set_price_pres([code]) - - rate = round((float(price) - pricePre) * 100 / pricePre, 1) - prices.append( - {"code": code, "time": limit_up_time, "rate": rate, - "limit_up": is_limit_up}) - if code in new_add_codes: - if is_limit_up: - place_order_count = trade_data_manager.placeordercountmanager.get_place_order_count( - code) - if place_order_count == 0: - trade_data_manager.placeordercountmanager.place_order(code) - - gpcode_first_screen_manager.process_ticks(prices) except Exception as e: logging.exception(e) + finally: + print("棣栨澘浠g爜澶勭悊瀹屾瘯锛�") + return_str = socket_util.load_header(json.dumps({"code": 0}).encode("utf-8")).decode("utf-8") elif type == 3: # 浜ゆ槗鎴愬姛淇℃伅 @@ -487,7 +314,7 @@ apply_time = item["apply_time"] if apply_time and len(apply_time) >= 8: code = item["code"] - trade_state = trade_manager.get_trade_state(code) + trade_state = trade_manager.CodesTradeStateManager().get_trade_state(code) # 璁剧疆涓嬪崟鐘舵�佺殑浠g爜涓哄凡濮旀墭 if trade_state == trade_manager.TRADE_STATE_BUY_PLACE_ORDER: origin_apply_time = apply_time @@ -534,7 +361,7 @@ client = datas["client"] money = datas["money"] # TODO瀛樺叆缂撳瓨鏂囦欢 - trade_manager.set_available_money(client, money) + trade_manager.AccountAvailableMoneyManager().set_available_money(client, money) # l2浜ゆ槗闃熷垪 elif type == 10: # 鍙敤閲戦 @@ -562,8 +389,8 @@ limit_up_price = gpcode_manager.get_limit_up_price(code) if limit_up_price is not None: - code_price_manager.Buy1PriceManager.process(code, buy_one_price, buy_time, limit_up_price, - sell_one_price, sell_one_volumn) + code_price_manager.Buy1PriceManager().process(code, buy_one_price, buy_time, limit_up_price, + sell_one_price, sell_one_volumn) _start_time = time.time() msg += "涔�1浠锋牸澶勭悊锛�" + f"{_start_time - __start_time} " @@ -581,7 +408,7 @@ decimal.Decimal("0.00")) # 鑾峰彇鎵ц浣嶆椂闂� - buy_single_index, buy_exec_index, compute_index, num, count, max_num_set, volume_rate = l2_data_manager.TradePointManager.get_buy_compute_start_data( + buy_single_index, buy_exec_index, compute_index, num, count, max_num_set, volume_rate = l2_data_manager.TradePointManager().get_buy_compute_start_data( code) if True: # 鍙湁涓嬪崟杩囧悗鎵嶈幏鍙栦氦鏄撹繘搴� @@ -598,15 +425,16 @@ buy_queue_result_list, exec_time) if buy_progress_index is not None: - HourCancelBigNumComputer.set_trade_progress(code, buy_time, buy_exec_index, - buy_progress_index, - l2.l2_data_util.local_today_datas.get( - code), - l2.l2_data_util.local_today_num_operate_map.get( - code)) - LCancelBigNumComputer.set_trade_progress(code, buy_progress_index, - l2.l2_data_util.local_today_datas.get( - code)) + HourCancelBigNumComputer().set_trade_progress(code, buy_time, + buy_exec_index, + buy_progress_index, + l2.l2_data_util.local_today_datas.get( + code), + l2.l2_data_util.local_today_num_operate_map.get( + code)) + LCancelBigNumComputer().set_trade_progress(code, buy_progress_index, + l2.l2_data_util.local_today_datas.get( + code)) logger_l2_trade_buy_queue.info("鑾峰彇鎴愪氦浣嶇疆鎴愬姛锛� code-{} index-{} 鏁版嵁-{}", code, buy_progress_index, @@ -718,9 +546,9 @@ price) # if need_cancel: # l2_data_manager_new.L2TradeDataProcessor.cancel_buy(code, cancel_msg, "trade_queue") - if need_sync: - # 鍚屾鏁版嵁 - L2LimitUpMoneyStatisticUtil.verify_num(code, volumn, time_) + # if need_sync: + # # 鍚屾鏁版嵁 + # L2LimitUpMoneyStatisticUtil.verify_num(code, volumn, time_) elif type == 30: # 蹇冭烦淇℃伅 data = data_process.parse(_str)["data"] @@ -776,8 +604,8 @@ data_json = data_process.parse(_str) day = data_json["day"] datas = data_json["data"] - if datas: - hot_block_data_process.save_datas(day, datas) + # if datas: + # hot_block_data_process.save_datas(day, datas) print(datas) elif type == 71: # 鏍规嵁浠g爜鑾峰彇閫夎偂瀹濈儹闂ㄦ蹇� @@ -807,7 +635,7 @@ data = json.loads(_str) code = data["data"]["code"] if code: - state = trade_manager.get_trade_state(code) + state = trade_manager.CodesTradeStateManager().get_trade_state(code) if state == trade_manager.TRADE_STATE_BUY_PLACE_ORDER or state == trade_manager.TRADE_STATE_BUY_DELEGATED or state == trade_manager.TRADE_STATE_BUY_CANCEL_ING: try: l2_data_manager_new.L2TradeDataProcessor.cancel_buy(code, "鎵嬪姩鎾ら攢") @@ -841,6 +669,7 @@ gpcode_manager.CodesNameManager.add_first_code_name(code, results[code]) return_str = json.dumps({"code": 0}) + self.__notify_trade("black_list") elif type == 202: # 鍔犲叆鐧藉悕鍗� data = json.loads(_str) @@ -848,9 +677,9 @@ try: for code in codes: # 鑷敱娴侀�氬競鍊�>50浜�,鑲′环楂樹簬30鍧楃殑涓嶈兘鍔犵櫧鍚嶅崟 - limit_up_price = gpcode_manager.get_limit_up_price(code) - if float(limit_up_price) > 30: - raise Exception("鑲′环楂樹簬30鍏�") + # limit_up_price = gpcode_manager.get_limit_up_price(code) + # if float(limit_up_price) > 30: + # raise Exception("鑲′环楂樹簬30鍏�") # zyltgb = global_util.zyltgb_map.get(code) # if zyltgb is None: # global_data_loader.load_zyltgb() @@ -858,7 +687,7 @@ # if zyltgb > 50 * 100000000: # raise Exception("鑷敱娴侀�氳偂鏈ぇ浜�50浜�") - l2_trade_util.WhiteListCodeManager.add_code(code) + l2_trade_util.WhiteListCodeManager().add_code(code) name = gpcode_manager.get_code_name(code) if not name: results = HistoryKDatasUtils.get_gp_codes_names([code]) @@ -867,6 +696,7 @@ return_str = json.dumps({"code": 0}) except Exception as e: return_str = json.dumps({"code": 1, "msg": str(e)}) + self.__notify_trade("white_list") elif type == 203: # 绉婚櫎榛戝悕鍗� @@ -875,16 +705,18 @@ for code in codes: l2_trade_util.remove_from_forbidden_trade_codes(code) return_str = json.dumps({"code": 0}) + self.__notify_trade("black_list") elif type == 204: # 绉婚櫎鐧藉悕鍗� data = json.loads(_str) codes = data["data"]["codes"] for code in codes: - l2_trade_util.WhiteListCodeManager.remove_code(code) + l2_trade_util.WhiteListCodeManager().remove_code(code) return_str = json.dumps({"code": 0}) + self.__notify_trade("white_list") elif type == 301: # 榛戝悕鍗曞垪琛� - codes = l2_trade_util.BlackListCodeManager.list_codes() + codes = l2_trade_util.BlackListCodeManager().list_codes() datas = [] for code in codes: name = gpcode_manager.get_code_name(code) @@ -892,18 +724,19 @@ return_str = json.dumps({"code": 0, "data": datas}) elif type == 302: # 榛戝悕鍗曞垪琛� - codes = l2_trade_util.WhiteListCodeManager.list_codes() + codes = l2_trade_util.WhiteListCodeManager().list_codes() datas = [] for code in codes: name = gpcode_manager.get_code_name(code) datas.append(f"{name}:{code}") return_str = json.dumps({"code": 0, "data": datas}) + elif type == 401: # 鍔犲叆鎯宠涔� data = json.loads(_str) codes = data["data"]["codes"] for code in codes: - gpcode_manager.WantBuyCodesManager.add_code(code) + gpcode_manager.WantBuyCodesManager().add_code(code) name = gpcode_manager.get_code_name(code) if not name: results = HistoryKDatasUtils.get_gp_codes_names([code]) @@ -914,12 +747,14 @@ self.__KPLCodeLimitUpReasonManager.save_reason(codes[i], data["data"]["plates"][i]) return_str = json.dumps({"code": 0}) + self.__notify_trade("want_list") elif type == 402: data = json.loads(_str) codes = data["data"]["codes"] for code in codes: - gpcode_manager.WantBuyCodesManager.remove_code(code) + gpcode_manager.WantBuyCodesManager().remove_code(code) return_str = json.dumps({"code": 0}) + self.__notify_trade("want_list") elif type == 403: plate = None include_codes = set() @@ -932,7 +767,7 @@ if code_map[k] == plate: include_codes.add(k) - codes = gpcode_manager.WantBuyCodesManager.list_code() + codes = gpcode_manager.WantBuyCodesManager().list_code_cache() datas = [] for code in codes: if plate and plate != '鍏朵粬' and code not in include_codes: @@ -945,25 +780,27 @@ data = json.loads(_str) codes = data["data"]["codes"] for code in codes: - gpcode_manager.PauseBuyCodesManager.add_code(code) + gpcode_manager.PauseBuyCodesManager().add_code(code) name = gpcode_manager.get_code_name(code) if not name: results = HistoryKDatasUtils.get_gp_codes_names([code]) if results: gpcode_manager.CodesNameManager.add_first_code_name(code, results[code]) return_str = json.dumps({"code": 0}) + self.__notify_trade("pause_buy_list") # 鍔犲叆鏆傚仠涔板叆鍒楄〃 elif type == 412: # 绉婚櫎鏆傚仠涔板叆鍒楄〃 data = json.loads(_str) codes = data["data"]["codes"] for code in codes: - gpcode_manager.PauseBuyCodesManager.remove_code(code) + gpcode_manager.PauseBuyCodesManager().remove_code(code) return_str = json.dumps({"code": 0}) + self.__notify_trade("pause_buy_list") elif type == 413: # 鏆傚仠涔板叆鍒楄〃 - codes = gpcode_manager.PauseBuyCodesManager.list_code() + codes = gpcode_manager.PauseBuyCodesManager().list_code() datas = [] for code in codes: name = gpcode_manager.get_code_name(code) @@ -975,7 +812,7 @@ data = json.loads(_str) codes = data["data"]["codes"] code = codes[0] - state = trade_manager.get_trade_state(code) + state = trade_manager.CodesTradeStateManager().get_trade_state(code) if state != trade_manager.TRADE_STATE_BUY_CANCEL_SUCCESS and state != trade_manager.TRADE_STATE_BUY_SUCCESS: return_str = json.dumps({"code": 0, "msg": "鍙互鍙栨秷"}) else: @@ -987,10 +824,10 @@ code = data["data"]["code"] # 鏌ヨ鏄惁鎯充拱鍗�/鐧藉悕鍗�/榛戝悕鍗�/鏆備笉涔� code_name = gpcode_manager.get_code_name(code) - want = gpcode_manager.WantBuyCodesManager.is_in(code) - white = l2_trade_util.WhiteListCodeManager.is_in(code) + want = gpcode_manager.WantBuyCodesManager().is_in_cache(code) + white = l2_trade_util.WhiteListCodeManager().is_in_cache(code) black = l2_trade_util.is_in_forbidden_trade_codes(code) - pause_buy = gpcode_manager.PauseBuyCodesManager.is_in(code) + pause_buy = gpcode_manager.PauseBuyCodesManager().is_in_cache(code) desc_list = [] if want: @@ -1009,25 +846,27 @@ data = json.loads(_str) is_open = data["data"]["open"] if is_open: - trade_manager.TradeStateManager.open_buy() + trade_manager.TradeStateManager().open_buy() else: - trade_manager.TradeStateManager.close_buy() + trade_manager.TradeStateManager().close_buy() return_str = json.dumps({"code": 0, "msg": ("寮�鍚垚鍔�" if is_open else "鍏抽棴鎴愬姛")}) + self.__notify_trade("trade_state") elif type == 502: - can_buy = trade_manager.TradeStateManager.is_can_buy() + can_buy = trade_manager.TradeStateManager().is_can_buy_cache() return_str = json.dumps({"code": 0, "data": {"can_buy": can_buy}}) elif type == 503: # 璁剧疆浜ゆ槗鐩爣浠g爜鐨勬ā寮� data = json.loads(_str) mode = data["data"]["mode"] try: - TradeTargetCodeModeManager.set_mode(mode) + TradeTargetCodeModeManager().set_mode(mode) return_str = json.dumps({"code": 0, "data": {"mode": mode}}) except Exception as e: return_str = json.dumps({"code": 1, "msg": str(e)}) + self.__notify_trade("trade_mode") elif type == 504: # 鑾峰彇浜ゆ槗鐩爣浠g爜妯″紡 - mode = TradeTargetCodeModeManager.get_mode() + mode = TradeTargetCodeModeManager().get_mode_cache() return_str = json.dumps({"code": 0, "data": {"mode": mode}}) elif type == 601: pass -- Gitblit v1.8.0