code_attribute/gpcode_manager.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
main.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
server/data_server.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
strategy/strategy_manager.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
strategy/strategy_params_settings.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
strategy/strategy_variable.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
strategy/strategy_variable_factory.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
strategy/test.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
strategy/time_series_backtest.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
strategy/低吸脚本_辨识度_v6.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
third_data/history_k_data_manager.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
trade/huaxin/huaxin_trade_data_update.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
trade/trade_manager.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
utils/init_data_util.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
code_attribute/gpcode_manager.py
@@ -655,36 +655,38 @@ return list @tool.singleton class CodePrePriceManager: __price_pre_cache = {} __redisManager = redis_manager.RedisManager(0) def __init__(self): # å è½½æ°æ® fdatas = log_export.load_pre_close_price() if fdatas: for code in fdatas: self.__price_pre_cache[code] = round(float(fdatas.get(code)), 2) # è·åæ¶çä»· @classmethod def get_price_pre(cls, code): def get_price_pre(self, code): fdatas = log_export.load_pre_close_price() if code in fdatas: return round(float(fdatas.get(code)), 2) return None # è·åç¼å @classmethod def get_price_pre_cache(cls, code): if code in cls.__price_pre_cache: return float(cls.__price_pre_cache[code]) val = cls.get_price_pre(code) if val: cls.__price_pre_cache[code] = val return val def get_price_pre_cache(self, code): if code in self.__price_pre_cache: return self.__price_pre_cache[code] return None # 设置æ¶çä»· @classmethod def set_price_pre(cls, code, price, force=False): if code in cls.__price_pre_cache and not force: def set_price_pre(self, code, price, force=False): if code in self.__price_pre_cache and not force: return price = round(float(price), 2) logger_pre_close_price.info(f"{code}-{price}") cls.__price_pre_cache[code] = price self.__price_pre_cache[code] = price __limit_up_price_dict = {} @@ -695,7 +697,7 @@ # 读åå åä¸çå¼ if code in __limit_up_price_dict: return __limit_up_price_dict[code] price = CodePrePriceManager.get_price_pre_cache(code) price = CodePrePriceManager().get_price_pre_cache(code) if price is None: return None limit_up_price = tool.to_price(decimal.Decimal(str(price)) * decimal.Decimal(tool.get_limit_up_rate(code))) @@ -730,7 +732,7 @@ # è·åè·åä»· def get_limit_down_price(code): price = CodePrePriceManager.get_price_pre_cache(code) price = CodePrePriceManager().get_price_pre_cache(code) if price is None: return None return tool.to_price(decimal.Decimal(str(price)) * decimal.Decimal(f"{tool.get_limit_down_rate(code)}")) main.py
@@ -7,9 +7,12 @@ from api import outside_api_callback from api.outside_api_command_manager import ApiCommandManager from db.redis_manager_delegate import RedisUtils from huaxin_client import l2_market_client, trade_client from log_module import async_log_util from log_module.log import logger_debug from server import data_server from strategy import strategy_manager from strategy.env_info import RealTimeEnvInfo from third_data import hx_qc_value_util from trade.huaxin import huaxin_trade_api @@ -24,8 +27,10 @@ if data.get("type") == 'set_target_codes': # [(代ç , æ¶é´æ³, ä»·æ ¼, æ»äº¤æé, æ»äº¤æé¢, ä¹°5, å5)] market_data_list = data["data"]["data"] strategy_manager.low_suction_strtegy.add_ticks(market_data_list) RealTimeEnvInfo().ticks = (tool.get_now_time_str(), len(market_data_list)) except: except Exception as e: logger_debug.exception(e) time.sleep(0.1) queue_l1_w_strategy_r: multiprocessing.Queue = multiprocessing.Queue() @@ -50,6 +55,12 @@ # -----å¯å¨data_server----- threading.Thread(target=lambda: data_server.run("127.0.0.1", 9008), daemon=True).start() # å¯å¨æ¬å°æ¥å¿ threading.Thread(target=lambda: async_log_util.run_sync(), daemon=True).start() # å¯å¨redis忥 threading.Thread(target=lambda: RedisUtils.run_loop(), daemon=True).start() # --------å¯å¨æ¬å°APIæ¥å£---------- manager = ApiCommandManager(middle_api_protocol.SERVER_HOST, middle_api_protocol.SERVER_PORT, outside_api_callback.MyAPICallback()) manager.run(blocking=False) server/data_server.py
@@ -5,6 +5,7 @@ from http.server import BaseHTTPRequestHandler from log_module.log import logger_system, logger_debug, logger_request_api from strategy import strategy_manager from utils import tool from log_module import async_log_util @@ -36,21 +37,27 @@ path = self.path url = urlparse.urlparse(path) result_str = "" try: if url.path == "/upload_big_order_datas": # æ¥æ¶æäº¤å¤§åæ°æ® params = self.__parse_request() logger_debug.info("upload_big_order_datas:{}", f"{params}") strategy_manager.low_suction_strtegy.add_big_orders(params) # logger_debug.info("upload_big_order_datas:{}", f"{params}") elif url.path == "/upload_block_in_datas": # æ¥æ¶æ¿åæµå ¥æ°æ® params = self.__parse_request() logger_debug.info("upload_block_in_datas:{}", f"{params}") strategy_manager.low_suction_strtegy.add_block_in(params) # logger_debug.info("upload_block_in_datas:{}", f"{params}") result_str = json.dumps({"code": 0}) elif url.path == "upload_limit_up_list": elif url.path == "/upload_limit_up_list": params = self.__parse_request() logger_debug.info("upload_limit_up_list:{}", f"{params}") strategy_manager.low_suction_strtegy.add_limit_up_list(params) # logger_debug.info("upload_limit_up_list:{}", f"{params}") result_str = json.dumps({"code": 0}) else: pass except Exception as e: logger_debug.exception(e) self.__send_response(result_str) def __send_response(self, data): strategy/strategy_manager.py
New file @@ -0,0 +1,388 @@ """ çç¥ç®¡ç """ import json from code_attribute import gpcode_manager, code_nature_analyse from db import redis_manager_delegate as redis_manager from db.mysql_data_delegate import Mysqldb from db.redis_manager_delegate import RedisUtils from strategy.data_analyzer import KPLLimitUpDataAnalyzer from strategy.low_suction_strategy import LowSuctionOriginDataExportManager from strategy.strategy_params_settings import StrategyParamsSettingsManager from strategy.strategy_variable import StockVariables from strategy.strategy_variable_factory import DataLoader, StrategyVariableFactory import constant from third_data import kpl_util from trade.trade_manager import DealCodesManager from utils import huaxin_util, tool @tool.singleton class TickSummaryDataManager: """ Tickæ¦è¦æ°æ® """ __db = 13 # æäº¤ä»£ç ç订åä¿¡æ¯ï¼{代ç :{交æid:(éï¼ä»·æ ¼ï¼ç³»ç»è®¢åå·)}} def __init__(self): # å¼çä»·ä¿¡æ¯ self.open_price_info_dict = {} # æä½ä»· self.low_price_dict = {} # æé«ä»· self.high_price_info_dict = {} self.musql = Mysqldb() self.redis_manager = redis_manager.RedisManager(self.__db) self.__load_data() def __get_redis(self): return self.redis_manager.getRedis() def __load_data(self): keys = RedisUtils.keys(self.__get_redis(), "tick_open_price_info-*") if keys: for k in keys: code = k.split("-")[1] val = RedisUtils.get(self.__get_redis(), k) if val: self.open_price_info_dict[code] = json.loads(val) keys = RedisUtils.keys(self.__get_redis(), "tick_high_price-*") if keys: for k in keys: code = k.split("-")[1] val = RedisUtils.get(self.__get_redis(), k) if val: self.high_price_info_dict[code] = json.loads(val) keys = RedisUtils.keys(self.__get_redis(), "tick_low_price-*") if keys: for k in keys: code = k.split("-")[1] val = RedisUtils.get(self.__get_redis(), k) if val: self.low_price_dict[code] = round(float(val)) def set_open_price_info(self, code, info): """ 设置å¼çä¿¡æ¯ @param code: @param info: @return: """ self.open_price_info_dict[code] = info RedisUtils.setex_async(self.__db, f"tick_open_price_info-{code}", tool.get_expire(), json.dumps(info)) def set_high_price_info(self, code, info): """ 设置æé«ä»· @param code: @param info:(ä»·æ ¼, æ¶é´) @return: """ self.high_price_info_dict[code] = info RedisUtils.setex_async(self.__db, f"tick_high_price-{code}", tool.get_expire(), json.dumps(info)) def set_low_price(self, code, price): """ 设置æä½ä»· @param code: @param price: @return: """ self.low_price_dict[code] = price RedisUtils.setex_async(self.__db, f"tick_low_price-{code}", tool.get_expire(), price) class LowSuctionStrategy: """ ä½å¸çç¥ """ def __init__(self, day, script_name="ä½å¸èæ¬_辨è¯åº¦_v6.py", settings=StrategyParamsSettingsManager().get_settings()): self.now_day = day # 买大åï¼{代ç :[大忰æ®]} self.big_order_buy = {} # å大å self.big_order_sell = {} # èªç±æµéé self.zylt_volume_dict = {} # å岿¥Kæ°æ® self.kline_data = {} # å岿¶¨åæ°æ® self.limit_up_record_data = {} # å岿°æ® self.timeline_data = {} # 仿¥æ°æ® self.current_data = {} # ç®æ 代ç çæ¿å self.code_plates_for_buy = {} # 代ç çæ¿åï¼å¸¸è§ï¼ self.code_plates = {} # ä¸ä¸ä¸ªäº¤ææ¥ self.next_trade_day = None # ç®æ 代ç self.fcodes = set() # åé对象 self.stock_variables_dict = {} # å½å涨åå表 self.current_limit_up_list = [] # å½å涨åçæ¿åæå å«ç代ç self.current_limit_up_plate_codes = {} # å½åæ¿ååæµå ¥ self.current_block_in_datas = [] # å è½½çç¥èæ¬æä»¶ with open(script_name, mode='r', encoding='utf-8') as f: lines = f.readlines() scripts = "\n".join(lines) # 注éæéé¢çimportä¸åé scripts = scripts.replace("from ", "#from ").replace("sv = ", "#sv = ").replace("settings = ", "#settings = ").replace( "target_code = ", "#target_code = ") self.scripts = scripts self.settings = settings self.data_loader = DataLoader(self.now_day, cache_path=f"{constant.get_path_prefix()}/datas") self.__LowSuctionOriginDataExportManager = LowSuctionOriginDataExportManager(self.now_day) self.load_data() def load_data(self): # å è½½å岿°æ® self.__load_before_date_data_by_timeline() self.__load_current_date_data_by_timeline() self.fcodes = set(self.code_plates_for_buy.keys()) & set(self.kline_data.keys()) def __load_before_date_data_by_timeline(self): """ å è½½åæµæ¥æä¹åçKçº¿æ°æ®ä¸å岿¶¨åæ°æ® :return: ææ¶é´æåºçæ°æ®å表 """ trade_days = self.data_loader.trade_days # å è½½å岿°æ® self.kline_data = self.data_loader.load_kline_data() self.limit_up_record_data = self.data_loader.load_limit_up_data() self.next_trade_day = self.data_loader.load_next_trade_day() if not trade_days: raise Exception("äº¤ææ¥åè·å失败") if not self.kline_data: raise Exception("å岿¥Kè·å失败") if not self.limit_up_record_data: raise Exception("å岿¶¨åè·å失败") def __load_current_date_data_by_timeline(self): """ å è½½åæµæ¥æå½å¤©çæ°æ®ï¼å°è¿äºæ°æ®æ ¹æ®ç§åç :param day: æ¥æï¼æ ¼å¼ä¸º"YYYY-MM-DD :return: ææ¶é´æåºçæ°æ®å表 """ IS_BY_BIG_ORDER = False BIG_ORDER_MONEY_THRESHOLD = 200e4 big_order_deals = self.__LowSuctionOriginDataExportManager.export_big_order_deal(BIG_ORDER_MONEY_THRESHOLD) if not big_order_deals or IS_BY_BIG_ORDER: big_order_deals = self.__LowSuctionOriginDataExportManager.export_big_order_deal_by( BIG_ORDER_MONEY_THRESHOLD) self.big_order_buy = big_order_deals # è½¬æ¢æ ¼å¼ä¸ºï¼{æ¶é´: [("代ç ", (ä¹°åå·, é, éé¢, æ¶é´, æç»æäº¤ä»·))] big_sell_order_deals = self.__LowSuctionOriginDataExportManager.export_big_sell_order_deal( BIG_ORDER_MONEY_THRESHOLD) if not big_sell_order_deals or IS_BY_BIG_ORDER: big_sell_order_deals = self.__LowSuctionOriginDataExportManager.export_big_sell_order_deal_by( BIG_ORDER_MONEY_THRESHOLD) self.big_order_sell = big_sell_order_deals # å è½½èªç±æµéé self.zylt_volume_dict = self.__LowSuctionOriginDataExportManager.export_zylt_volume() # å è½½æ¿å代ç code_plates_dict = self.__LowSuctionOriginDataExportManager.export_code_plates() plate_codes = self.data_loader.load_target_plate_and_codes() code_plates_dict_for_buy = {} for p in plate_codes: for code in plate_codes.get(p): if code not in code_plates_dict_for_buy: code_plates_dict_for_buy[code] = set() code_plates_dict_for_buy[code].add(p) self.code_plates_for_buy = code_plates_dict_for_buy self.code_plates = code_plates_dict if not self.zylt_volume_dict: raise Exception("æ èªç±æµéæ°æ®") if not self.code_plates: raise Exception("æ æ¿åæ°æ®") if not self.code_plates_for_buy: raise Exception("æ ç®æ 票çä¹°å ¥æ°æ®") def __init_stock_variables(self, code_): """ åå§ååé @param code_: @return: """ if code_ in self.stock_variables_dict: return stock_variables = StrategyVariableFactory.create_from_history_data( self.kline_data.get(code_), None, self.limit_up_record_data.get(code_), self.data_loader.trade_days) # å è½½ä»æ¥æ¶¨åä»· pre_close = self.kline_data.get(code_)[0]["close"] stock_variables.仿¥æ¶¨åä»· = round(float(gpcode_manager.get_limit_up_price_by_preprice(code_, pre_close)), 2) stock_variables.èªç±æµéå¸å¼ = self.zylt_volume_dict.get(code_) * pre_close # è·åä»£ç æ¿å stock_variables.ä»£ç æ¿å = self.code_plates_for_buy.get(code_) is_price_too_high = code_nature_analyse.is_price_too_high_in_days(code_, self.kline_data.get(code_), stock_variables.仿¥æ¶¨åä»·) stock_variables.å ä¸ªäº¤ææ¥æ¶¨å¹ è¿é« = is_price_too_high[0] stock_variables.辨è¯åº¦ä»£ç = self.fcodes for day in [2, 5, 10, 30, 60, 120]: days = self.data_loader.trade_days[:day] stock_variables.__setattr__(f"æ¥åºç°çæ¿å_{day}", KPLLimitUpDataAnalyzer.get_limit_up_reasons( self.limit_up_record_data, min_day=days[-1], max_day=days[0])) stock_variables.è¿ç»è颿 = KPLLimitUpDataAnalyzer.get_continuous_limit_up_reasons( self.limit_up_record_data, self.data_loader.trade_days[:2]) # å è½½Tickä¿¡æ¯ open_price_info = TickSummaryDataManager().open_price_info_dict.get(code_) if open_price_info: stock_variables.仿¥å¼çä»· = open_price_info[0] stock_variables.仿¥å¼çæ¶¨å¹ = open_price_info[1] high_price_info = TickSummaryDataManager().high_price_info_dict.get(code_) if high_price_info: stock_variables.仿¥æé«ä»·ä¿¡æ¯ = high_price_info low_price = TickSummaryDataManager().low_price_dict.get(code_) if low_price: stock_variables.仿¥æä½ä»· = low_price self.stock_variables_dict[code_] = stock_variables def add_big_orders(self, big_orders): """ æ·»å 大å @param big_orders: [(代ç , ä¹°/å, [订åå·,é,éé¢,æåæ¶é´æ³,æåä»·æ ¼, åå§æ¶é´æ³, åå§ä»·æ ¼])] å¦ï¼[ ('002741', 0, [475820, 91600, 1610328, 92500000, 17.58, 92500000, 17.58])] @return: """ for d in big_orders: code = d[0] if d[1] == 0: # ä¹°å if code not in self.big_order_buy: self.big_order_buy[code] = [] self.big_order_buy[code].append(d[2]) else: # åå if code not in self.big_order_sell: self.big_order_sell[code] = [] self.big_order_sell[code].append(d[2]) # 驱å¨ä¸å def add_ticks(self, ticks): """ æ·»å tickæ°æ® @param ticks: @return: """ fticks = [tick for tick in ticks if tick[0] in self.fcodes] # åå§å对象 for tick in fticks: code = tick[0] self.__init_stock_variables(code) stock_variables = self.stock_variables_dict.get(code) # (代ç , æ¶é´æ³, ä»·æ ¼, æ»äº¤æé, æ»äº¤æé¢, ä¹°5, å5) code, time_str, price, cum_volume, cum_amount, buy_5 = tick[0], huaxin_util.convert_time(tick[1]), tick[2], \ tick[ 3], tick[4], tick[5] # 计ç®tickæ°æ®çå¼ if time_str < '09:30:00': if price > 0: stock_variables.仿¥å¼çä»· = price else: stock_variables.仿¥å¼çä»· = buy_5[0][0] # 仿¥å¼çæ¶¨å¹ stock_variables.仿¥å¼çæ¶¨å¹ = round((stock_variables.仿¥å¼çä»· - stock_variables.æ¨æ¥æ¶çä»·) / stock_variables.æ¨æ¥æ¶çä»·, 4) TickSummaryDataManager().set_open_price_info(code, (stock_variables.仿¥å¼çä»·, stock_variables.仿¥å¼çæ¶¨å¹ )) stock_variables.仿¥æäº¤é = cum_volume stock_variables.仿¥æäº¤é¢ = cum_amount stock_variables.å½åä»· = price if not stock_variables.仿¥æé«ä»·ä¿¡æ¯ or price > stock_variables.仿¥æé«ä»·ä¿¡æ¯[0]: stock_variables.仿¥æé«ä»·ä¿¡æ¯ = (price, time_str) TickSummaryDataManager().set_high_price_info(code, stock_variables.仿¥æé«ä»·ä¿¡æ¯) if not stock_variables.仿¥æä½ä»· or price < stock_variables.仿¥æä½ä»·: stock_variables.仿¥æä½ä»· = price TickSummaryDataManager().set_low_price(code, stock_variables.仿¥æä½ä»·) def add_limit_up_list(self, limit_up_list): """ 涨ååè¡¨æ°æ® @param limit_up_list: @return: """ self.current_limit_up_list = limit_up_list current_limit_up_list = [x for x in limit_up_list if kpl_util.get_high_level_count(x[4]) < 3] most_real_kpl_plate_limit_up_codes_info = {} current_limit_up_dict = {x[0]: x for x in current_limit_up_list} codes = set(current_limit_up_dict.keys()) for code in codes: plates = self.code_plates.get(code) if not plates: plates = {current_limit_up_dict.get(code)[5]} plates -= constant.KPL_INVALID_BLOCKS if plates: for p in plates: if p not in most_real_kpl_plate_limit_up_codes_info: most_real_kpl_plate_limit_up_codes_info[p] = [] most_real_kpl_plate_limit_up_codes_info[p].append(code) self.current_limit_up_plate_codes = most_real_kpl_plate_limit_up_codes_info def add_block_in(self, block_in_datas): """ æ·»å æ¿ååæµå ¥ @param block_in_datas: @return: """ blocks = [x[0] for x in block_in_datas if x[1] > 0] _block_in_datas = blocks[:20] self.current_block_in_datas = _block_in_datas def __run(self, code, sv: StockVariables): # è¿è¡ä»£ç # æ³¨å ¥å¤§å sv.仿¥å¤§åæ°æ® = self.big_order_buy.get(code) sv.仿¥åå¤§åæ°æ® = self.big_order_sell.get(code) # æ³¨å ¥æ¿å涨å代ç sv.å¼çå¦ææ£æ¿å涨å = self.current_limit_up_plate_codes # æ³¨å ¥æ¿åæµå ¥ä¿¡æ¯ if self.current_block_in_datas: sv.èµéæµå ¥æ¿å = self.current_block_in_datas # æ³¨å ¥å·²æäº¤ä»£ç place_order_plate_codes = DealCodesManager().get_place_order_plate_codes() sv.æ¿åæäº¤ä»£ç = place_order_plate_codes sv.æäº¤ä»£ç = DealCodesManager().get_deal_codes() global_dict = { "sv": sv, "target_code": code, "settings": self.settings } exec(self.scripts, global_dict) compute_result = global_dict["compute_result"] if compute_result[0]: if code in sv.æäº¤ä»£ç : return # å¯ä»¥ä¸å # 夿æ¯å¦å¯ä»¥ä¹° for b in compute_result[3]: DealCodesManager().place_order(b, code) # å½åçä½å¸çç¥å¯¹è±¡ low_suction_strtegy = LowSuctionStrategy(tool.get_now_date_str()) strategy/strategy_params_settings.py
@@ -19,7 +19,7 @@ # ä¹°å ¥éé¢ self.buy_money = 2000 # æå¤§ä¹°å ¥ç¥¨çæ°é self.max_buy_codes_count = 10 self.max_buy_codes_count = 100 # ä»·æ ¼åºé´ self.price_range = (3, 60) # èé¢ææ¶¨åæ° @@ -50,12 +50,12 @@ self.count_of_open_limit_up = 3 # æ¯å¦å¯ä¹°å䏿¿ self.can_buy_ge_code = True # èªç±å¸å¼èå´ self.zyltgb_range = (10e8, 300e8) # èªç±å¸å¼èå´(åä½ä¸ºäº¿) self.zyltgb_range = (10, 300) # æ¯å¦å¯ä¹°ä»æ¥æ¶¨åè¿ç票 self.can_buy_limited_up = False # æä½å¼çæ¶¨å¹ self.min_open_rate = 0.00001 self.min_open_rate = -3 # å¯ä¹°çæ¶¨å¹ æ¯ä¾ self.avaiable_rates = (-0.03, 0.07) # 仿¥æ¶¨åä»·éçªç ´XXæ¥æé«ä»·,Noneè¡¨ç¤ºæ¤æ¡æ°æ®ä¸çæ strategy/strategy_variable.py
@@ -205,6 +205,7 @@ # æ¿åæäº¤ä»£ç ï¼{"æ¿å":{"代ç 1","代ç 2"}} self.æ¿åæäº¤ä»£ç = {} self.æäº¤ä»£ç = set() # æµå ¥æ¿å self.èµéæµå ¥æ¿å = [] strategy/strategy_variable_factory.py
@@ -235,10 +235,10 @@ results = [x for x in results if (tool.is_can_buy_code(x[0]) and x[0] in valid_codes and x[0] not in exclude_codes)] # åå1/3䏿¶¨åæ°æ¯å10 # max_count = len(results) // 3 if len(results) % 3 == 0 else len(results) // 3 + 1 # results = results[:max_count] # # åå10 # results = results[:10] max_count = len(results) // 2 if len(results) % 2 == 0 else len(results) // 2 + 1 results = results[:max_count] # åå10 results = results[:10] codes = [x[0] for x in results] fresults[kpl_util.filter_block(b)] = codes return fresults @@ -637,7 +637,7 @@ if __name__ == "__main__": __DataLoader = DataLoader("2025-06-09") __DataLoader = DataLoader("2025-06-12") # __test_jx_blocks(__DataLoader) # instance = StockVariables() @@ -653,7 +653,9 @@ # print(result_dict["301279"]) results = __DataLoader.load_target_plate_and_codes() plates = ["å»è¯"] # for k in results: # print(k, results[k]) plates = ["汽车é¶é¨ä»¶", "ç¨åæ°¸ç£", "åå·¥", "å»è¯", "å ä¼"] print("==========æ°é¢æ=======") for p in plates: print(p, results.get(p)) strategy/test.py
@@ -1,3 +1,4 @@ from strategy import strategy_manager from strategy.strategy_variable import StockVariables @@ -18,8 +19,10 @@ if __name__ == "__main__": print("======3个票涨åä¹åä¹°+å¼çä»·>=-3") statistic_average(r"C:\Users\Administrator\Desktop\3个票涨åä¹åä¹°.txt") print("======3个票涨åä¹åä¹°+ä¸éå¼çæ¶¨å¹ +3个涨åä¹å大忿") statistic_average(r"C:\Users\Administrator\Desktop\3个票涨åä¹åä¹°_ä¸éå¼çæ¶¨å¹ .txt") # print("======3个票涨åä¹åä¹°+å¼çä»·>=-3") # statistic_average(r"C:\Users\Administrator\Desktop\3个票涨åä¹åä¹°.txt") # print("======3个票涨åä¹åä¹°+ä¸éå¼çæ¶¨å¹ +3个涨åä¹å大忿") # statistic_average(r"C:\Users\Administrator\Desktop\3个票涨åä¹åä¹°_ä¸éå¼çæ¶¨å¹ .txt") strategy_manager.low_suction_strtegy strategy/time_series_backtest.py
@@ -586,8 +586,8 @@ if ticks: for tick in ticks: code = tick["symbol"][-6:] # if code not in self.fcodes: # continue if code not in self.fcodes: continue if DEBUG_CODES and code not in DEBUG_CODES: continue @@ -648,9 +648,11 @@ if not stock_variables.仿¥æä½ä»· or tick["price"] < stock_variables.仿¥æä½ä»·: stock_variables.仿¥æä½ä»· = tick["price"] if most_real_kpl_plate_limit_up_codes_info: stock_variables.å¼çå¦ææ£æ¿å涨å = most_real_kpl_plate_limit_up_codes_info # if time_str >= '09:30:00': # if stock_variables.仿¥å¤§åæ°æ® and stock_variables.å¼çå¦ææ£æ¿å涨å and max( # [len(stock_variables.å¼çå¦ææ£æ¿å涨å.get(x, [])) for x in stock_variables.ä»£ç æ¿å]) >= 3: # compute_result = self.__run_backtest(code, stock_variables) # self.__process_test_result(code, stock_variables, next_trade_day, stock_variables.å½åä»·, # time_str, compute_result) @@ -766,7 +768,7 @@ stock_variables.æ¿åæäº¤ä»£ç = self.deal_block_codes # DEBUG_CODES = ['002365', '000953', '002907', '002688', '003020', '002900', '002082', '000566', '300204', '002317'] # DEBUG_CODES = ['603040', '603758', '603286', '603586', '605255', '002048', '605208', '002806', '603266', '603788'] DEBUG_CODES = [] VOLUME_LOG_ENABLE = False @@ -775,7 +777,7 @@ DEBUG_BLOCKS = [] BIG_ORDER_MONEY_THRESHOLD = 200e4 BIG_ORDER_MONEY_THRESHOLD = 100e4 if __name__ == "__main__": back_test_dict = {} @@ -783,7 +785,11 @@ # "2025-05-15", "2025-05-16", "2025-05-19", "2025-05-20", "2025-05-21", "2025-05-22"] days = ["2025-05-12", "2025-05-13", "2025-05-14", "2025-05-15", "2025-05-16", "2025-05-19", "2025-05-20", "2025-05-21", "2025-05-22", "2025-05-23", "2025-05-26", "2025-05-27", "2025-05-28", "2025-05-29", "2025-05-30", "2025-06-03", "2025-06-04", "2025-06-05", "2025-06-06", "2025-06-09", "2025-06-10"] "2025-05-30", "2025-06-03", "2025-06-04", "2025-06-05", "2025-06-06", "2025-06-09", "2025-06-10", "2025-06-11", "2025-06-12"] # days = ["2025-06-09"] days.reverse() for day in days: if day not in back_test_dict: strategy/µÍÎü½Å±¾_±æÊ¶¶È_v6.py
@@ -85,7 +85,7 @@ if rate >= settings.avaiable_rates[1] or rate < settings.avaiable_rates[0]: return False, f"æ¶¨å¹ ä¸å¨åºé´å ï¼{settings.avaiable_rates[0]}-{settings.avaiable_rates[1]}ï¼:{rate}" if sv.èªç±æµéå¸å¼ > settings.zyltgb_range[1] or sv.èªç±æµéå¸å¼ < settings.zyltgb_range[0]: if sv.èªç±æµéå¸å¼ > settings.zyltgb_range[1] * 1e8 or sv.èªç±æµéå¸å¼ < settings.zyltgb_range[0] * 1e8: return False, f"èªç±å¸å¼ï¼{sv.èªç±æµéå¸å¼}ï¼ä¸æ»¡è¶³è¦æ±" if sv.å ä¸ªäº¤ææ¥æ¶¨å¹ è¿é«: @@ -111,11 +111,12 @@ # ç®æ 票æ¿å涨å个æ°>=2 if sv.æ¿åæäº¤ä»£ç : can_buy_plates -= set(sv.æ¿åæäº¤ä»£ç .keys()) # æ¿ååªè½ä¹°å ¥ä¸ä¸ªä»£ç # if sv.æ¿åæäº¤ä»£ç : # can_buy_plates -= set(sv.æ¿åæäº¤ä»£ç .keys()) if not can_buy_plates: return False, "æ²¡ææ¶¨åçæ¿å" return False, f"æ²¡ææ¶¨åçæ¿å: {[(plate, sv.å¼çå¦ææ£æ¿å涨å.get(plate)) for plate in sv.ä»£ç æ¿å if sv.å¼çå¦ææ£æ¿å涨å]} è¿ç»è颿ï¼{sv.è¿ç»è颿}" # new_plates = set(can_buy_plates) - sv.æ¥åºç°çæ¿å_2 # if new_plates: # # ææ°é¢æï¼å¤ææ¯å¦è¿æ¨æ¥åé« @@ -137,7 +138,7 @@ if sv.仿¥å¤§åæ°æ®: # print(sv.仿¥å¤§åæ°æ®[-1][3], format_time(sv.仿¥å¤§åæ°æ®[-1][3])) # filter_orders = [(o[0], o[2]) for o in sv.仿¥å¤§åæ°æ® if format_time(o[3]) >= sv.仿¥éå¤ä¿¡æ¯[0]] filter_orders = [(o[0], o[2]) for o in sv.仿¥å¤§åæ°æ®] filter_orders = [(o[0], o[2]) for o in sv.仿¥å¤§åæ°æ® if o[2] >= 200e4] filter_orders.reverse() orderids = set() for o in filter_orders: @@ -145,19 +146,34 @@ continue orderids.add(o[0]) big_order_money += o[1] big_sell_order_money = 0 if sv.仿¥å大忰æ®: filter_orders = [(o[0], o[2]) for o in sv.仿¥åå¤§åæ°æ® if o[2] >= 200e4] filter_orders.reverse() orderids = set() for o in filter_orders: if o[0] in orderids: continue orderids.add(o[0]) big_sell_order_money += o[1] threshold_money = max(sv.èªç±æµéå¸å¼ // 1000, 200e4) limit_up_codes_count = max([(p, len(sv.å¼çå¦ææ£æ¿å涨å.get(p, []))) for p in can_buy_plates], key=lambda x: x[1])[1] threshold_money *= max(min(10 - limit_up_codes_count + 1, 10), 5) / 10 # threshold_money *= max(min(10 - limit_up_codes_count + 1, 10), 5) / 10 threshold_money *= 0.5 # print(target_code, sv.èªç±æµéå¸å¼, threshold_money, limit_up_codes_count) # threshold_money = 200e4 # int(sv.æ¨æ¥æäº¤é * 0.2 * sv.仿¥æ¶¨åä»· * 0.05) if big_order_money < threshold_money: return False, f"({big_order_money}/{threshold_money})大åéé¢ä¸è¶³" return True, f" \n\t大åä¿¡æ¯ï¼{big_order_money}/{threshold_money}\n\téå¤ä¿¡æ¯ï¼{sv.仿¥éå¤ä¿¡æ¯}\n\t仿¥æé«ä»·:{sv.仿¥æé«ä»·ä¿¡æ¯} \n\t5æ¥æé«ä»·ï¼{sv.æ¥æé«ä»·_5}", f"\n\tæ¿åä¿¡æ¯ï¼{[(p, sv.å¼çå¦ææ£æ¿å涨å.get(p)) for p in can_buy_plates]}", can_buy_plates final_big_order_money = big_order_money - big_sell_order_money if final_big_order_money < threshold_money: return False, f"({round(final_big_order_money / 1e4, 2)}ä¸/{round(threshold_money / 1e4, 2)}ä¸)大åéé¢ä¸è¶³" return True, f" \n\t大åä¿¡æ¯ï¼{round(final_big_order_money / 1e4, 2)}ä¸ï¼ä¹°ï¼{round(big_order_money / 1e4, 2)}ä¸ åï¼{round(big_sell_order_money / 1e4, 2)}ä¸ï¼/{round(threshold_money / 1e4, 2)}ä¸ \n\téå¤ä¿¡æ¯ï¼{sv.仿¥éå¤ä¿¡æ¯}\n\t仿¥æé«ä»·:{sv.仿¥æé«ä»·ä¿¡æ¯} \n\t5æ¥æé«ä»·ï¼{sv.æ¥æé«ä»·_5}", f"\n\tæ¿åä¿¡æ¯ï¼{[(p, sv.å¼çå¦ææ£æ¿å涨å.get(p)) for p in can_buy_plates]}", can_buy_plates compute_result = can_buy() third_data/history_k_data_manager.py
@@ -54,7 +54,7 @@ for code in codes: pre_close = HistoryKDataManager().get_pre_close(code, day) if pre_close is not None: gpcode_manager.CodePrePriceManager.set_price_pre(code, pre_close, force) gpcode_manager.CodePrePriceManager().set_price_pre(code, pre_close, force) else: not_codes.append(code) if not_codes: trade/huaxin/huaxin_trade_data_update.py
@@ -65,13 +65,12 @@ logger_debug.exception(e) huaxin_trade_record_manager.DealRecordManager.add(datas) if datas: tempList = [ {"time": d["tradeTime"], "type": int(d['direction']), "code": d['securityID']} for d in datas] try: trade_manager.process_trade_success_data(tempList) except Exception as e: logging.exception(e) for d in datas: if str(d['direction']) != str(huaxin_util.TORA_TSTP_D_Buy): continue trade_manager.DealCodesManager().add_deal_order(d['securityID'], d['volume'], d['price'], d["tradeID"], d["orderSysID"]) # æä»è¡ elif type_ == "position_list": dataJSON = huaxin_trade_api.get_position_list() trade/trade_manager.py
@@ -4,12 +4,14 @@ """ # 交æç®¡çå¨ import copy import json from code_attribute import gpcode_manager from db import redis_manager_delegate as redis_manager from db.mysql_data_delegate import Mysqldb from db.redis_manager_delegate import RedisUtils from log_module import async_log_util from trade import trade_constant from log_module.log import * from utils import import_util, tool, huaxin_util @@ -163,6 +165,83 @@ # 设置交æè´¦æ·çå¯ç¨éé¢ @tool.singleton class DealCodesManager: """ æäº¤ä»£ç 管ç """ __db = 12 # æäº¤ä»£ç ç订åä¿¡æ¯ï¼{代ç :{交æid:(éï¼ä»·æ ¼ï¼ç³»ç»è®¢åå·)}} def __init__(self): self.musql = Mysqldb() self.__deal_code_orders_info = {} self.redis_manager = redis_manager.RedisManager(12) # ä¸è¿åçæ¿å代ç self.__place_order_plate_codes_info = {} self.__load_data() def __get_redis(self): return self.redis_manager.getRedis() def __load_data(self): # ä¸ç®ææ¿çæ°æ® sql = f"select tradeID,securityID, orderSysID,price,volume from hx_trade_deal_record where `direction` = '0' and tradingDay = '{tool.get_now_date_str('%Y%m%d')}'" results = self.musql.select_all(sql) if results: 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: @param trade_id: @param order_sys_id: @return: """ pre_price = gpcode_manager.CodePrePriceManager().get_price_pre_cache(code) if pre_price and round((price - pre_price) / pre_price, 4) > 0.08 * (tool.get_limit_up_rate(code) - 1) * 10: # è§ä¸ºææ¿ä¹°å ¥ï¼ä¸å¤çæ°æ® return if code not in self.__deal_code_orders_info: self.__deal_code_orders_info[code] = {} if trade_id in self.__deal_code_orders_info[code]: return self.__deal_code_orders_info[code][trade_id] = (volume, price, order_sys_id) 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): """ ä¸å @param plate: @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) 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): return self.__place_order_plate_codes_info __CodesTradeStateManager = CodesTradeStateManager() if __name__ == "__main__": codes = DealCodesManager().get_codes() print(codes) utils/init_data_util.py
@@ -19,7 +19,7 @@ symbol = item['symbol'] symbol = symbol.split(".")[1] pre_close = tool.to_price(decimal.Decimal(str(item['pre_close']))) gpcode_manager.CodePrePriceManager.set_price_pre(symbol, pre_close, force) gpcode_manager.CodePrePriceManager().set_price_pre(symbol, pre_close, force) # è·åè¿90天çæå¤§é䏿è¿çé