Administrator
2024-09-09 3b872137fb8d0e894c868197eff915748c704a0e
servers/huaxin_trade_server.py
@@ -29,6 +29,7 @@
from l2.huaxin import huaxin_target_codes_manager, l2_huaxin_util
from l2.huaxin.huaxin_target_codes_manager import HuaXinL1TargetCodesManager
from l2.l2_data_manager import TradePointManager, OrderBeginPosInfo
from l2.l2_data_manager_new import L2TradeDataProcessor
from l2.l2_data_util import L2DataUtil
from l2.l2_sell_manager import L2MarketSellManager
from l2.l2_transaction_data_manager import HuaXinSellOrderStatisticManager, BigOrderDealManager
@@ -48,6 +49,7 @@
    huaxin_trade_record_manager, huaxin_sell_util
from api.outside_api_command_callback import OutsideApiCommandCallback
from trade.sell.sell_rule_manager import TradeRuleManager
from trade.trade_data_manager import RadicalBuyDealCodesManager
from trade.trade_manager import CodesTradeStateManager
from utils import socket_util, middle_api_protocol, tool, huaxin_util, global_util
@@ -655,6 +657,7 @@
            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"])
                # 成交,更新成交列表与资金列表
                huaxin_trade_data_update.add_deal_list()
                huaxin_trade_data_update.add_money_list()
@@ -668,6 +671,9 @@
class MyL2TradeSingleCallback(L2TradeSingleCallback):
    # 积极买板块计算结果缓存:{"code",(有效时间, 结果)}
    __radical_buy_by_blocks_result_cache = {}
    def OnTradeSingle(self, code, big_buy_order_count, _type, data):
        # 只处理深证的票
        try:
@@ -757,44 +763,82 @@
        except Exception as e:
            logger_debug.exception(e)
    def OnLimitUpActiveBuy(self, code, huaxin_timestamp):
    def OnLimitUpActiveBuy(self, code, huaxin_timestamp, buy_no):
        try:
            # 判断最近60个交易日有无涨停
            # 判断昨日是否涨停过
            async_log_util.info(logger_l2_radical_buy, f"涨停主动买:{code}-{huaxin_timestamp}")
            deal_codes = RadicalBuyDealCodesManager().get_deal_codes()
            if len(deal_codes) >= 2:
                async_log_util.info(logger_l2_radical_buy, f"成交代码个数大于2个:{code}-{deal_codes}")
                return
            if code in deal_codes:
                async_log_util.info(logger_l2_radical_buy, f"该代码已经成交:{code}")
                return
            k_format = code_nature_analyse.CodeNatureRecordManager().get_k_format_cache(code)
            if k_format and k_format[13] and not k_format[14]:
                # 判断是否有大单,判断最近的主动买占了总买额的多少
                refer_sell_data = L2MarketSellManager().get_refer_sell_data(code, l2_huaxin_util.convert_time(
                    huaxin_timestamp))
                async_log_util.info(logger_l2_radical_buy, f"参考总卖额:{code}-{refer_sell_data}")
                refer_sell_time = refer_sell_data[0]
                # 获取最近的主动买成交量
                deal_infos = HuaXinSellOrderStatisticManager.get_latest_6s_active_buy_deal_volumes(code)
                async_log_util.info(logger_l2_radical_buy, f"最近主动买成交:{code}-{deal_infos}")
                if refer_sell_data:  # and refer_sell_data[1] > 100 * 1e4:
                    # 总卖额要大于100w
                    deal_volume = 0
                    for i in range(0, len(deal_infos)):
                        # >=统计到的总卖
                        if int(refer_sell_time.replace(":", "")) > int(deal_infos[i][0].replace(":", "")):
                            break
                        deal_volume += deal_infos[i][1]
                    async_log_util.info(logger_l2_radical_buy, f"成交量:{deal_volume}/{refer_sell_data[2]}")
                    # 判断参考时间之后是否有大单成交
                    big_deal_money_list = BigOrderDealManager().get_total_buy_money_list(code)
                    if len(big_deal_money_list) > 0 or True:
                        # 有大单成交
                        yesterday_codes = kpl_data_manager.get_yesterday_limit_up_codes()
                        if yesterday_codes is None:
                            yesterday_codes = set()
                        result = RadicalBuyBlockManager.is_radical_buy(code, yesterday_codes)
                        if result[0]:
                            if refer_sell_data[1] < 500 * 1e4:
                                async_log_util.info(logger_l2_radical_buy, f"不能扫:{code}-总卖额偏少{refer_sell_data[1]}/500w")
                            else:
                                async_log_util.info(logger_l2_radical_buy, f"可以扫:{code}-{result}")
                        async_log_util.info(logger_l2_radical_buy, f"计算板块结果:{code}-{result}")
                # 获取激进买的板块
                result = self.__radical_buy_by_blocks_result_cache.get(code)
                if not result or result[0] < time.time():
                    yesterday_codes = kpl_data_manager.get_yesterday_limit_up_codes()
                    if yesterday_codes is None:
                        yesterday_codes = set()
                    result = RadicalBuyBlockManager.is_radical_buy(code, yesterday_codes)
                    async_log_util.info(logger_l2_radical_buy, f"计算板块结果:{code}-{result}")
                    self.__radical_buy_by_blocks_result_cache[code] = (time.time() + 3, result)
                else:
                    # 取缓存
                    result = result[1]
                if result[0]:
                    # 有可以扫的板块
                    # 判断最近的主动买占了总买额的多少
                    refer_sell_data = L2MarketSellManager().get_refer_sell_data(code, l2_huaxin_util.convert_time(
                        huaxin_timestamp))
                    async_log_util.info(logger_l2_radical_buy, f"参考总卖额:{code}-{refer_sell_data}")
                    if refer_sell_data:
                        # 如果总卖额大于500w,成交到一半就直接扫
                        if refer_sell_data[1] >= 500 * 1e4:
                            refer_sell_time = refer_sell_data[0]
                            # 获取最近的主动买成交量
                            deal_infos = HuaXinSellOrderStatisticManager.get_latest_6s_active_buy_deal_volumes(code)
                            async_log_util.info(logger_l2_radical_buy, f"最近主动买成交:{code}-{deal_infos}")
                            # 总卖额要大于100w
                            deal_volume = 0
                            for i in range(0, len(deal_infos)):
                                # >=统计到的总卖
                                if int(refer_sell_time.replace(":", "")) > int(deal_infos[i][0].replace(":", "")):
                                    break
                                deal_volume += deal_infos[i][1]
                            async_log_util.info(logger_l2_radical_buy, f"成交量:{deal_volume}/{refer_sell_data[2]}")
                            deal_rate = round(deal_volume / refer_sell_data[2], 2)
                            if deal_rate > 0.5:
                                # 判断参考时间之后是否有大单成交
                                # big_deal_money_list = BigOrderDealManager().get_total_buy_money_list(code)
                                # 成交比例大于50%
                                total_datas = l2_data_util.local_today_datas.get(code)
                                buy_single_index, buy_exec_index = total_datas[-1]["index"], total_datas[-1]["index"]
                                buy_volume_rate = L2TradeDataProcessor.volume_rate_info[code][0]
                                sell_info = (refer_sell_data[0], refer_sell_data[0])
                                threshold_money = 0
                                order_begin_pos_info = OrderBeginPosInfo(buy_single_index=buy_single_index,
                                                                         buy_exec_index=buy_exec_index,
                                                                         buy_compute_index=buy_exec_index,
                                                                         num=deal_volume // 100, count=1,
                                                                         max_num_set=set(),
                                                                         buy_volume_rate=buy_volume_rate,
                                                                         mode=OrderBeginPosInfo.MODE_RADICAL,
                                                                         mode_desc="激进买入",
                                                                         sell_info=sell_info,
                                                                         threshold_money=threshold_money)
                                L2TradeDataProcessor.save_order_begin_data(code, order_begin_pos_info)
                                L2TradeDataProcessor.start_buy(code, total_datas[-1], total_datas[-1]["index"], True)
                        else:
                            # L2委托有大单就扫
                            # 记录买入信号, 3s内有效
                            RadicalBuyDealCodesManager.buy_by_l2_delegate_expire_time_dict[code] = (
                                time.time() + 3, buy_no)
                else:
                    volume_rate = code_volumn_manager.get_volume_rate(code)
                    async_log_util.info(logger_l2_radical_buy, f"图形不符合要求:{code},量比:{volume_rate}")