admin
2025-05-21 275a72f4237a79cd0aa270eb2dc81ebd5172830f
新增买入代码管理
4个文件已修改
253 ■■■■ 已修改文件
main.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
strategy/account_management.py 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
strategy/buying_strategy.py 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
strategy/order_methods.py 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main.py
@@ -22,6 +22,7 @@
    selling_strategy
from huaxin_client import l2_market_client, l2_client, trade_client
from log_module import async_log_util, log
from strategy.order_methods import TodayBuyCodeManager
from trade import huaxin_trade_data_update, huaxin_trade_api
from utils import hx_qc_value_util, huaxin_util, juejin_api, tool
@@ -67,6 +68,8 @@
    local_data_management.read_local_K_line_data()
    # 读取本地个股所属板块数据 并更新到data_cache
    local_data_management.read_local_all_stocks_plate_data()
    # 初始化拉取当日买入代码
    TodayBuyCodeManager()
    # todo 2025-03-25 测试无误即可删除下部注释
    # # 先使用json.load()直接从文件中读取【已经存储在本地的K线指标属性字典】并解析JSON数据
strategy/account_management.py
@@ -2,6 +2,7 @@
账户管理模块【管理账户下面的资金管理方法及仓位管理方法等】
"""
from log_module.log import logger_common, logger_debug
from strategy.order_methods import TodayBuyCodeManager
from trade import huaxin_trade_api
# 引入全局变量模块
@@ -71,6 +72,7 @@
                    # 新增持仓
                    logger.info(f"今日新增持仓==={securityName}")
                    data_cache.addition_position_symbols_set.add(securityID)
                    TodayBuyCodeManager().add_deal_code(securityID)
                else:
                    data_cache.available_symbols_set.add(securityID)
                    if historyPosFrozen != 0:
@@ -80,5 +82,5 @@
        # 及时查询持仓字典数据有用,整理持仓集合也有用。整理持仓集合就是仓位管理的一部分功能。
        logger.info(f"今日持仓集合====================================【{data_cache.position_symbols_set}】")
        logger.info(f"今日可用持仓数量====================================【{len(data_cache.available_symbols_set)}】")
        logger.info(f"今日新增持仓数量====================================【{len(data_cache.addition_position_symbols_set)}】")
        logger.info(
            f"今日新增持仓数量====================================【{len(data_cache.addition_position_symbols_set)}】")
strategy/buying_strategy.py
@@ -18,6 +18,7 @@
from strategy import basic_methods
from strategy import account_management
from strategy import order_methods
from strategy.order_methods import TodayBuyCodeManager
from utils import tool, huaxin_util
@@ -171,7 +172,8 @@
            # logger_info(f"current_low == 0 赋值为K线昨收价")
        # 如果公司名称中不包含["ST", "退市", "退", "XD", "XR", "DR", "N", "C"] 则继续逻辑判断C:次新股
        if not any(keyword in k_line_data[0]['sec_name'] for keyword in ["ST", "退市", "退", "XD", "XR", "DR", "N", "C"]):
        if not any(
                keyword in k_line_data[0]['sec_name'] for keyword in ["ST", "退市", "退", "XD", "XR", "DR", "N", "C"]):
            # print(f"非ST, 退市, 退, XD, N==={k_line_data[0]['sec_name']} 继续判断")
            # print(f"{k_line_data[0]['sec_name']} 继续判断")
            if current_low is not None:
@@ -216,8 +218,9 @@
                #     print(f"没有在概念缓存列表中找到:{symbol_to_search}。")
                # 声明要检查过滤不可用的概念板块名称常量   【代表着 是否有无概念及跟随概念的可能性(有明显个股独特增长特性的不可跟随,因为概念本身是宽泛的,许多不同概念的个股都有这个概念)】
                check_plate_list = {'无', 'ST摘帽', 'ST板块', '超跌', '次新股', '北交所',  '科创板',
                                    '年报增长', '年报预增', '并购重组', '股权转让', '送转填权', '高送转', '壳资源', '资产管理', '举牌',
                check_plate_list = {'无', 'ST摘帽', 'ST板块', '超跌', '次新股', '北交所', '科创板',
                                    '年报增长', '年报预增', '并购重组', '股权转让', '送转填权', '高送转', '壳资源',
                                    '资产管理', '举牌',
                                    '专用设备', '创投'}
                # 查询当前个股的代码是否在板块强度个股列表中(低吸优选目标)
@@ -241,7 +244,8 @@
                                                    f"【{stock_list[0]}】,当日当时涨幅:{stock_list[2]}%,当时涨速:{stock_list[3]},个股精选相关板块=={correlation_plate_list} ,领涨次数:{stock_list[6]}")
                                # 如果只需要找到一个就停止,可以在这里使用 break
                                if len(values) >= 2:
                                    async_log_util.info(logger, f"单一板块内瞬时拉升数为:{len(values)},分别为===={values}")
                                    async_log_util.info(logger,
                                                        f"单一板块内瞬时拉升数为:{len(values)},分别为===={values}")
                                    # 如果子列表长度大于1且第二个元素包含 当前进入涨幅视界的symbol_code
                                    strength_list_have_it = True
                                    strength_plate = correlation_plate_list
@@ -322,81 +326,100 @@
                                                free_market_value < 40 and current_price < 20):
                                            logger_info(
                                                f"【不利】瞬时量幅比> 0.8 且 (小自由市值<40亿 或 最新价小于20元 )!,瞬时量幅比:{round(last_volume_to_growth_ratio, 2)}%,自由市值:{free_market_value} 亿。")
                                        elif now_time <= datetime.time(9, 30, 5).strftime("%H:%M:%S"):
                                            return
                                        if now_time <= datetime.time(9, 30, 5).strftime("%H:%M:%S"):
                                            logger_info(
                                                f"【不利】早盘第一个tick,瞬时涨幅计算恐有误,不买!瞬时量幅比:{round(last_volume_to_growth_ratio, 2)}%,瞬时涨幅: {tick_growth:.2f}%,当日当时涨幅:{today_growth}%。")
                                        elif limit_up_day < 1 and tick_growth < 1:
                                            return
                                        if limit_up_day < 1 and tick_growth < 1:
                                            logger_info(
                                                f"【不利】冷票 且 瞬时涨幅小于 1 !不买!!,瞬时量幅比:{round(last_volume_to_growth_ratio, 2)}%,90天内涨停天数:{limit_up_day}")
                                            return
                                        # for d in k_line_data[1:3] 只检查k_line_data中的第二个和第三个元素
                                        elif limit_up_day > 6 and any(
                                        if limit_up_day > 6 and any(
                                                'attribute' in d and d['attribute'] in data_cache.limit_up_type for d in
                                                k_line_data[1:3]) and current_volume <= k_line_data[0]['volume'] * 1.5:
                                            logger_info(
                                                f"【不利】过于显著票 且 上日或上上涨停板 当日量还不足昨日量的1.5倍!不买!! 今日当时成交量为昨日等比量的{round(current_volume / k_line_data[0]['volume'], 2)}倍,最新价: {current_price},,90天内涨停天数:{limit_up_day}")
                                        elif k_line_data[0]['attribute'] in data_cache.frying_plate_type:
                                            return
                                        if k_line_data[0]['attribute'] in data_cache.frying_plate_type:
                                            logger_info(f"【不利】昨日炸板!不买!!")
                                        elif k_line_data[0]['attribute'] in data_cache.limit_up_type:
                                            return
                                        if k_line_data[0]['attribute'] in data_cache.limit_up_type:
                                            logger_info(f"【不利】昨日涨停!不买!!")
                                        elif k_line_data[0]['attribute'] in data_cache.limit_down_type:
                                            return
                                        if k_line_data[0]['attribute'] in data_cache.limit_down_type:
                                            logger_info(f"【不利】昨日跌停!不买!!")
                                            return
                                        # elif k_line_data[0]['attribute'] == 'up_down' and k_line_data[0]['today_volume_shape'] == 'increases_down':
                                        #     logger_info(f"【不利】昨日高开低走 且 放量下跌,不买!!")
                                        elif k_line_data[0]['attribute'] == 'down_down' and k_line_data[0][
                                        if k_line_data[0]['attribute'] == 'down_down' and k_line_data[0][
                                            'today_volume_shape'] == 'increases_down':
                                            logger_info(f"【不利】昨日低开低走 且 放量下跌,不买!!")
                                        elif throwing_pressure_position[0] is True:
                                            return
                                        if throwing_pressure_position[0] is True:
                                            # 最近涨停日期:{k_line_data[limit_up_day_min_index]['bob']} ,
                                            logger_info(
                                                f"【不利】接近涨停大抛压价位 近7日涨停过票 且 当前价和今日涨停价  且 当日量还不足涨停次日量的1.5倍!且 次日最高价小于涨停最高价的1.02倍 不买!! 今日当时成交量为昨日等比量的{round(current_volume / k_line_data[0]['volume'], 2)}倍,90天内涨停天数:{limit_up_day}")
                                        elif throwing_pressure_position[1] is True:
                                            return
                                        if throwing_pressure_position[1] is True:
                                            # 最近涨停日期:{k_line_data[frying_plate_day_min_index]['bob']} ,炸板次日量{round(k_line_data[frying_plate_day_min_index - 1]['volume'], 2)},
                                            logger_info(
                                                f"【不利】接近炸板大抛压价位 近7日炸板过票 且 当前价和今日涨停价  且 当日量还不足涨停次日量的1.5倍!且 次日最高价小于炸板最高价的1.02倍 不买!! ,90天内涨停天数:{limit_up_day}")
                                        elif throwing_pressure_position[2] is True:
                                            return
                                        if throwing_pressure_position[2] is True:
                                            # 最近涨停日期:{k_line_data[limit_down_day_min_index]['bob']} ,
                                            logger_info(
                                                f"【不利】接近跌停大抛压价位[跌停日的最高价或最低价] 近7日跌停过票 且 当前价和今日涨停价  且当日量还不足昨日量的1.5倍!不买!!今日当时成交量为昨日等比量的{round(current_volume / k_line_data[0]['volume'], 2)}倍,90天内涨停天数:{limit_up_day}")
                                        elif (
                                            return
                                        if (
                                                free_market_value == 0 or free_market_value == 0.0) and free_market_value < 6:
                                            logger_info(
                                                f"【不利】自由市值小于6亿!不买!! 公司名称:{k_line_data[0]['sec_name']},最新价: {current_price}")
                                        elif (
                                            return
                                        if (
                                                free_market_value == 0 or free_market_value == 0.0) and free_market_value > 100 and L2_found_big_order is False:
                                            logger_info(
                                                f"【不利】自由市值大于100亿,且未发现大单!不买!! 公司名称:{k_line_data[0]['sec_name']},最新价: {current_price}")
                                        elif len(intersection_plate) > 0:
                                            return
                                        if len(intersection_plate) > 0:
                                            logger_info(
                                                f"【不利】同概念只买一次,不买了,公司名称:{k_line_data[0]['sec_name']},重复相交概念==={intersection_plate}")
                                        elif data_cache.have_plate_buy_times >= 3:
                                            logger_info(f"【不利】有概念买入已经 3 次了!不买了!!公司名称:{k_line_data[0]['sec_name']},")
                                        elif len(data_cache.addition_position_symbols_set) >= 3:
                                            logger_info(f"【不利】当日已经买了3只票!不买了!!公司名称:{k_line_data[0]['sec_name']},")
                                        elif now_time < data_cache.OPENING_TIME or now_time > data_cache.NOON_MARKET_TIME:
                                            return
                                        if data_cache.have_plate_buy_times >= 3:
                                            logger_info(
                                                f"【不利】有概念买入已经 3 次了!不买了!!公司名称:{k_line_data[0]['sec_name']},")
                                            return
                                        if len(TodayBuyCodeManager().get_buy_codes()) >= 3:
                                            logger_info(
                                                f"【不利】当日已经买了3只票!不买了!!公司名称:{k_line_data[0]['sec_name']},")
                                            return
                                        if now_time < data_cache.OPENING_TIME or now_time > data_cache.NOON_MARKET_TIME:
                                            logger_info(f"【不利】不在9:30-13:05时间内!不买!!")
                                            return
                                        logger_info(
                                            f"************************************************【有概念有强度指标下单】************************************************")
                                        logger_info(
                                            f"最新价: {current_price}, 当日最高价:{current_high},瞬时涨幅: {tick_growth:.2f}%,当日当时涨幅:{today_growth}%,公司名称:{k_line_data[0]['sec_name']},当前时间:{current_created_at},低于水位线:{deep_low:.2f},交易量今日与昨日的比例{round(current_volume / k_line_data[0]['volume'], 2)}")
                                        logger_info(
                                            f"大盘综合强度分数:{data_cache.real_time_market_strong},理想交易行情分数==={data_cache.ideal_trading_market_score}分,设想的下单金额:{get_order_money()}")
                                        # 调用下单方法下单
                                        order_methods.buy_order_by_value(symbol,
                                                                         get_order_money(),
                                                                         k_line_data[0]['sec_name'],
                                                                         current_price)
                                        # 检测持仓代码集合中有无下单个股,才认为交易成功
                                        if symbol_code not in data_cache.position_symbols_set:
                                            logger_info(
                                                f"【{k_line_data[0]['sec_name']}】交易失败~持仓集合:{data_cache.position_symbols_set}")
                                        else:
                                            # 将有概念买入次数自加1
                                            data_cache.have_plate_buy_times += 1
                                            # 将买入个股的当时概念添加到全局变量中存储
                                            data_cache.bought_plate.extend(limit_up_plate_included_list)
                                            logger_info(
                                                f"************************************************【有概念有强度指标下单】************************************************")
                                            logger_info(
                                                f"最新价: {current_price}, 当日最高价:{current_high},瞬时涨幅: {tick_growth:.2f}%,当日当时涨幅:{today_growth}%,公司名称:{k_line_data[0]['sec_name']},当前时间:{current_created_at},低于水位线:{deep_low:.2f},交易量今日与昨日的比例{round(current_volume / k_line_data[0]['volume'], 2)}")
                                            logger_info(
                                                f"大盘综合强度分数:{data_cache.real_time_market_strong},理想交易行情分数==={data_cache.ideal_trading_market_score}分,设想的下单金额:{get_order_money()}")
                                            # 调用下单方法下单
                                            order_methods.buy_order_by_value(symbol,
                                                                             get_order_money(),
                                                                             k_line_data[0]['sec_name'],
                                                                             current_price)
                                            # 检测持仓代码集合中有无下单个股,才认为交易成功
                                            if symbol_code not in data_cache.position_symbols_set:
                                                logger_info(
                                                    f"【{k_line_data[0]['sec_name']}】交易失败~持仓集合:{data_cache.position_symbols_set}")
                                            else:
                                                # 将有概念买入次数自加1
                                                data_cache.have_plate_buy_times += 1
                                                # 将买入个股的当时概念添加到全局变量中存储
                                                data_cache.bought_plate.extend(limit_up_plate_included_list)
                                                logger_info(
                                                    f"【{k_line_data[0]['sec_name']}】交易成功!持仓集合:{data_cache.position_symbols_set}")
                                                f"【{k_line_data[0]['sec_name']}】交易成功!持仓集合:{data_cache.position_symbols_set}")
                                    # 有概念无强度视界
                                    if strength_list_have_it is False:
@@ -451,19 +474,23 @@
                                                # 最近涨停日期:{k_line_data[limit_down_day_min_index]['bob']} ,
                                                logger_info(
                                                    f"【不利】接近跌停大抛压价位[跌停日的最高价或最低价] 近7日跌停过票 且 当前价和今日涨停价  且当日量还不足昨日量的1.5倍!不买!!今日当时成交量为昨日等比量的{round(current_volume / k_line_data[0]['volume'], 2)}倍,90天内涨停天数:{limit_up_day}")
                                            elif (free_market_value == 0 or free_market_value == 0.0) and free_market_value < 6:
                                            elif (
                                                    free_market_value == 0 or free_market_value == 0.0) and free_market_value < 6:
                                                logger_info(
                                                    f"【不利】自由市值小于6亿!不买!! 公司名称:{k_line_data[0]['sec_name']},最新价: {current_price}")
                                            elif (free_market_value == 0 or free_market_value == 0.0) and free_market_value > 100 and L2_found_big_order is False:
                                            elif (
                                                    free_market_value == 0 or free_market_value == 0.0) and free_market_value > 100 and L2_found_big_order is False:
                                                logger_info(
                                                    f"【不利】自由市值大于100亿,且未发现大单!不买!! 公司名称:{k_line_data[0]['sec_name']},最新价: {current_price}")
                                            elif len(intersection_plate) > 0:
                                                logger_info(
                                                    f"【不利】同概念只买一次,不买了,公司名称:{k_line_data[0]['sec_name']},重复相交概念==={intersection_plate}")
                                            elif data_cache.have_plate_buy_times >= 1:
                                                logger_info(f"【不利】有概念无强度买入已经1次了!不买了!!公司名称:{k_line_data[0]['sec_name']},")
                                                logger_info(
                                                    f"【不利】有概念无强度买入已经1次了!不买了!!公司名称:{k_line_data[0]['sec_name']},")
                                            elif len(data_cache.addition_position_symbols_set) >= 4:
                                                logger_info(f"【不利】当日已经买了3只票!不买了!!公司名称:{k_line_data[0]['sec_name']},")
                                                logger_info(
                                                    f"【不利】当日已经买了3只票!不买了!!公司名称:{k_line_data[0]['sec_name']},")
                                            elif now_time < data_cache.OPENING_TIME or now_time > data_cache.NOON_MARKET_TIME:
                                                logger_info(f"【不利】不在9:30-13:05时间内!不买!!")
                                            else:
@@ -524,7 +551,8 @@
                                                # elif k_line_data[0]['attribute'] == 'up_down' and k_line_data[0]['today_volume_shape'] == 'increases_down':
                                                #     logger_info(
                                                #         f"【不利】昨日高开低走 且 放量下跌,不买!!")
                                                elif k_line_data[0]['attribute'] == 'down_down' and k_line_data[0]['today_volume_shape'] == 'increases_down':
                                                elif k_line_data[0]['attribute'] == 'down_down' and k_line_data[0][
                                                    'today_volume_shape'] == 'increases_down':
                                                    logger_info(
                                                        f"【不利】昨日低开低走 且 放量下跌,不买!!")
                                                elif throwing_pressure_position[0] is True:
@@ -546,13 +574,16 @@
                                                elif have_leading_increase is False:
                                                    logger_info(
                                                        f"【不利】有强度的板块中没有发现领涨次数!不买!! 公司名称:{k_line_data[0]['sec_name']},最新价: {current_price}")
                                                elif (free_market_value == 0 or free_market_value == 0.0) and free_market_value > 100 and L2_found_big_order is False:
                                                elif (
                                                        free_market_value == 0 or free_market_value == 0.0) and free_market_value > 100 and L2_found_big_order is False:
                                                    logger_info(
                                                        f"【不利】自由市值大于100亿,且未发现大单!不买!! 公司名称:{k_line_data[0]['sec_name']},最新价: {current_price}")
                                                elif data_cache.have_strength_buy_times >= 1:
                                                    logger_info(f"【不利】有强度买入 1 次了!不买了!!公司名称:{k_line_data[0]['sec_name']},")
                                                elif len(data_cache.addition_position_symbols_set) >= 3:
                                                    logger_info(f"【不利】当日已经买了3只票!不买了!!公司名称:{k_line_data[0]['sec_name']},")
                                                    logger_info(
                                                        f"【不利】有强度买入 1 次了!不买了!!公司名称:{k_line_data[0]['sec_name']},")
                                                elif len(TodayBuyCodeManager().get_buy_codes()) >= 3:
                                                    logger_info(
                                                        f"【不利】当日已经买了3只票!不买了!!公司名称:{k_line_data[0]['sec_name']},")
                                                elif now_time < data_cache.OPENING_TIME or now_time > data_cache.NOON_MARKET_TIME:
                                                    logger_info(f"【不利】不在9:30-13:05时间内!不买!!")
                                                else:
@@ -650,7 +681,8 @@
                                                    logger_info(
                                                        f"【不利】自由市值小于6亿!不买!! 公司名称:{k_line_data[0]['sec_name']},最新价: {current_price}")
                                                elif data_cache.have_small_turn_large_buy_times >= 1:
                                                    logger_info(f"【不利】有小量换大涨幅买入已经 1 次了!不买了!!公司名称:{k_line_data[0]['sec_name']},")
                                                    logger_info(
                                                        f"【不利】有小量换大涨幅买入已经 1 次了!不买了!!公司名称:{k_line_data[0]['sec_name']},")
                                                elif len(data_cache.addition_position_symbols_set) >= 4:
                                                    logger_info(
                                                        f"【不利】当日已经买了4只票!不买了!!公司名称:{k_line_data[0]['sec_name']},")
@@ -683,7 +715,8 @@
                                '''
                                if k_line_data[0]['attribute'] in data_cache.limit_up_type:
                                    # logger_info(f"昨日涨停")
                                    if k_line_data[1]['attribute'] not in data_cache.limit_up_type and k_line_data[2]['attribute'] not in data_cache.limit_up_type:
                                    if k_line_data[1]['attribute'] not in data_cache.limit_up_type and k_line_data[2][
                                        'attribute'] not in data_cache.limit_up_type:
                                        # logger_info(f"前日大前日未涨停")
                                        if today_open_growth > 1:
                                            logger_info(
@@ -697,7 +730,7 @@
                                                'volume'] * 1.5:
                                                logger_info(
                                                    f"【不利】过于显著票 且 前日或上前日涨停板 当日量还不足昨日量的1.5倍!不买!! 今日当时成交量为昨日等比量的{round(current_volume / k_line_data[0]['volume'], 2)}倍,90天内涨停天数:{limit_up_day}")
                                            elif len(data_cache.addition_position_symbols_set) >= 3:
                                            elif len(TodayBuyCodeManager().get_buy_codes()) >= 3:
                                                logger_info(
                                                    f"【不利】当日已经买了3只票!不买!!")
                                            elif now_time < data_cache.OPENING_TIME or now_time > data_cache.MORN_MARKET_TIME:
@@ -732,7 +765,7 @@
                                                'volume'] * 1.5:
                                                logger_info(
                                                    f"【不利】过于显著票 且 上日或上上涨停板 当日量还不足昨日量的1.5倍!不买!! 今日当时成交量为昨日等比量的{round(current_volume / k_line_data[0]['volume'], 2)}倍,90天内涨停天数:{limit_up_day}")
                                            elif len(data_cache.addition_position_symbols_set) >= 3:
                                            elif len(TodayBuyCodeManager().get_buy_codes()) >= 3:
                                                logger_info(
                                                    f"【不利】当日已经买了3只票!不买!!")
                                            elif now_time < data_cache.OPENING_TIME or now_time > data_cache.MORN_MARKET_TIME:
strategy/order_methods.py
@@ -5,9 +5,12 @@
import multiprocessing
import threading
from db import redis_manager_delegate as redis_manager
from db.redis_manager_delegate import RedisUtils
from log_module import async_log_util
from strategy import data_cache, account_management
import data_server
from log_module.log import logger_debug, logger_common
from log_module.log import logger_debug, logger_common, logger_trade
from strategy.trade_setting import TradeSetting
from trade import huaxin_trade_api, huaxin_trade_data_update, middle_api_protocol
@@ -20,6 +23,10 @@
# 下单买入函数(按金额,以限价买)【按金额买 基础版】
def buy_order_by_value(symbol, buy_order_value, sec_name, current_price):
    if symbol[-6:] in TodayBuyCodeManager().get_buy_codes():
        logger.info(f"{symbol}已经下过单")
        return
    # 自动买 开关监听方法
    if not TradeSetting().get_auto_buy():
        # 暂停自动买
@@ -40,11 +47,13 @@
    logger.info(f"current_price===={current_price}    order_price===={order_price}")
    logger.info(f"buy_order===={buy_order}")
    orderStatusMsg = buy_order['data'].get('orderStatusMsg', None)
    orderRef = buy_order['data'].get('orderRef', None)
    statusMsg = buy_order['data'].get('statusMsg', None)
    logger.info(f"orderStatusMsg==={orderStatusMsg}")
    logger.info(f"statusMsg==={statusMsg}")
    # orderStatusMsg 不在buy_order的下单回调中,那么才认为下单成功
    if statusMsg is not None and statusMsg == '':
        TodayBuyCodeManager().place_order(symbol[-6:], orderRef)
        logger.info(f"买票 下单成功:【{sec_name}】")
        # 每一次成功下单后要更新一下 缓存 的持仓数据
        account_management.position_management()
@@ -185,8 +194,11 @@
            :return:
            """
            print(f"收到订单回调:{order_info}")
            logger_debug.info(f"收到订单回调:{order_info}")
            async_log_util.info(logger_debug, f"收到订单回调:{order_info}")
            if huaxin_util.is_deal(order_info['orderStatus']):
                if order_info["direction"] == '0':
                    # 买入成交
                    TodayBuyCodeManager().add_deal_code(order_info["securityID"], order_info.get("orderRef"))
                # 成交,需要更新持仓/委托/成交
                huaxin_trade_data_update.add_position_list()
                huaxin_trade_data_update.add_delegate_list("成交")
@@ -201,3 +213,86 @@
    huaxin_trade_api.run_trade(queue_strategy_r_trade_w, MyTradeCallback(), queue_strategy_w_trade_r,
                               queue_strategy_w_trade_for_query_r)
    threading.Thread(target=data_server.run, daemon=True).start()
@tool.singleton
class TodayBuyCodeManager:
    """
    今日买入代码管理类
    """
    __db = 0
    redisManager = redis_manager.RedisManager(0)
    def __init__(self):
        # 挂单中的代码
        self.delegating_codes_info = {}
        self.deal_codes = set()
        self.__load_data()
    @classmethod
    def __get_redis(cls):
        return cls.redisManager.getRedis()
    def __load_data(self):
        """
        加载数据
        :return:
        """
        codes = RedisUtils.smembers(self.__get_redis(), "buy_deal_codes")
        if codes:
            self.deal_codes = set(codes)
    def add_deal_code(self, code, order_ref=None):
        """
        添加买入成交的代码
        :param order_ref:
        :param code:
        :return:
        """
        if code in self.deal_codes:
            return
        async_log_util.info(logger_trade, f"买入成交:{code}")
        self.deal_codes.add(code)
        if order_ref and order_ref in self.delegating_codes_info:
            del self.delegating_codes_info[order_ref]
        RedisUtils.sadd_async(self.__db, "buy_deal_codes", code)
        RedisUtils.expire_async(self.__db, "buy_deal_codes", tool.get_expire())
    def place_order(self, code, order_ref):
        """
        下单
        :param code: 代码
        :param order_ref: 索引
        :return:
        """
        async_log_util.info(logger_trade, f"下单:{code}-{order_ref}")
        self.delegating_codes_info[order_ref] = code
    def get_buy_codes(self):
        """
        获取买入的代码:成交代码+委托
        :return:
        """
        codes = set()
        if self.deal_codes:
            codes |= self.deal_codes
        if self.delegating_codes_info:
            codes |= set(self.delegating_codes_info.values())
        return codes
    def buy_fail(self, order_ref):
        """
        买入失败
        :param order_ref:
        :return:
        """
        async_log_util.info(logger_trade, f"下单失败:{order_ref}")
        if order_ref in self.delegating_codes_info:
            del self.delegating_codes_info[order_ref]
if __name__ == '__main__':
    # 测试代码
    TodayBuyCodeManager().place_order("000001", 1)
    TodayBuyCodeManager().buy_fail(1)
    print(TodayBuyCodeManager().get_buy_codes())