Administrator
2024-10-30 173a8ace6fd8142a8e2ff62c3b496940c5f603cd
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
"""
激进买数据管理
"""
import constant
from code_attribute import code_nature_analyse, code_volumn_manager, gpcode_manager
from code_attribute.code_l1_data_manager import L1DataManager
from l2.l2_sell_manager import L2MarketSellManager
from l2.l2_transaction_data_manager import BigOrderDealManager
from log_module import async_log_util
from log_module.log import logger_l2_radical_buy
from third_data import kpl_data_manager
from trade.buy_money_count_setting import RadicalBuyBlockCodeCountManager
from trade.trade_data_manager import RadicalBuyDealCodesManager
from utils import tool, global_util
 
 
class RedicalBuyDataManager():
    @classmethod
    def can_buy(cls, code, deal_codes=None):
        """
        是否可以买
        @param code: 代码
        @param total_sell_volume: 总卖量
        @return: 是否可以买, 原因
        """
        k_format = code_nature_analyse.CodeNatureRecordManager().get_k_format_cache(code)
        if k_format:
            if not k_format[13]:
                return False, "近60个交易日无涨停"
            if k_format[14]:
                # 昨天炸板,且当前的量比小于60%
                current_total_sell_data = L2MarketSellManager().get_current_total_sell_data(code)
                total_sell_volume = 0
                if current_total_sell_data:
                    total_sell_volume = current_total_sell_data[2]
                volume_rate = code_volumn_manager.CodeVolumeManager().get_volume_rate(code, total_sell_volume=total_sell_volume)
                if volume_rate < 0.6:
                    return False, f"昨日炸板,量比({volume_rate})<0.6"
        # 获取涨停价
        price = gpcode_manager.get_limit_up_price_as_num(code)
        if not price:
            # 获取现价
            price = L1DataManager.get_l1_current_price(code)
        if price:
            if price < constant.MIN_CODE_RADICAL_BUY_PRICE or price > constant.MAX_CODE_RADICAL_BUY_PRICE:
                return False, "价格不满足需求"
        # 判断自由流通股本
        zyltgb = global_util.zyltgb_map.get(code)
        if zyltgb:
            zyltgb_as_yi = round(zyltgb / 100000000, 2)
            zylt_can_buy = False
            for zy in constant.RADICAL_BUY_ZYLTGB_AS_YI_RANGES:
                if zy[0] <= zyltgb_as_yi <= zy[1]:
                    zylt_can_buy = True
                    break
            if not zylt_can_buy:
                return False, "自由流通市值不满足扫的范围"
        # 判断昨日是否跌幅过大
        k_format = code_nature_analyse.CodeNatureRecordManager().get_k_format_cache(code)
        if k_format and len(k_format) > 12 and k_format[12]:
            return False, "上个交易日跌幅过大"
 
        if gpcode_manager.BlackListCodeManager().is_in_cache(code):
            if deal_codes is not None and code in deal_codes:
                pass
            else:
                # 拉黑且不是已经买入性质的拉黑
                return False, "已拉黑"
        return True, ""
 
    @classmethod
    def big_order_deal(cls, code):
        """
        有大单成交
        @param code:
        @param count:
        @return:
        """
        if gpcode_manager.MustBuyCodesManager().is_in_cache(code):
            return
        cls.place_order_success(code)
 
    @classmethod
    def place_order_success(cls, code):
        # 如果有大单成交就加红
        deal_big_order_count = BigOrderDealManager().get_total_buy_count(code)
        if deal_big_order_count > 0:
            gpcode_manager.MustBuyCodesManager().add_code(code)
 
 
class EveryLimitupBigDealOrderManager:
    """
    每次上板的大单管理
    """
    # 成交大单的订单号:{"code":{"order_no",...}}
    __deal_big_order_nos_dict = {}
 
    @classmethod
    def open_limit_up(cls, code):
        if code in cls.__deal_big_order_nos_dict:
            cls.__deal_big_order_nos_dict[code].clear()
 
    @classmethod
    def add_big_buy_order_deal(cls, code, order_nos: list):
        if code not in cls.__deal_big_order_nos_dict:
            cls.__deal_big_order_nos_dict[code] = set()
        for order_no in order_nos:
            cls.__deal_big_order_nos_dict[code].add(order_no)
 
    @classmethod
    def get_big_buy_deal_order_count(cls, code):
        if code in cls.__deal_big_order_nos_dict:
            return len(cls.__deal_big_order_nos_dict[code])
        return 0
 
 
def is_block_can_radical_buy(code, radical_buy_blocks, deal_codes):
    # 原因下面的代码个数
    deal_reason_codes = {}
 
    for dc in deal_codes:
        # 获取涨停原因
        reasons = set()
        limit_up_reason = kpl_data_manager.LimitUpDataConstant.get_limit_up_reason_with_history(dc)
        if limit_up_reason and limit_up_reason in constant.KPL_INVALID_BLOCKS:
            limit_up_reason = None
        # 如果涨停原因为空就需要获取上次激进买的原因
        if limit_up_reason:
            reasons.add(limit_up_reason)
        if not limit_up_reason:
            radical_buy_deal_blocks = RadicalBuyDealCodesManager.radical_buy_blocks_dict.get(dc)
            if radical_buy_deal_blocks:
                reasons |= radical_buy_deal_blocks
        for r in reasons:
            if r not in deal_reason_codes:
                deal_reason_codes[r] = set()
            deal_reason_codes[r].add(dc)
    async_log_util.info(logger_l2_radical_buy, f"已经成交的板块:{code}-{deal_reason_codes.keys()}")
 
    f_buy_blocks = set()
    for b in radical_buy_blocks:
        # 获取板块的最大买入个数
        max_count = RadicalBuyBlockCodeCountManager().get_block_code_count(b)
        if b in deal_reason_codes and len(deal_reason_codes[b]) >= max_count:
            continue
        f_buy_blocks.add(b)
    async_log_util.info(logger_l2_radical_buy, f"还可以买入的板块:{code}-{f_buy_blocks}")
    return f_buy_blocks
 
 
def get_volume_rate_threshold(code, volume_rate):
    """
    获取吃卖1的比例
    @param code: 代码
    @param volume_rate:量比
    @return:
    """
    fvolume_rate = volume_rate
    if volume_rate <= 0.05:
        fvolume_rate = 0.05
    elif volume_rate > 1:
        fvolume_rate = 1
 
    if tool.is_sh_code(code):
        return round(0 - 0.44 * fvolume_rate + 0.822, 3)
    else:
        return round(0 - 0.44 * fvolume_rate + 0.722, 3)