| | |
| | | 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 = {} |
| | |
| | | # 读åå
åä¸çå¼ |
| | | 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))) |
| | |
| | | |
| | | # è·åè·åä»· |
| | | 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)}")) |
| | |
| | | |
| | | 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 |
| | |
| | | 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() |
| | |
| | | # -----å¯å¨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) |
| | |
| | | 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 |
| | |
| | | path = self.path |
| | | url = urlparse.urlparse(path) |
| | | result_str = "" |
| | | if url.path == "/upload_big_order_datas": |
| | | # æ¥æ¶æäº¤å¤§åæ°æ® |
| | | params = self.__parse_request() |
| | | 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}") |
| | | result_str = json.dumps({"code": 0}) |
| | | elif url.path == "upload_limit_up_list": |
| | | params = self.__parse_request() |
| | | logger_debug.info("upload_limit_up_list:{}", f"{params}") |
| | | result_str = json.dumps({"code": 0}) |
| | | else: |
| | | pass |
| | | try: |
| | | if url.path == "/upload_big_order_datas": |
| | | # æ¥æ¶æäº¤å¤§åæ°æ® |
| | | params = self.__parse_request() |
| | | 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() |
| | | 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": |
| | | params = self.__parse_request() |
| | | 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): |
New file |
| | |
| | | """ |
| | | çç¥ç®¡ç |
| | | """ |
| | | 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()) |
| | |
| | | # ä¹°å
¥éé¢ |
| | | self.buy_money = 2000 |
| | | # æå¤§ä¹°å
¥ç¥¨çæ°é |
| | | self.max_buy_codes_count = 10 |
| | | self.max_buy_codes_count = 100 |
| | | # ä»·æ ¼åºé´ |
| | | self.price_range = (3, 60) |
| | | # èé¢ææ¶¨åæ° |
| | |
| | | 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è¡¨ç¤ºæ¤æ¡æ°æ®ä¸çæ |
| | |
| | | # 彿¥æ¿åï¼{"æ¿å1","æ¿å2"} |
| | | self.ä»£ç æ¿å = None |
| | | self.æ°ä»£ç æ¿å = None |
| | | self.代ç ç²¾éæ¿å=None |
| | | self.代ç ç²¾éæ¿å = None |
| | | |
| | | # æ¿åæäº¤ä»£ç ï¼{"æ¿å":{"代ç 1","代ç 2"}} |
| | | self.æ¿åæäº¤ä»£ç = {} |
| | | self.æäº¤ä»£ç = set() |
| | | |
| | | # æµå
¥æ¿å |
| | | self.èµéæµå
¥æ¿å = [] |
| | |
| | | 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 |
| | |
| | | |
| | | |
| | | if __name__ == "__main__": |
| | | __DataLoader = DataLoader("2025-06-09") |
| | | __DataLoader = DataLoader("2025-06-12") |
| | | # __test_jx_blocks(__DataLoader) |
| | | |
| | | # instance = StockVariables() |
| | |
| | | # 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)) |
| | |
| | | from strategy import strategy_manager |
| | | from strategy.strategy_variable import StockVariables |
| | | |
| | | |
| | |
| | | |
| | | |
| | | 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 |
| | | |
| | | |
| | |
| | | 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 |
| | | |
| | |
| | | |
| | | if not stock_variables.仿¥æä½ä»· or tick["price"] < stock_variables.仿¥æä½ä»·: |
| | | stock_variables.仿¥æä½ä»· = tick["price"] |
| | | |
| | | stock_variables.å¼çå¦ææ£æ¿å涨å = most_real_kpl_plate_limit_up_codes_info |
| | | |
| | | # compute_result = self.__run_backtest(code, stock_variables) |
| | | # self.__process_test_result(code, stock_variables, next_trade_day, stock_variables.å½åä»·, |
| | | # time_str, compute_result) |
| | | 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) |
| | | |
| | | # if len(real_codes) >= 2 and time_str > '09:30:00': |
| | | # # print(time_str, plate) |
| | |
| | | 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 |
| | |
| | | |
| | | DEBUG_BLOCKS = [] |
| | | |
| | | BIG_ORDER_MONEY_THRESHOLD = 200e4 |
| | | BIG_ORDER_MONEY_THRESHOLD = 100e4 |
| | | |
| | | if __name__ == "__main__": |
| | | back_test_dict = {} |
| | |
| | | # "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: |
| | |
| | | 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.å
ä¸ªäº¤ææ¥æ¶¨å¹
è¿é«: |
| | |
| | | |
| | | # ç®æ 票æ¿å涨å个æ°>=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: |
| | | # # ææ°é¢æï¼å¤ææ¯å¦è¿æ¨æ¥åé« |
| | |
| | | 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: |
| | |
| | | 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() |
| | |
| | | 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: |
| | |
| | | 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() |
| | |
| | | """ |
| | | # 交æç®¡çå¨ |
| | | 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 |
| | |
| | | # 设置交æè´¦æ·çå¯ç¨éé¢ |
| | | |
| | | |
| | | @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) |
| | |
| | | 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天çæå¤§é䏿è¿çé |