Administrator
2024-12-04 e90601a93ef11d553ae1c8666ab9be8c587b1f49
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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
"""
现价处理器
"""
# 获取到现价
import decimal
import logging
 
from l2.huaxin import huaxin_target_codes_manager
from log_module import async_log_util
from log_module.log import logger_l2_codes_subscript, logger_debug
import constant
from code_attribute import gpcode_manager
from third_data.kpl_data_constant import LimitUpCodesBlockRecordManager, LimitUpDataConstant
from trade.buy_radical.block_special_codes_manager import BlockSpecialCodesManager
from trade.buy_radical.radical_buy_data_manager import RadicalBuyBlockManager
from utils import tool, import_util
from trade import trade_manager, l2_trade_util, trade_constant
from trade.trade_data_manager import CodeActualPriceProcessor
 
trade_gui = import_util.import_lib("trade.trade_gui")
 
__actualPriceProcessor = CodeActualPriceProcessor()
 
latest_add_codes = set()
 
 
def compute_code_order(code, top_in_blocks=None, yesterday_limit_up_codes=None, today_history_limit_up_codes =None):
    """
    计算代码的排序
    @param code:
    @param top_in_blocks: 净流入前几
    @return: 排序值,若为负值不订阅
    """
    # 想买单/隔夜单排序位
    if yesterday_limit_up_codes is None:
        yesterday_limit_up_codes = set()
    if top_in_blocks is None:
        top_in_blocks = []
    if today_history_limit_up_codes is None:
        today_history_limit_up_codes = set()
        # 高位板
    if code in yesterday_limit_up_codes:
        return -1
        # 黑名单
    if l2_trade_util.is_in_forbidden_trade_codes(code):
        return -1
 
    # 想买单
    if gpcode_manager.WantBuyCodesManager().is_in_cache(code):
        return 0
    # 隔夜单拍一
    if gpcode_manager.BuyOpenLimitUpCodeManager().is_in_cache(code):
        return 0
 
    trade_state = trade_manager.CodesTradeStateManager().get_trade_state_cache(code)
    # 如果当前清单处于委托状态就不能移除
    if trade_state == trade_constant.TRADE_STATE_BUY_PLACE_ORDER or trade_state == trade_constant.TRADE_STATE_BUY_DELEGATED:
        return 0
 
    # 板块
    blocks = LimitUpCodesBlockRecordManager().get_radical_buy_blocks(code)
    if not blocks:
        return -1
    if code in today_history_limit_up_codes:
        # 涨停过的代码才会计算板块身位
        for b in blocks:
            if b in top_in_blocks:
                index = top_in_blocks.index(b)
                # 查询在板块中的排序
                info = RadicalBuyBlockManager().get_history_index(code, b, yesterday_limit_up_codes)
                if info[0] < 4:
                    return index + 1
                elif info[0] < 6:
                    # 判断是否具有辨识度
                    special_codes = BlockSpecialCodesManager().get_block_codes(b)
                    if special_codes and code in special_codes:
                        return index + 1
    return 10000
 
 
def accept_prices(prices, request_id=None, top_in_blocks=None, yesterday_limit_up_codes=None):
    """
    接收价格,处理订阅
    @param yesterday_limit_up_codes: 昨日涨停数据
    @param history_limit_up_datas: 历史涨停数据
    @param prices:
    @param request_id:
    @param top_in_blocks: 净流入前几的代码
    @return:
    """
    # logger_debug.debug(f"接收L1数据测试:流入前20-{top_in_blocks}")
    if True:
        today_history_limit_up_codes = set([d[3] for d in LimitUpDataConstant.history_limit_up_datas])
        _code_list = []
        _delete_list = []
        temp_prices = []
        now_time_int = tool.get_now_time_as_int()
        for d in prices:
            code, price = d["code"], float(d["price"])
            temp_prices.append((code, price))
            # 获取收盘价
            pricePre = gpcode_manager.CodePrePriceManager.get_price_pre_cache(code)
            if pricePre is not None:
                # 是否是想买单
                order_index = compute_code_order(code, top_in_blocks, yesterday_limit_up_codes, today_history_limit_up_codes)
                rate = round((price - pricePre) * 100 / pricePre, 2)
                if tool.is_ge_code(code):
                    # 创业板的涨幅需要打折
                    rate = rate / 2
                if order_index >= 0:
                    if now_time_int < 150000:
                        if order_index < 1000:
                            # 10点之前只订阅有效代码
                            _code_list.append((rate, code, order_index))
                        else:
                            _delete_list.append((rate, code, 0))
                    else:
                        # 10点之后常规订阅
                        _code_list.append((rate, code, order_index))
                else:
                    # 暂存涨幅为负的代码
                    _delete_list.append((rate, code, 0))
                try:
                    __actualPriceProcessor.save_current_price(code, price,
                                                              gpcode_manager.get_limit_up_price_by_preprice(code,
                                                                                                            pricePre) == tool.to_price(
                                                                  decimal.Decimal(d["price"])))
                except Exception as e:
                    logging.exception(e)
                    logger_l2_codes_subscript.exception(e)
        gpcode_manager.set_prices(temp_prices)
        # -------------------------------处理交易位置分配---------------------------------
        # 排序
        new_code_list = sorted(_code_list, key=lambda e: (e[2], -e[0]))
        # logger_debug.debug(f"接收L1数据测试:排序过后的代码-{new_code_list[:75]}")
        # -------------------------------处理L2监听---------------------------------
        max_count = constant.HUAXIN_L2_MAX_CODES_COUNT
 
        _delete_list = []
        for item in new_code_list:
            if l2_trade_util.is_in_forbidden_trade_codes(
                    item[1]) or item[0] < 0:
                # 在(黑名单)/(涨幅小于)的数据
                # if trade_manager.CodesTradeStateManager().get_trade_state_cache(
                #         item[1]) != trade_constant.TRADE_STATE_BUY_SUCCESS:
                # 没成交才会加入删除
                _delete_list.append(item)
 
        for item in _delete_list:
            new_code_list.remove(item)
        # 截取前几个代码填充
        add_list = new_code_list[:max_count]
        async_log_util.info(logger_l2_codes_subscript,
                            f"({request_id})需要订阅的代码:{add_list}")
 
        # 后面的代码全部删除
        _delete_list.extend(new_code_list[max_count:])
 
        add_code_list = []
        del_code_list = []
        for d in add_list:
            add_code_list.append(d[1])
 
        for d in _delete_list:
            del_code_list.append(d[1])
 
        if constant.L2_SOURCE_TYPE == constant.L2_SOURCE_TYPE_HUAXIN:
            # 华鑫L2,获取加入代码的涨停价
 
            # 是否和上次一样
            try:
                add_code_set = set(add_code_list)
                # global latest_add_codes
                # if not latest_add_codes:
                #     latest_add_codes = set()
                # # 判断设置的代码是否相同
                # dif1 = latest_add_codes - add_code_set
                # dif2 = add_code_set - latest_add_codes
                # if dif1 or dif2:
                if True:
                    global latest_add_codes
                    async_log_util.info(logger_l2_codes_subscript,
                                        f"({request_id})预处理新增订阅代码:{add_code_set - latest_add_codes}")
                    latest_add_codes = add_code_set
                    add_datas = []
                    for d in add_code_list:
                        limit_up_price = gpcode_manager.get_limit_up_price(d)
                        limit_up_price = round(float(limit_up_price), 2)
                        min_volume = int(round(50 * 10000 / limit_up_price))
                        # 传递笼子价
                        add_datas.append(
                            # (代码, 最小量, 涨停价,影子订单价格,买量, 特殊价格)
                            (d, min_volume, limit_up_price, round(tool.get_shadow_price(limit_up_price), 2),
                             tool.get_buy_volume(limit_up_price),
                             [tool.get_buy_volume_by_money(limit_up_price, x) for x in constant.AVAILABLE_BUY_MONEYS]))
                    huaxin_target_codes_manager.HuaXinL2SubscriptCodesManager.push(add_datas, request_id)
            except Exception as e:
                logging.exception(e)
        else:
            pass
 
 
__trade_price_dict = {}
 
# 最近的非涨停价成交的信息,数据结构:{code:(价格,时间)}
__trade_price_not_limit_up_info_dict = {}
 
 
# 设置成交价
def set_trade_price(code, price):
    __trade_price_dict[code] = price
 
 
def set_latest_not_limit_up_time(code, time_str_with_ms):
    """
    记录最近的一次上板时间(最近的一笔主动买就是上板时间)
    @param code:
    @param time_str:
    @return:
    """
    __trade_price_not_limit_up_info_dict[code] = time_str_with_ms
 
 
# 获取成交价
def get_trade_price(code):
    return __trade_price_dict.get(code)
 
 
def get_trade_not_limit_up_time_with_ms(code):
    """
    获取最近的非板上成交的时间
    @param code:
    @return:(价格, 时间)
    """
    return __trade_price_not_limit_up_info_dict.get(code)