Administrator
2025-02-07 7eb1a8ed1a007d80de41d131071ee38f5872700c
辨识度票策略修改/恢复P撤/上传订阅涨幅
9个文件已修改
164 ■■■■■ 已修改文件
l2/code_price_manager.py 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
l2/l2_data_manager_new.py 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
l2/l2_transaction_data_processor.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
servers/huaxin_trade_server.py 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
third_data/kpl_limit_up_data_manager.py 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
trade/buy_radical/block_special_codes_manager.py 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
trade/buy_radical/radical_buy_data_manager.py 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
trade/trade_constant.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/middle_api_protocol.py 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
l2/code_price_manager.py
@@ -2,8 +2,12 @@
代码价格管理
"""
import json
import threading
import time
from code_attribute.gpcode_manager import CodePrePriceManager
from db.redis_manager_delegate import RedisUtils
from utils import tool
from utils import tool, middle_api_protocol
from db import redis_manager_delegate as redis_manager
from log_module.log import logger_trade_queue_price_info
@@ -73,7 +77,6 @@
                                         (limit_up_time, open_limit_up_time))
        RedisUtils.setex_async(self.__db, f"buy1_price_limit_up_info-{code}", tool.get_expire(),
                               json.dumps((limit_up_time, open_limit_up_time)))
    def __get_buy1_price_limit_up_info_cache(self, code):
        cache_result = tool.CodeDataCacheUtil.get_cache(self.__buy1_price_limit_up_info_cache, code)
@@ -200,5 +203,34 @@
        return self.__latest_3m_buy1_money_list_dict.get(code)
class CurrentPriceManager:
    """
    现价管理
    """
    # 代码涨幅数据
    __current_rate_dict = {}
    # 最近上传时间
    __latest_upload_time = 0
    @classmethod
    def set_current_price(cls, code, price):
        """
        设置现价
        @param code:
        @param price:
        @return:
        """
        pre_close_price = CodePrePriceManager.get_price_pre_cache(code)
        if pre_close_price:
            rate = round((price - pre_close_price) * 100 / pre_close_price, 2)
            cls.__current_rate_dict[code] = rate
        # 判断是否要上传
        if time.time() - cls.__latest_upload_time >= 3:
            # 间隔3s上传
            cls.__latest_upload_time = time.time()
            threading.Thread(target=lambda: middle_api_protocol.request(
                middle_api_protocol.load_l2_subscript_codes_rate(cls.__current_rate_dict)), daemon=True).start()
if __name__ == "__main__":
    print(Buy1PriceManager().get_limit_up_info("002777"))
l2/l2_data_manager_new.py
@@ -816,11 +816,11 @@
            average_rate = cls.__Buy1PriceManager.get_average_rate(code)
            if average_rate :
                if tool.is_ge_code(code):
                    if average_rate <= 0.07:
                        return False, True, f"均价涨幅({average_rate})小于7%", True
                    if average_rate <= 0.1:
                        return False, True, f"均价涨幅({average_rate})小于10%", True
                else:
                    if average_rate <= 0.03:
                        return False, True, f"均价涨幅({average_rate})小于3%", True
                    if average_rate <= 0.05:
                        return False, True, f"均价涨幅({average_rate})小于5%", True
        return True, False, f"", False
    @classmethod
@@ -1307,13 +1307,13 @@
            # 是否是交易队列触发
            # 扫入下单只有L撤能撤单
            if order_begin_pos and order_begin_pos.mode == OrderBeginPosInfo.MODE_RADICAL and cancel_type not in {
                trade_constant.CANCEL_TYPE_L_DOWN, trade_constant.CANCEL_TYPE_L, trade_constant.CANCEL_TYPE_RD}:
                trade_constant.CANCEL_TYPE_L_DOWN, trade_constant.CANCEL_TYPE_L, trade_constant.CANCEL_TYPE_RD, trade_constant.CANCEL_TYPE_P}:
                l2_log.cancel_debug(code, "撤单中断,原因:{}", "扫入下单不是L撤")
                return False
            # 加绿只有L撤/人撤生效
            if gpcode_manager.GreenListCodeManager().is_in_cache(code):
                if cancel_type not in {trade_constant.CANCEL_TYPE_L, trade_constant.CANCEL_TYPE_L_UP,
                                       trade_constant.CANCEL_TYPE_L_DOWN, trade_constant.CANCEL_TYPE_RD}:
                                       trade_constant.CANCEL_TYPE_L_DOWN, trade_constant.CANCEL_TYPE_RD, trade_constant.CANCEL_TYPE_P}:
                    l2_log.cancel_debug(code, "撤单中断,原因:{}", "加绿不是L撤")
                    return False
l2/l2_transaction_data_processor.py
@@ -163,7 +163,7 @@
                    if not need_cancel:
                        need_cancel, cancel_msg = FCancelBigNumComputer().need_cancel_for_p(code,
                                                                                            order_begin_pos)
                        cancel_type = trade_constant.CANCEL_TYPE_F
                        cancel_type = trade_constant.CANCEL_TYPE_P
                    # 判断时间是否与本地时间相差5s以上
                    if tool.trade_time_sub(tool.get_now_time_str(), l2_huaxin_util.convert_time(datas[-1][3])) > 10:
                        now_seconds = int(tool.get_now_time_str().replace(":", ""))
servers/huaxin_trade_server.py
@@ -392,41 +392,15 @@
    @classmethod
    def l2_market_data(cls, code, data):
        def update_kpl_jx_block(code_, buy_1_price_, limit_up_price_):
            # ----------------------------------板块相关------------------------------
            try:
                if code_ in cls.__updating_jx_blocks_codes:
                    return
                cls.__updating_jx_blocks_codes.add(code_)
                cls.__KPLCodeJXBlockManager.load_jx_blocks(code_, buy_1_price_, limit_up_price_,
                                                           kpl_data_manager.KPLLimitUpDataRecordManager.get_current_reasons())
                # 更新板块信息
                latest_current_limit_up_records = kpl_data_manager.get_latest_current_limit_up_records()
                codes_delegate = set(CodesTradeStateManager().get_codes_by_trade_states_cache(
                    {trade_constant.TRADE_STATE_BUY_DELEGATED, trade_constant.TRADE_STATE_BUY_PLACE_ORDER}))
                codes_success = set(CodesTradeStateManager().get_codes_by_trade_states_cache(
                    {trade_constant.TRADE_STATE_BUY_SUCCESS}))
                CodePlateKeyBuyManager.update_can_buy_blocks(code_,
                                                             kpl_data_manager.KPLLimitUpDataRecordManager.latest_origin_datas,
                                                             kpl_data_manager.KPLLimitUpDataRecordManager.total_datas,
                                                             latest_current_limit_up_records,
                                                             block_info.get_before_blocks_dict(),
                                                             kpl_data_manager.KPLLimitUpDataRecordManager.get_current_limit_up_reason_codes_dict(),
                                                             codes_delegate, codes_success)
            finally:
                cls.__updating_jx_blocks_codes.discard(code_)
        time_str = f"{data['dataTimeStamp']}"
        if time_str.startswith("9"):
            time_str = "0" + time_str
        time_str = time_str[:6]
        time_str = f"{time_str[0:2]}:{time_str[2:4]}:{time_str[4:6]}"
        time_str = l2_huaxin_util.convert_time(time_str)
        buy_1_price, buy_1_volume = data["buy"][0]
        sell_1_price, sell_1_volume = data["sell"][0]
        limit_up_price = gpcode_manager.get_limit_up_price_as_num(code)
        # 涨幅
        price = data['lastPrice']
        code_price_manager.CurrentPriceManager.set_current_price(code, price)
        code_price_manager.Buy1PriceManager().set_latest_buy1_money(code, buy_1_price, buy_1_volume)
@@ -443,11 +417,11 @@
        except Exception as e:
            logger_debug.exception(e)
        if limit_up_price is not None:
        pre_close_price = CodePrePriceManager.get_price_pre_cache(code)
        if pre_close_price is not None:
            average_rate = None
            try:
                average_price = data["totalValueTrade"] / data["totalVolumeTrade"]
                pre_close_price = CodePrePriceManager.get_price_pre_cache(code)
                average_rate = round((average_price - pre_close_price) / pre_close_price, 4)
            except:
                pass
third_data/kpl_limit_up_data_manager.py
@@ -330,5 +330,8 @@
if __name__ == "__main__":
    datas = LatestLimitUpBlockManager().statistics_limit_up_block_infos()
    print(datas)
    # datas = LatestLimitUpBlockManager().statistics_limit_up_block_infos()
    # print(datas)
    code = "600126"
    blocks = LimitUpCodesBlockRecordManager().get_radical_buy_blocks(code)
    print(blocks)
trade/buy_radical/block_special_codes_manager.py
@@ -59,6 +59,11 @@
            f"SELECT r.`_hot_block_name`, r.`_code`, COUNT(*) FROM kpl_limit_up_record  r WHERE r.`_day`>'{min_day}' and r.`_day`<'{max_day}' and r._code not like '68%' group by  r.`_hot_block_name`, r.`_code`")
        return results
    def __list_code_blocks(self, min_day, max_day):
        results = self.__mysql.select_all(
            f"SELECT r.`_hot_block_name`, r.`_code`, r.`_day` FROM kpl_limit_up_record  r WHERE r.`_day`>'{min_day}' and r.`_day`<'{max_day}' and r._code not like '68%'")
        return results
    def __get_limit_up_info(self, min_day):
        sql = f"SELECT r.`_code`, COUNT(r.`_code`),r.`_code_name`,IF( r.`_zylt_val` is null, 1, r.`_zylt_val`/100000000 )  FROM (SELECT * FROM kpl_limit_up_record  r ORDER BY r.`_create_time` DESC)  r WHERE r.`_day`>'{min_day}' GROUP BY r.`_code`"
        results = self.__mysql.select_all(sql)
@@ -122,13 +127,46 @@
        获取板块有辨识度的代码
        @return:
        """
        trading_dates = HistoryKDatasUtils.get_latest_trading_date(8)
        max_day = trading_dates[-1]
        trading_dates = HistoryKDatasUtils.get_latest_trading_date(9)
        max_day = trading_dates[0]
        min_day = tool.date_sub(max_day, 180)
        block_map = self.__get_block_map()
        # [(板块名称,代码, 在板块中的涨停次数)]
        code_block_infos = self.__get_code_blocks(min_day, max_day)
        # 统计最近180天涨停数据
        # [(板块名称,代码, 日期)]
        code_block_infos = self.__list_code_blocks(min_day, max_day)
        # 统计最近8天的涨停数据
        min_day = trading_dates[-1]
        code_block_infos_8 = self.__get_code_blocks(min_day, max_day)
        # 统计涨停次数大于3次的涨停代码
        # 格式:{"代码":涨停次数}
        count_dict = {}
        filter_codes = set()
        for d in code_block_infos_8:
            if d[1] not in count_dict:
                count_dict[d[1]] = 0
            count_dict[d[1]] += d[2]
            if count_dict[d[1]] > 3:
                filter_codes.add(d[1])
        count_dict.clear()
        code_block_infos_8.clear()
        # 删除数据
        temp_data_dict = {}
        for d in code_block_infos:
            if d[1] in filter_codes and int(d[2].replace("-", "")) > int(min_day.replace("-", "")):
                # 需要过滤且最近8天涨停
                continue
            block, code = d[0], d[1]
            k = f"{block}#{code}"
            if k not in temp_data_dict:
                temp_data_dict[k] = [block, code, 0]
            temp_data_dict[k][2] += 1
        code_block_infos = [temp_data_dict[k] for k in temp_data_dict]
        min_day = tool.date_sub(max_day, 180)
        code_block_dict = {}  # {"代码":{"板块": 涨停次数}}
        for b in code_block_infos:
            if b[1] not in code_block_dict:
@@ -139,7 +177,11 @@
            for bb in bs:
                if bb not in code_block_dict[b[1]]:
                    code_block_dict[b[1]][bb] = 0
                code_block_dict[b[1]][bb] += b[2]
                if tool.is_ge_code(b[1]):
                    # 创业板1次涨停算2次涨停
                    code_block_dict[b[1]][bb] += b[2] * 2
                else:
                    code_block_dict[b[1]][bb] += b[2]
        block_codes_dict = {}  # {"板块":[(代码,涨停次数)]}
        for code in code_block_dict:
            for b in code_block_dict[code]:
@@ -214,4 +256,5 @@
if __name__ == "__main__":
    # print(datas)
    datas = AnalysisBlockSpecialCodesManager().get_block_special_codes()
    print(datas)
    # print(BlockSpecialCodesManager().get_code_blocks("002582"))
trade/buy_radical/radical_buy_data_manager.py
@@ -295,7 +295,11 @@
            return
        money_list = [x[0] for x in fmoney_list]
        money_list = money_list[:2]
        # 计算大单: 前2个大单的均值
        # 计算大单: 前2个大单+万手的均值
        # if tool.is_ge_code(code):
        #     money_list.append(gpcode_manager.get_limit_up_price_as_num(code) * 300000)
        # else:
        #     money_list.append(gpcode_manager.get_limit_up_price_as_num(code) * 1000000)
        self.__temp_big_order_threshold[code] = (
            int(sum(money_list) // len(money_list)), time.time() + 10, len(money_list) < 2)
        async_log_util.info(logger_l2_radical_buy_data,
trade/trade_constant.py
@@ -51,3 +51,6 @@
# RD撤
CANCEL_TYPE_RD = 12
# P撤
CANCEL_TYPE_P = 13
utils/middle_api_protocol.py
@@ -70,6 +70,11 @@
    fdata = {"type": "l2_subscript_codes", "data": {"ctype": "l2_subscript_codes", "data": datas}}
    return fdata
# ------------------------------L2订阅代码的实时涨幅------------------------------------
def load_l2_subscript_codes_rate(datas):
    fdata = {"type": "l2_subscript_codes_rate", "data": {"ctype": "l2_subscript_codes_rate", "data": datas}}
    return fdata
# ------------------------------消息推送------------------------------------
def load_push_msg(data):