Administrator
2024-10-12 aacc6148dd43a9cffbff9a23a273a55b64bf3d8c
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
"""
激进买策略管理
"""
# 上一个50W的起始时间:{code:"09:30:00.120"}
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
from log_module import async_log_util
from log_module.log import logger_l2_radical_buy, hx_logger_l2_transaction
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 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)
        if rate > 0.5:
            # 成交的比例
            if total_sell > 500 * 1e4:
                return BUY_MODE_DIRECT, f"剩余涨停总卖额-{selling_num * price},原涨停总卖-{total_sell},已成交额-{__deal_active_buy_total_money[code]},成交比例-{rate} "
            else:
                return BUY_MODE_BY_L2, f"剩余涨停总卖额小于500w-{selling_num * price},原涨停总卖-{total_sell},已成交额-{__deal_active_buy_total_money[code]},成交比例-{rate} "
        else:
            return BUY_MODE_NONE, f"被动卖成交比例未达到:剩余涨停总卖额-{selling_num * price},原涨停总卖-{total_sell},已成交额-{__deal_active_buy_total_money[code]},成交比例-{rate}"
    else:
        return __get_deal_rate_by(code, huaxin_timestamp)