| | |
| | | |
| | | # 是否是仿真交易 |
| | | IS_SIMULATED_TRADE = False |
| | | |
| | | check_plate_list = {'无', 'ST摘帽', 'ST板块', '超跌', '次新股', '北交所', '科创板', |
| | | '年报增长', '年报预增', '并购重组', '股权转让', '送转填权', '高送转', '壳资源', |
| | | '资产管理', '举牌', |
| | | '专用设备', '创投'} |
| | |
| | | from log_module import log_export, async_log_util |
| | | from log_module.log import hx_logger_l2_transaction, logger_debug, logger_request_api, logger_system |
| | | from strategy import data_cache |
| | | from strategy.forbidden_plates_manager import ForbiddenPlatesManager |
| | | from strategy.kpl_data_manager import KPLMarketsSiftPlateLogManager, KPLMarketStockHeatLogManager |
| | | from strategy.trade_setting import TradeSetting |
| | | from trade import huaxin_trade_api, huaxin_trade_data_update |
| | |
| | | # (距离09:15:00的秒数, 时间, 强度) |
| | | fdatas.append((tool.trade_time_sub(data[0], "09:15:00"), data[0], data[1])) |
| | | response_data = json.dumps({"code": 0, "data": fdatas}) |
| | | elif url.path == "/get_place_order_records": |
| | | datas = data_cache.purchased_stocks_details_list |
| | | response_data = json.dumps({"code": 0, "data": datas}) |
| | | elif url.path == "/get_forbidden_plates": |
| | | datas = ForbiddenPlatesManager().list_plates() |
| | | # human 认为设置 fixed: 固定的 |
| | | response_data = json.dumps( |
| | | {"code": 0, "data": {"human": list(datas), "fixed": list(constant.check_plate_list)}}) |
| | | elif url.path == "/add_forbidden_plate": |
| | | plate = params_dict.get("plate") |
| | | ForbiddenPlatesManager().add_plate(plate) |
| | | response_data = json.dumps({"code": 0, "data": {}}) |
| | | elif url.path == "/remove_forbidden_plate": |
| | | plate = params_dict.get("plate") |
| | | ForbiddenPlatesManager().remove_plate(plate) |
| | | response_data = json.dumps({"code": 0, "data": {}}) |
| | | elif url.path == "/get_market_sift_plate_stock_dict": |
| | | # 获取开盘啦板块精选流入 |
| | | data = data_cache.market_sift_plates |
| | | response_data = json.dumps({"code": 0, "data": data}) |
| | | |
| | | self.send_response(200) |
| | | # 发给请求客户端的响应数据 |
| | |
| | | daemon=True).start() |
| | | |
| | | # # 开盘啦的板块强度下的个股强度回调函数 |
| | | def get_market_sift_plate_its_stock_power_process(market_sift_plate_stock_dict): |
| | | def get_market_sift_plate_its_stock_power_process(market_sift_plate_info): |
| | | # print(f"回调成功===精选板块股票强度数据更新==={market_sift_plate_stock_dict}") |
| | | # logger_kpl_jingxuan_in.info(f"{market_sift_plate_stock_dict}") |
| | | market_sift_plate_stock_dict, market_sift_plates = market_sift_plate_info[0], market_sift_plate_info[1] |
| | | if market_sift_plate_stock_dict: |
| | | data_cache.market_sift_plate_stock_dict = market_sift_plate_stock_dict |
| | | data_cache.market_sift_plates = market_sift_plates |
| | | |
| | | # 板块强度下个股强度线程 |
| | | threading.Thread(target=plate_strength_analysis.get_market_sift_plate_its_stock_power_process, |
| | |
| | | # from datetime import time |
| | | # from datetime import timedelta |
| | | import time |
| | | |
| | | import constant |
| | | import utils.tool |
| | | from log_module import async_log_util |
| | | from log_module.log import logger_kpl_jingxuan_in, logger_common |
| | |
| | | from strategy import basic_methods |
| | | from strategy import account_management |
| | | from strategy import order_methods |
| | | from strategy.forbidden_plates_manager import ForbiddenPlatesManager |
| | | from strategy.order_methods import TodayBuyCodeManager |
| | | |
| | | from utils import tool, huaxin_util |
| | |
| | | # print(f"没有在概念缓存列表中找到:{symbol_to_search}。") |
| | | |
| | | # 声明要检查过滤不可用的概念板块名称常量 【代表着 是否有无概念及跟随概念的可能性(有明显个股独特增长特性的不可跟随,因为概念本身是宽泛的,许多不同概念的个股都有这个概念)】 |
| | | check_plate_list = {'无', 'ST摘帽', 'ST板块', '超跌', '次新股', '北交所', '科创板', |
| | | '年报增长', '年报预增', '并购重组', '股权转让', '送转填权', '高送转', '壳资源', |
| | | '资产管理', '举牌', |
| | | '专用设备', '创投'} |
| | | # check_plate_list = constant.check_plate_list | set(ForbiddenPlatesManager().list_plates()) |
| | | check_plate_list = constant.check_plate_list |
| | | |
| | | # 查询当前个股的代码是否在板块强度个股列表中(低吸优选目标) |
| | | strength_list_have_it = False # 是否有强度赋初值 |
| | |
| | | data_cache.bought_plate.extend(limit_up_plate_included_list) |
| | | logger_info( |
| | | f"【{k_line_data[0]['sec_name']}】交易成功!持仓集合:{data_cache.position_symbols_set}") |
| | | # 传给GUI显示 |
| | | purchased_stock_details = { |
| | | "name": k_line_data[0]['sec_name'], |
| | | "policy_name": "有概念有强度策略分支", |
| | |
| | | data_cache.bought_plate.extend(limit_up_plate_included_list) |
| | | logger_info( |
| | | f"【{k_line_data[0]['sec_name']}】交易成功!持仓集合:{data_cache.position_symbols_set}") |
| | | # 传给GUI显示 |
| | | purchased_stock_details = { |
| | | "name": k_line_data[0]['sec_name'], |
| | | "policy_name": "有概念无强度策略分支", |
| | | "plate_name": limit_up_plate_included, |
| | | "buy_time_trading_volume_ratio": ( |
| | | current_volume / k_line_data[0]['volume']), |
| | | } |
| | | data_cache.purchased_stocks_details_list.append(purchased_stock_details) |
| | | logger_info( |
| | | f"已成交股票详情列表:{data_cache.purchased_stocks_details_list} ") |
| | | ''' |
| | | 无概念 有强度视界 |
| | | ''' |
| | | if len(limit_up_plate_included) == 0: |
| | | # logger_info(f"【无概念】") |
| | | if len(limit_up_plate_included) == 0 or limit_up_plate_included.issubset( |
| | | check_plate_list) is True: |
| | | # logger_info(f"【无概念 或 概念在屏蔽概念组中】") |
| | | if strength_list_have_it is True: |
| | | logger_info( |
| | | f"【{k_line_data[0]['sec_name']}】--------------------------------------------------------------------------------------------------------[有强度视界]") |
| | |
| | | data_cache.bought_plate.extend(strength_plate) |
| | | logger_info( |
| | | f"【{k_line_data[0]['sec_name']}】交易成功!持仓集合:{data_cache.position_symbols_set}") |
| | | # 传给GUI显示 |
| | | purchased_stock_details = { |
| | | "name": k_line_data[0]['sec_name'], |
| | | "policy_name": "无概念有强度策略分支", |
| | | "plate_name": strength_plate, |
| | | "buy_time_trading_volume_ratio": ( |
| | | current_volume / k_line_data[0]['volume']), |
| | | } |
| | | data_cache.purchased_stocks_details_list.append( |
| | | purchased_stock_details) |
| | | logger_info( |
| | | f"已成交股票详情列表:{data_cache.purchased_stocks_details_list} ") |
| | | ''' |
| | | 无概念无强度 有小量换大涨幅度视界 |
| | | ''' |
| | |
| | | # stock.startswith('SHSE.60') or (stock.startswith('SZSE.00'))] |
| | | self.filtered_stocks = [stock['symbol'] for stock in self.all_stocks if |
| | | isinstance(stock.get('symbol'), str) and ( |
| | | stock['symbol'].startswith('SHSE.60') or stock['symbol'].startswith( |
| | | 'SZSE.00'))] |
| | | stock['symbol'].startswith('SHSE.60') or stock['symbol'].startswith( |
| | | 'SZSE.00'))] |
| | | # self.filtered_stocks = self.filtered_stocks[:10] |
| | | print(f"过滤后上证A股和深证A股数量filtered_stocks:{len(self.filtered_stocks)}") |
| | | # 声明一下需要拉取K线的列表 |
| | |
| | | limit_up_block_names = [] |
| | | # 初始化板块强度下的个股强度 |
| | | market_sift_plate_stock_dict = {} |
| | | # 精选流入板块 |
| | | market_sift_plates = [] |
| | | |
| | | # 初始化实时大盘行情市场情绪综合强度【完整】字典 |
| | | rise_and_fall_statistics_dirt = {} |
| | | # 初始化实时大盘行情情绪综合强度[分数] |
New file |
| | |
| | | """ |
| | | 黑名单板块管理 |
| | | """ |
| | | import json |
| | | |
| | | from db import redis_manager_delegate as redis_manager |
| | | from db.redis_manager_delegate import RedisUtils |
| | | from utils import tool |
| | | |
| | | |
| | | @tool.singleton |
| | | class ForbiddenPlatesManager: |
| | | def __init__(self): |
| | | self.forbidden_plates = [] |
| | | self.__db = 1 |
| | | self.__redisManager = redis_manager.RedisManager(self.__db) |
| | | self.__load_forbidden_plates() |
| | | |
| | | def __load_forbidden_plates(self): |
| | | plates = RedisUtils.get(self.__redisManager.getRedis(), "forbidden_plate_list") |
| | | if plates: |
| | | self.forbidden_plates = json.loads(plates) |
| | | |
| | | def add_plate(self, plate): |
| | | """ |
| | | 添加板块 |
| | | :param plate: |
| | | :return: |
| | | """ |
| | | if plate in self.forbidden_plates: |
| | | return |
| | | self.forbidden_plates.append(plate) |
| | | RedisUtils.setex_async(self.__db, "forbidden_plate_list",tool.get_expire(), json.dumps( self.forbidden_plates)) |
| | | |
| | | def remove_plate(self, plate): |
| | | """ |
| | | 移除板块 |
| | | :param plate: |
| | | :return: |
| | | """ |
| | | if plate not in self.forbidden_plates: |
| | | return |
| | | self.forbidden_plates.remove(plate) |
| | | RedisUtils.setex_async(self.__db, "forbidden_plate_list", tool.get_expire(), json.dumps(self.forbidden_plates)) |
| | | |
| | | def list_plates(self): |
| | | """ |
| | | 列出所有板块 |
| | | :return: |
| | | """ |
| | | return self.forbidden_plates |
| | | |
| | | def is_plate_forbidden(self, plate): |
| | | """ |
| | | 判断板块是否被禁止 |
| | | :param plate: |
| | | :return: |
| | | """ |
| | | return plate in self.forbidden_plates |
| | | |
| | | |
| | | if __name__ == '__main__': |
| | | print(ForbiddenPlatesManager().list_plates()) |
| | |
| | | |
| | | # 获取行情精选板块 强度排名 |
| | | def get_market_sift_plate_its_stock_power(): |
| | | """ |
| | | |
| | | :return: {板块:[代码信息]}, 精选流入板块 |
| | | """ |
| | | @dask.delayed |
| | | def batch_get_plate_codes(fs): |
| | | return fs |
| | |
| | | # 只在盘中时间获取 |
| | | KPLMarketStockHeatLogManager().add_log(market_sift_plate['list'], log_datas) |
| | | # 行情》精选板块》排名前20中》对应个股》符合条件的个股 |
| | | return market_sift_plate_stock_dict |
| | | return market_sift_plate_stock_dict, market_sift_plate.get("list",[]) |
| | | |
| | | |
| | | # 调用一下获取精选板块股票强度数据函数 【本模块内使用时调用】 |
| | |
| | | time_str = datetime.datetime.now().strftime("%H%M%S") |
| | | if 92900 < int(time_str) < 95000: |
| | | # logger_kpl_jingxuan_in 打印的日志专用于开盘了数据的存储分析,不能轻易删除 |
| | | logger_kpl_jingxuan_in.info(f"耗时:{time.time() - start_time} 数据:{its_stock_power}") |
| | | logger_kpl_jingxuan_in.info(f"耗时:{time.time() - start_time} 数据:{its_stock_power[0]}") |
| | | callback(its_stock_power) |
| | | # print(f"精选板块拉升个股更新===={its_stock_power}") |
| | | except Exception as e: |