From 283a7c89f85b1584fde8ff429028506dc00e53d7 Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期二, 08 七月 2025 14:17:47 +0800 Subject: [PATCH] bug修复/策略完善 --- api/outside_api_callback.py | 200 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 196 insertions(+), 4 deletions(-) diff --git a/api/outside_api_callback.py b/api/outside_api_callback.py index 85655a4..d8d8be3 100644 --- a/api/outside_api_callback.py +++ b/api/outside_api_callback.py @@ -1,14 +1,32 @@ import json import logging +import os import threading +import constant + from api.outside_api_command_manager import ActionCallback +from code_attribute import gpcode_manager +from huaxin_client import l1_subscript_codes_manager from huaxin_client.client_network import SendResponseSkManager -from strategy import strategy_params_settings, env_info +from log_module import async_log_util +from strategy import strategy_params_settings, env_info, strategy_manager from strategy.env_info import RealTimeEnvInfo +from strategy.place_order_queue_manager import PlaceOrderRecordManager +from strategy.strategy_manager import PlateWhiteListManager +from strategy.strategy_params_settings import StrategyParamsSettingsManager, StrategyParamsSettings +from strategy.strategy_variable import StockVariables from strategy.strategy_variable_factory import DataLoader from third_data.history_k_data_manager import TradeDateManager -from utils import socket_util, middle_api_protocol, tool +from third_data.kpl_block_manager import KPLCodeJXBlocksManager +from trade import trade_record_log_util +from trade.trade_manager import TradeStateManager, DealCodesManager, logger_trade, logger_debug +from utils import socket_util, middle_api_protocol, tool, huaxin_util + +OPERRATE_SET = 1 # 璁剧疆 +OPERRATE_DELETE = 2 # 鍒犻櫎 +OPERRATE_GET = 3 # 鑾峰彇 +OPERRATE_ADD = 4 # 鏂板 class MyAPICallback(ActionCallback): @@ -43,8 +61,33 @@ 鑾峰彇浜ゆ槗鍙傛暟 @return: """ - result = strategy_params_settings.settings.to_json_str() + result = strategy_params_settings.StrategyParamsSettingsManager().get_settings().to_json_str() + result = json.loads(result) + result["trade_state"] = 1 if TradeStateManager().is_can_buy_cache() else 0 + return {"code": 0, "data": result} + + def __on_set_settings(self, data): + """ + 璁剧疆浜ゆ槗鍙傛暟 + @return: + """ + settings = strategy_params_settings.StrategyParamsSettingsManager().get_settings() + settings_vars = vars(settings) + for k in data: + if k == "trade_state": + if data[k]: + TradeStateManager().open_buy() + else: + TradeStateManager().close_buy() + continue + if k not in settings_vars: + # 娌℃湁鍦ㄥ睘鎬ч噷闈� + continue + settings.__setattr__(k, data[k]) + strategy_params_settings.StrategyParamsSettingsManager().set_settings(settings) + # 鍚屾鍙傛暟璁剧疆 + return {"code": 0, "data": {}} def __on_get_env(self, need_hsitory_data): """ @@ -57,6 +100,7 @@ fdata["real_time_data"] = RealTimeEnvInfo().to_dict() # 鍘嗗彶鏁版嵁 fdata["history_data"] = {} + print("鑾峰彇鐜", os.getpid()) if need_hsitory_data: if tool.get_now_time_str() < '16:00:00': # 濡傛灉鍦�16:00涔嬪墠閲囩敤褰撳墠鏃ユ湡 @@ -64,7 +108,8 @@ else: # 濡傛灉鍦�16:00涔嬪悗閲囩敤涓嬩竴涓氦鏄撴棩 day = TradeDateManager().get_next_trade_day(tool.get_now_date_str()) - fdata["history_data"]["leading_limit_up_block_codes_count"] = env_info.get_leading_limit_up_block_codes_count( + fdata["history_data"][ + "leading_limit_up_block_codes_count"] = env_info.get_leading_limit_up_block_codes_count( day) if tool.get_now_time_str() < '16:00:00': @@ -74,6 +119,10 @@ # 濡傛灉鍦�16:00涔嬪悗閲囩敤涓嬩竴涓氦鏄撴棩 day = tool.get_now_date_str() fdata["history_data"]["k_bars_count"] = env_info.get_history_k_bars(day) + + day = tool.get_now_date_str() + fdata["history_data"]["kpl_code_jx_blocks_count"] = env_info.get_kpl_code_jx_blocks(day) + return {"code": 0, "data": fdata, "msg": "娴嬭瘯缁撴灉"} def __on_update_leading_limit_up_datas(self): @@ -98,13 +147,156 @@ threading.Thread(target=lambda: update(), daemon=True).start() return {"code": 0} + def __on_update_kpl_code_jx_blocks_datas(self): + """ + 鏇存柊寮�鐩樺暒绮鹃�夋澘鍧楁暟鎹� + @return: + """ + + def update(): + codes = set() + codes_sh, codes_sz = l1_subscript_codes_manager.get_codes() + codes |= set([x.decode() for x in codes_sh]) + codes |= set([x.decode() for x in codes_sz]) + KPLCodeJXBlocksManager(day, codes).start_download_blocks() + # 濡傛灉鍦�16:00涔嬪墠閲囩敤褰撳墠鏃ユ湡 + + day = tool.get_now_date_str() + threading.Thread(target=lambda: update(), daemon=True).start() + return {"code": 0} + + def __on_init_data(self): + try: + strategy_manager.low_suction_strtegy.load_data() + return {"code": 0} + except Exception as e: + logging.exception(e) + return {"code": 1, "msg": str(e)} + + def __on_plate_white_list(self, data): + operate = data["operate"] + if operate == OPERRATE_GET: + plates = PlateWhiteListManager().get_plates() + return {"code": 0, "data": list(plates)} + elif operate == OPERRATE_ADD: + plate = data["plate"] + PlateWhiteListManager().add_plate(plate) + return {"code": 0} + elif operate == OPERRATE_DELETE: + plate = data["plate"] + PlateWhiteListManager().remove_plate(plate) + return {"code": 0} + def OnCommonRequest(self, client_id, request_id, data): ctype = data["ctype"] result_json = {} if ctype == "get_settings": result_json = self.__on_get_settings() + elif ctype == 'set_settings': + del data["ctype"] + result_json = self.__on_set_settings(data) elif ctype == 'get_env': + # 鑾峰彇鐜鏁版嵁 result_json = self.__on_get_env(data.get("history")) elif ctype == 'update_leading_limit_up_datas': + # 鏇存柊棰嗘定鏁版嵁 result_json = self.__on_update_leading_limit_up_datas() + elif ctype == 'update_kpl_code_jx_blocks_datas': + # 鏇存柊寮�鐩樺暒绮鹃�夋暟鎹� + result_json = self.__on_update_kpl_code_jx_blocks_datas() + elif ctype == 'init_datas': + # 鍒濆鍖栨暟鎹� + result_json = self.__on_init_data() + elif ctype == 'get_place_order_records': + # 鑾峰彇涓嬪崟璁板綍 + datas = trade_record_log_util.get_trade_records(trade_record_log_util.TYPE_PLACE_ORDER) + for data in datas: + data[3]["code_name"] = gpcode_manager.CodesNameManager().get_code_name(data[3]["code"]) + result_json = {"code": 0, "data": datas} + elif ctype == 'get_can_buy_plates': + # 鑾峰彇鍙互涔扮殑鏉垮潡 + settings: StrategyParamsSettings = StrategyParamsSettingsManager().get_settings() + try: + current_limit_up_plate_codes = strategy_manager.low_suction_strtegy.current_limit_up_plate_codes + plates = [plate for plate, codes in current_limit_up_plate_codes.items() if + len(codes) >= settings.limit_up_count_of_new_plate] + except: + plates = [] + result_json = {"code": 0, "data": plates} + elif ctype == 'plate_white_list': + result_json = self.__on_plate_white_list(data) + elif ctype == 'get_not_process_place_order_record': + # 鑾峰彇鏈鐞嗙殑涓嬪崟璁板綍 + record = PlaceOrderRecordManager(tool.get_now_date_str()).get_not_process_record() + if not record: + result_json = {"code": 1, "msg": '鏆傛棤璁板綍'} + else: + # (ID,浠g爜,鏉垮潡淇℃伅, 澶у崟淇℃伅, 鏃堕棿, 浠锋牸, 娑ㄥ箙) + fdata = { + "id": record[0], + "code": record[1], + "name": gpcode_manager.CodesNameManager().get_code_name(record[1]), + "platesInfo": {k: [(xx, gpcode_manager.CodesNameManager().get_code_name(xx)) for xx in v] for k, v in + record[2].items()}, + "time_str": record[4], + "bigOrderInfo": record[3] + } + result_json = {"code": 0, "data": fdata} + elif ctype == 'set_place_order_buy': + id_ = data.get("id") + place_order_record_manager = PlaceOrderRecordManager(tool.get_now_date_str()) + # (ID,浠g爜,鏉垮潡淇℃伅, 澶у崟淇℃伅, 鏃堕棿, 浠锋牸, 娑ㄥ箙) + record = place_order_record_manager.get_not_process_record_by_id(id_) + if not record: + result_json = {"code": 1, "msg": '璁板綍涓嶅瓨鍦�'} + else: + code = record[1] + sv: StockVariables = strategy_manager.low_suction_strtegy.stock_variables_dict.get(code) + if sv is None: + result_json = {"code": 1, "msg": '浠g爜鍙橀噺瀵硅薄涓嶅瓨鍦�'} + else: + try: + place_order_record_manager.set_buy(record[0]) + # 鍙互涓嬪崟 + # 鍒ゆ柇鏄惁鍙互涔� + order_ref = huaxin_util.create_order_ref() + price = tool.get_buy_max_price(sv.褰撳墠浠�) + volume = 100 + DealCodesManager().place_order(set(record[2].keys()), record[1], order_ref, price, volume) + trade_record_log_util.add_place_order_log(code, trade_record_log_util.PlaceOrderInfo(code=code, + time_str= + tool.get_now_time_str(), + price=sv.褰撳墠浠�, + rate=round(( sv.褰撳墠浠� - sv.鏄ㄦ棩鏀剁洏浠�) * 100 / sv.鏄ㄦ棩鏀剁洏浠�, 2), + plates=set(record[2].keys()), + plates_info= record[2], + info=record[3] + )) + async_log_util.info(logger_trade, f"{code}涓嬪崟锛屾澘鍧楋細{record[2].keys()}") + result_json = {"code": 0, "msg": '澶勭悊鎴愬姛'} + except Exception as e: + logger_trade.exception(e) + result_json = {"code": 0, "msg": str(e)} + elif ctype == 'set_place_order_not_buy': + id_ = data.get("id") + place_order_record_manager = PlaceOrderRecordManager(tool.get_now_date_str()) + # (ID,浠g爜,鏉垮潡淇℃伅, 澶у崟淇℃伅, 鏃堕棿, 浠锋牸, 娑ㄥ箙) + record = place_order_record_manager.get_not_process_record_by_id(id_) + if not record: + result_json = {"code": 1, "msg": '璁板綍涓嶅瓨鍦�'} + else: + place_order_record_manager.set_not_buy(record[0], "鎵嬪姩椹冲洖") + result_json = {"code": 0, "msg": '澶勭悊鎴愬姛'} + elif ctype == 'add_black_list': + code = data.get("code") + gpcode_manager.BlackListCodeManager().add_code(code) + place_order_record_manager = PlaceOrderRecordManager(tool.get_now_date_str()) + # (ID,浠g爜,鏉垮潡淇℃伅, 澶у崟淇℃伅, 鏃堕棿, 浠锋牸, 娑ㄥ箙) + records = place_order_record_manager.get_not_process_records_by_code(code) + logger_debug.info(f"鏈鐞嗚褰曪細{code}-{len(records)}") + if records: + for r in records: + place_order_record_manager.set_not_buy(r[0], "浠g爜鎷夐粦") + result_json = {"code": 0, "msg": '娣诲姞鎴愬姛'} + self.send_response(result_json, client_id, request_id) -- Gitblit v1.8.0