Administrator
2024-10-31 b855b811e3753ffcb35f145c985bb32f4b550038
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
"""
激进买策略管理
"""
# 上一个50W的起始时间:{code:"09:30:00.120"}
from code_attribute import code_volumn_manager, gpcode_manager
from l2.huaxin import l2_huaxin_util
from l2.l2_limitup_sell_data_manager import L2LimitUpSellDataManager
from l2.l2_sell_manager import L2MarketSellManager
from l2.l2_transaction_data_manager import HuaXinSellOrderStatisticManager, BigOrderDealManager
from log_module import async_log_util
from log_module.log import logger_l2_radical_buy, hx_logger_l2_transaction
from trade import radical_buy_data_manager
from trade.radical_buy_data_manager import EveryLimitupBigDealOrderManager
from utils import tool
 
# 不买入
BUY_MODE_NONE = 0
# 直接买入
BUY_MODE_DIRECT = 1
# 根据L2买入
BUY_MODE_BY_L2 = 2
 
# 开始计时时间
__start_time_dict = {}
# 转换时间缓存
__huaxin_timestamp_convert_temp = {}
# 主动成交的累计金额
__deal_active_buy_total_money = {}
# 最近成交的买单信息{code:[订单号,量,金额]}
__latest_deal_active_buy_order = {}
 
 
def __get_deal_rate_by(code, huaxin_timestamp):
    """
 
    @param code: 代码
    @param huaxin_timestamp: 华鑫成交时间戳
    @return:买入方式, 消息
    """
    """
    获取备用成交比例
    @param code:
    @return:
    """
    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:
            THRESH_HOLD_VOLUME = refer_sell_data[2]
            if refer_sell_data[4] and len(refer_sell_data[4]) < 10:
                # 小于10挡,最后一档才是涨停价
                if refer_sell_data[4][-1][1] > 0:
                    THRESH_HOLD_VOLUME = refer_sell_data[4][-1][1]
 
            refer_sell_time = refer_sell_data[0]
            # 获取最近的主动买成交量
            limit_up_deal_infos = HuaXinSellOrderStatisticManager.get_latest_6s_active_buy_deal_volumes(
                code)
            async_log_util.info(logger_l2_radical_buy, f"最近涨停主动买成交(备用):{code}-{limit_up_deal_infos}")
            deal_volume = 0
            for i in range(0, len(limit_up_deal_infos)):
                # >=统计到的总卖
                if int(refer_sell_time.replace(":", "")) > int(
                        limit_up_deal_infos[i][0].replace(":", "")):
                    break
                deal_volume += limit_up_deal_infos[i][1]
            async_log_util.info(logger_l2_radical_buy, f"成交量(备用):{deal_volume}/{THRESH_HOLD_VOLUME}")
            deal_rate = round(deal_volume / THRESH_HOLD_VOLUME, 2)
            if deal_rate >= 0.5:
                return BUY_MODE_DIRECT, f"达到买入条件(备用):比例-{deal_rate}"
            else:
                return BUY_MODE_NONE, f"尚未达到买入比例(备用):{deal_rate}"
        else:
            return BUY_MODE_BY_L2, f"总卖额小于500w(备用)({refer_sell_data[1]})"
    else:
        return BUY_MODE_NONE, "尚未获取到总卖额(备用)"
 
 
def process_limit_up_active_buy_deal(code, transaction_datas):
    async_log_util.info(hx_logger_l2_transaction, f"板上成交:{code}-{transaction_datas}")
    """
    涨停主动买成交
    @param code:
    @param transaction_datas:   # q.append((data['SecurityID'], data['TradePrice'], data['TradeVolume'],
        #           data['OrderTime'], data['MainSeq'], data['SubSeq'], data['BuyNo'],
        #           data['SellNo'], data['ExecType']))
    @return: 买入方式, 消息
    """
    # ---------初始化-------------
    if code not in __huaxin_timestamp_convert_temp:
        __huaxin_timestamp_convert_temp[code] = {}
    if code not in __deal_active_buy_total_money:
        __deal_active_buy_total_money[code] = 0
    if code not in __latest_deal_active_buy_order:
        __latest_deal_active_buy_order[code] = ['', 0, 0]
    for transaction_data in transaction_datas:
        # 当遇到大单之后才需要计算累计成交
        # 统计金额
        money = transaction_data[1] * transaction_data[2]
        price = transaction_data[1]
 
        # 统计当前的买单
        if __latest_deal_active_buy_order[code][0] == transaction_data[6]:
            __latest_deal_active_buy_order[code][1] += transaction_data[2]
            __latest_deal_active_buy_order[code][2] += money
        else:
            __latest_deal_active_buy_order[code] = [transaction_data[6], transaction_data[2], money]
 
        if code not in __start_time_dict:
            # 判断买单成交的金额,如果金额大于50w就作为计时起始点
            if __latest_deal_active_buy_order[code][2] >= 500000:
                # 设置计时起点,将当前的数据清零
                __start_time_dict[code] = l2_huaxin_util.convert_time(transaction_data[3], with_ms=True)
                __deal_active_buy_total_money[code] = __latest_deal_active_buy_order[code][2]
        else:
            __deal_active_buy_total_money[code] += money
            # 已经开始计数
            THRESHOLD_TIME = 1000 if tool.is_sh_code(code) else 500
            huaxin_timestamp = transaction_data[3]
            time_str_with_ms = __huaxin_timestamp_convert_temp[code].get(huaxin_timestamp)
            if not time_str_with_ms:
                __huaxin_timestamp_convert_temp[code].clear()
                time_str_with_ms = l2_huaxin_util.convert_time(huaxin_timestamp, with_ms=True)
                __huaxin_timestamp_convert_temp[code][huaxin_timestamp] = time_str_with_ms
 
            if tool.trade_time_sub_with_ms(time_str_with_ms, __start_time_dict[code]) > THRESHOLD_TIME:
                __start_time_dict.pop(code)
                __deal_active_buy_total_money[code] = 0
                return BUY_MODE_NONE, f"距离上个大单成交超过{THRESHOLD_TIME}ms"
 
    price = transaction_datas[-1][1]
    huaxin_timestamp = transaction_datas[-1][3]
    # 处于涨停卖的委托订单量
    selling_num = L2LimitUpSellDataManager.get_delegating_sell_num(code)
    if selling_num:
        total_sell = __deal_active_buy_total_money[code] + selling_num * price
        rate = round(__deal_active_buy_total_money[code] / total_sell, 2)
        # 获取当前的成交量比
        limit_up_price = gpcode_manager.get_limit_up_price_as_num(code)
        volume_rate = code_volumn_manager.CodeVolumeManager().get_volume_rate(code, total_sell_volume=int(
            total_sell / limit_up_price),
                                                                              with_info=False)
        if volume_rate is None:
            volume_rate = 0.5
        # 根据大单判断是否可以扫
        big_order_deal_result = __is_big_order_deal_enough(code, volume_rate)
        if not big_order_deal_result[0]:
            return BUY_MODE_NONE, big_order_deal_result[1]
 
        THRESHOLD_RATE = radical_buy_data_manager.get_volume_rate_threshold(code, volume_rate)
        if rate >= THRESHOLD_RATE:
            # 成交的比例
            # if total_sell > 1000 * 1e4:
            if total_sell >= 0:
                return BUY_MODE_DIRECT, f"剩余涨停总卖额-{selling_num * price},原涨停总卖-{total_sell},已成交额-{__deal_active_buy_total_money[code]},成交比例-{rate}/{THRESHOLD_RATE}"
            else:
                return BUY_MODE_BY_L2, f"剩余涨停总卖额小于500w-{selling_num * price},原涨停总卖-{total_sell},已成交额-{__deal_active_buy_total_money[code]},成交比例-{rate}/{THRESHOLD_RATE} "
        else:
            return BUY_MODE_NONE, f"被动卖成交比例未达到:剩余涨停总卖额-{selling_num * price},原涨停总卖-{total_sell},已成交额-{__deal_active_buy_total_money[code]},成交比例-{rate}/{THRESHOLD_RATE}"
    else:
        # 根据量比与大单成交数量判断是否可扫
        volume_rate = code_volumn_manager.CodeVolumeManager().get_volume_rate(code, with_info=False)
        if volume_rate is None:
            volume_rate = 0.5
        # 根据大单判断是否可以扫
        big_order_deal_result = __is_big_order_deal_enough(code, volume_rate)
        if not big_order_deal_result[0]:
            return BUY_MODE_NONE, big_order_deal_result[1]
        return __get_deal_rate_by(code, huaxin_timestamp)
 
 
def __is_big_order_deal_enough(code, volume_rate):
    """
    大单成交是否足够
    @param code:
    @param volume_rate:
    @return:
    """
    limit_up_price = gpcode_manager.get_limit_up_price_as_num(code)
    refer_volume = code_volumn_manager.CodeVolumeManager().get_max_volume_in_5days(code)
    if refer_volume is None:
        refer_volume = 0
 
    money_y = int(refer_volume * limit_up_price / 1e8)
    money_y = min(money_y, 50)
    money_y = max(money_y, 5)
    # 计算大单参考数量
    threshold_count = int(round(0.4 * money_y))
    current_big_order_deal_count = EveryLimitupBigDealOrderManager.get_big_buy_deal_order_count(code)
    if volume_rate >= 0.5 or True:
        # 按量大于50%算
        # 当换手量>50%时,则,不需要每次扫入时需要≥2笔大单,而是累计需要≥2笔大单即可
        deal_big_order_count = BigOrderDealManager().get_total_buy_count(code)
        if deal_big_order_count >= threshold_count:
            return True, f"量比-{volume_rate}, 总大单成交数量({deal_big_order_count})>={threshold_count}"
        else:
            return False, f"量比-{volume_rate}, 总大单成交数量({deal_big_order_count})<{threshold_count}"
    else:
        if current_big_order_deal_count >= threshold_count:
            return True, f"量比-{volume_rate}, 本次大单成交数量({current_big_order_deal_count})>={threshold_count}"
        else:
            return False, f"量比-{volume_rate}, 本次大单成交数量({current_big_order_deal_count})<{threshold_count}"