Administrator
2024-09-29 f8ff0e2645846ad96edb99045d7e642f97c8b7bb
bug修复
10个文件已修改
117 ■■■■ 已修改文件
api/outside_api_command_callback.py 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
l2/l2_data_manager.py 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
l2/l2_data_manager_new.py 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
output/code_info_output.py 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
servers/huaxin_trade_server.py 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
third_data/code_plate_key_manager.py 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
third_data/kpl_data_manager.py 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
third_data/third_blocks_manager.py 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
trade/trade_manager.py 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/middle_api_protocol.py 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/outside_api_command_callback.py
@@ -34,7 +34,7 @@
    logger_trade, logger_trade_position_api_request, logger_request_api, \
    logger_real_place_order_position, logger_device
from output import l2_output_util
from third_data import kpl_data_manager, kpl_util, history_k_data_manager, huaxin_l1_data_manager
from third_data import kpl_data_manager, kpl_util, history_k_data_manager, huaxin_l1_data_manager, third_blocks_manager
from third_data.code_plate_key_manager import CodePlateKeyBuyManager, KPLCodeJXBlockManager
from third_data.history_k_data_manager import HistoryKDataManager
from third_data.history_k_data_util import JueJinApi, HistoryKDatasUtils
@@ -559,6 +559,11 @@
                l1_subscript_codes_manager.save_codes(codes_sh, codes_sz)
            result = {"code": 0, "data": {"codes_sh": len(codes_sh), "codes_sz": len(codes_sz)}}
            self.send_response(result, client_id, request_id)
            # 拉取三方板块
            codes = []
            codes.extend(codes_sh)
            codes.extend(codes_sz)
            threading.Thread(target=third_blocks_manager.load_if_less, args=(codes,), daemon=True).start()
        except Exception as e:
            logger_debug.error(e)
@@ -1223,6 +1228,8 @@
                kpl_blocks = KPLCodeJXBlockManager().get_jx_blocks_radical(code)
                if kpl_blocks is None:
                    kpl_blocks = set()
                if not kpl_blocks:
                    KPLCodeJXBlockManager().load_jx_blocks_radical(code)
                match_blocks, info = CodeThirdBlocksManager().get_intersection_blocks_info(code, kpl_blocks)
                source_origin_dict[SOURCE_TYPE_KPL] = kpl_blocks
                source_dict[SOURCE_TYPE_KPL] = BlockMapManager().filter_blocks(kpl_blocks)
@@ -1241,6 +1248,7 @@
                                   request_id)
        except Exception as e:
            logging.exception(e)
            logger_debug.exception(e)
            self.send_response({"code": 1, "msg": f"数据处理出错:{e}"}, client_id, request_id)
        finally:
            use_time = time.time() - __start_time
l2/l2_data_manager.py
@@ -82,6 +82,8 @@
    __buy_compute_index_info_cache = {}
    __buy_cancel_single_pos_cache = {}
    __instance = None
    # 最近的下单模式
    __latest_place_order_mode_cache = {}
    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
@@ -117,7 +119,6 @@
    # 获取买入点信息
    # 返回数据为:买入点 累计纯买额 已经计算的数据索引
    def get_buy_compute_start_data(self, code):
        _key = "buy_compute_index_info-{}".format(code)
        _data_json = RedisUtils.get(self.__get_redis(), _key)
@@ -140,6 +141,10 @@
    # nums 累计纯买额
    def set_buy_compute_start_data_v2(self, code, order: OrderBeginPosInfo):
        if order.mode is not None:
            self.__latest_place_order_mode_cache[code] = order.mode
        expire = tool.get_expire()
        _key = "buy_compute_index_info-{}".format(code)
        data_ = None
@@ -157,6 +162,15 @@
    def is_placed_order(cls, order_begin_pos: OrderBeginPosInfo):
        return order_begin_pos and order_begin_pos.buy_exec_index is not None and order_begin_pos.buy_exec_index > -1
    @classmethod
    def get_latest_place_order_mode(cls, code):
        """
        获取最近下单的模式
        @param code:
        @return:
        """
        return cls.__latest_place_order_mode_cache.get(code)
# 清除l2数据
def clear_l2_data(code):
l2/l2_data_manager_new.py
@@ -744,7 +744,7 @@
            if order_begin_pos.MODE_RADICAL == order_begin_pos.mode:
                # 积极下单不判断条件
                can, need_clear_data, reason, is_valid_exec_index = True, False, "激进下单", True
                can, need_clear_data, reason, is_valid_exec_index = True, False, "扫入下单", True
            else:
                can, need_clear_data, reason, is_valid_exec_index = cls.__can_buy_first(code)
@@ -1333,7 +1333,7 @@
        # 是否是交易队列触发
        order_begin_pos = cls.__get_order_begin_pos(
            code)
        # 激进下单只有L撤能撤单
        # 扫入下单只有L撤能撤单
        if order_begin_pos and order_begin_pos.mode == OrderBeginPosInfo.MODE_RADICAL and cancel_type not in {
            trade_constant.CANCEL_TYPE_L, trade_constant.CANCEL_TYPE_L_UP, trade_constant.CANCEL_TYPE_L_DOWN}:
            return False
@@ -2353,7 +2353,7 @@
                buy_count += int(total_datas[i]["re"])
                if buy_nums >= threshold_num:
                    l2_log.info(code, logger_l2_trade_buy,
                                f"{code}获取到买入执行点(激进下单):{i} 统计纯买手数:{buy_nums} 目标纯买手数:{threshold_num} 统计纯买单数:{buy_count}")
                                f"{code}获取到买入执行点(积极下单):{i} 统计纯买手数:{buy_nums} 目标纯买手数:{threshold_num} 统计纯买单数:{buy_count}")
            elif L2DataUtil.is_limit_up_price_buy_cancel(_val):
                # 判断买入位置是否在买入信号之前
                buy_index = l2_data_source_util.L2DataSourceUtils.get_buy_index_with_cancel_data_v2(total_datas[i],
@@ -2400,7 +2400,7 @@
            safe_count = 1
            if active_buy_blocks and current_sell_data[1] > 5000000:
                # 有激进板块且大于500w才能激进下单
                # 有激进板块且大于500w才能扫入下单
                safe_count = 1
            else:
                # 无激进下单板块
output/code_info_output.py
@@ -424,13 +424,17 @@
                    mode = data.get('mode')
                    mode_desc = data.get('mode_desc')
                    if mode == OrderBeginPosInfo.MODE_ACTIVE:
                        records_new_data.append((time_, "激进下单",
                        records_new_data.append((time_, "积极下单",
                                                 mode_desc,
                                                 extra_datas))
                    elif mode == OrderBeginPosInfo.MODE_FAST:
                        records_new_data.append((time_, "闪电下单",
                                                 mode_desc,
                                                 extra_datas))
                    elif mode == OrderBeginPosInfo.MODE_RADICAL:
                        records_new_data.append((time_, "扫入下单",
                                                 mode_desc,
                                                 extra_datas))
                    else:
                        records_new_data.append((time_, "常规下单",
                                                 mode_desc,
servers/huaxin_trade_server.py
@@ -660,7 +660,8 @@
            if huaxin_util.is_deal(order_status):
                if int(str(data["direction"])) == huaxin_util.TORA_TSTP_D_Buy:
                    l2_trade_util.forbidden_trade(data["securityID"], msg="已成交", force=True)
                    RadicalBuyDealCodesManager().add_deal_code(data["securityID"])
                    if TradePointManager.get_latest_place_order_mode(data["securityID"]) == OrderBeginPosInfo.MODE_RADICAL:
                        RadicalBuyDealCodesManager().add_deal_code(data["securityID"])
                # 成交,更新成交列表与资金列表
                huaxin_trade_data_update.add_deal_list()
                huaxin_trade_data_update.add_money_list()
@@ -728,7 +729,7 @@
                    l2_data_manager_new.L2TradeDataProcessor.start_buy(code, total_datas[-1], total_datas[-1]["index"],
                                                                       True)
                else:
                    l2_log.debug(code, "积极下单,不满足激进下单条件,无法激进")
                    l2_log.debug(code, "积极下单,不满足扫入下单条件,无法扫入")
            else:
                if not tool.is_sz_code(code):
                    return
third_data/code_plate_key_manager.py
@@ -157,17 +157,20 @@
                if price_rate > 0.03:
                    if not self.__code_blocks_for_radical_buy.get(code):
                        start_time = time.time()
                        blocks = kpl_api.getCodeJingXuanBlocks(code, jx=False)
                        blocks = set([b[1] for b in blocks])
                        # fblocks = BlockMapManager().filter_blocks(blocks)
                        async_log_util.info(logger_kpl_block_can_buy,
                                            f"{code}:获取到板块(激进买) 过滤前-{blocks} 耗时:{int(time.time() - start_time)}s")
                        self.save_jx_blocks_for_radical_buy(code, list(blocks))
                        self.load_jx_blocks_radical(code)
        except Exception as e:
            logger_kpl_block_can_buy.error(f"{code} 获取板块出错")
            logger_kpl_block_can_buy.exception(e)
    def load_jx_blocks_radical(self, code):
        start_time = time.time()
        blocks = kpl_api.getCodeJingXuanBlocks(code, jx=False)
        blocks = set([b[1] for b in blocks])
        # fblocks = BlockMapManager().filter_blocks(blocks)
        async_log_util.info(logger_kpl_block_can_buy,
                            f"{code}:获取到板块(激进买) 过滤前-{blocks} 耗时:{int(time.time() - start_time)}s")
        self.save_jx_blocks_for_radical_buy(code, list(blocks))
# 禁止下单的板块
class ForbiddenBlockManager:
third_data/kpl_data_manager.py
@@ -286,6 +286,18 @@
            return cls.__current_reason_codes_dict.keys()
        return set()
    @classmethod
    def get_new_blocks(cls, day):
        """
        获取某一天新出现的板块
        @param day:
        @return:
        """
        sql = f"SELECT k.`_hot_block_name`, k.`_day` FROM `kpl_limit_up_record` k GROUP BY k.`_hot_block_name` HAVING k.`_day`='{day}' ORDER BY  k.`_day` DESC"
        mysqldb = mysql_data.Mysqldb()
        results = mysqldb.select_all(sql)
        return [x[0] for x in results]
class KPLDataManager:
    __latest_datas = {}
third_data/third_blocks_manager.py
@@ -4,7 +4,8 @@
from itertools import combinations
from db.mysql_data_delegate import Mysqldb
from third_data import kpl_api
from third_data import kpl_api, block_web_api
from utils import middle_api_protocol
SOURCE_TYPE_KPL = 1  # 东方财富
SOURCE_TYPE_TDX = 2  # 通达信
@@ -190,8 +191,31 @@
        return self.__block_map.keys()
def load_if_less(codes):
    """
    加载
    @param codes:
    @return:
    """
    for code in codes:
        source_blocks = CodeThirdBlocksManager().get_source_blocks_origin(code)
        if source_blocks is None:
            source_blocks = {}
        all_source = {SOURCE_TYPE_EASTMONEY, SOURCE_TYPE_TDX, SOURCE_TYPE_THS}
        sources = all_source - source_blocks.keys()
        for source in sources:
            try:
                blocks = middle_api_protocol.request(middle_api_protocol.get_third_blocks(code, source))
                if blocks:
                    CodeThirdBlocksManager().set_blocks(code, blocks, source)
            except:
                pass
if __name__ == '__main__':
    code = "000761"
    blocks = kpl_api.getCodeJingXuanBlocks(code, jx=False)
    blocks = set([b[1] for b in blocks])
    print(CodeThirdBlocksManager().get_intersection_blocks_info(code, blocks))
    try:
        blocks = middle_api_protocol.request(middle_api_protocol.get_third_blocks(code, 4))
        print(blocks)
    except Exception as e:
        print(e)
trade/trade_manager.py
@@ -15,7 +15,7 @@
from db import mysql_data_delegate as mysql_data, redis_manager_delegate as redis_manager
from db.mysql_data_delegate import Mysqldb
from db.redis_manager_delegate import RedisUtils
from l2.l2_data_manager import OrderBeginPosInfo
from l2.l2_data_manager import OrderBeginPosInfo, TradePointManager
from log_module import async_log_util
from output import kp_client_msg_manager
from trade import trade_data_manager, l2_trade_util, trade_juejin, trade_huaxin, trade_constant
@@ -631,7 +631,8 @@
    # 加入黑名单
    if not l2_trade_util.is_in_forbidden_trade_codes(code):
        l2_trade_util.forbidden_trade(code, "buy success", force=True)
        RadicalBuyDealCodesManager().add_deal_code(code)
        if TradePointManager().get_latest_place_order_mode(code) == OrderBeginPosInfo.MODE_RADICAL:
            RadicalBuyDealCodesManager().add_deal_code(code)
    # 取s消所有的挂单
    if constant.API_TRADE_ENABLE:
        if constant.TRADE_WAY == constant.TRADE_WAY_JUEJIN:
utils/middle_api_protocol.py
@@ -75,3 +75,9 @@
def load_push_msg(data):
    fdata = {"type": "push_msg", "data": {"ctype": "push_msg", "data": data}}
    return fdata
# ------------------------------获取三方板块------------------------------------
def get_third_blocks(code, source):
    fdata = {"type": "get_third_blocks", "data": {"ctype": "get_third_blocks", "data": {"code": code, "source": source}}}
    return fdata