Administrator
2025-06-06 32203dcb2d06b93e4b6c81f9121b00531a91395e
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
from strategy.strategy_variable import StockVariables
 
sv = StockVariables()
 
 
def can_buy():
    """
    @return: 是否可买, 不能买的原因/可买的板块
    """
    # print(f"{target_code}:执行策略")
    if not sv.昨日非跌停 or not sv.昨日非涨停 or not sv.昨日非炸板:
        return False, "日K不满足条件"
 
    if sv.自由流通市值 > 300e8 or sv.自由流通市值 < 30e8:
        return False, f"自由市值({sv.自由流通市值})不满足要求"
 
    # if sv.六个交易日涨幅过高:
    #     # print(f"{target_code}:六个交易日涨幅过高")
    #     return False, "六个交易日涨幅过高"
 
    # if sv.当前价 <= sv.日最高价_10:
    #     return False, "没突破10日最高价"
    # 统计大单数量
    if sv.今日开盘价 and (sv.今日开盘价 - sv.昨日收盘价) / sv.昨日收盘价 < -0.03:
        return False, "开盘涨幅小于-0.03"
 
    # if sv.今日涨停价 < sv.日最高价_5:
    #     return False, "今日涨停价小于5日最高价"
 
    if sv.涨停数_5 > 3 or sv.跌停数_5 > 3 or sv.炸板数_5 > 3:
        return False, "5日涨停数/炸板数/跌停数>3"
    if sv.今日涨停价 > 60 or sv.今日涨停价 < 2.99:
        return False, "今日涨停价高于60/低于2.99"
 
    if not sv.领涨板块信息:
        return False, "没有板块"
 
    can_buy_blocks = set()
    for k in sv.领涨板块信息.keys():
        if sv.开盘啦领涨板块涨停 and k in sv.开盘啦领涨板块涨停 and len(sv.开盘啦领涨板块涨停[k]) >= 1:
            can_buy_blocks.add(k)
 
    can_buy_blocks = can_buy_blocks - sv.日出现的板块_5
    # print("新题材", can_buy_blocks)
 
    if not can_buy_blocks:
        return False, "没有新板块"
    # print("新题材", target_code, can_buy_blocks, [(b, sv.开盘啦领涨板块涨停.get(b)) for b in can_buy_blocks])
 
    big_order_count = 0
    if sv.今日大单数据:
        # 10个交易日内有炸板或涨停就看5个交易日
        # if sv.涨停数_10 > 0 or sv.炸板数_10 > 0:
        #     big_order_count = len(set([o[0] for o in sv.今日大单数据 if sv.日最高价_5 <= o[4] < sv.昨日收盘价 * 1.06]))
        # else:
        # big_order_count = len(set([o[0] for o in sv.今日大单数据 if o[4] < sv.昨日收盘价 * 1.06]))
        big_order_count = len(set([o[0] for o in sv.今日大单数据]))
    if big_order_count < 1:  # max(1, int(round(sv.自由流通市值 // 1e9 - 2))):
        return False, f"({big_order_count})少于1个大单"
 
    if not can_buy_blocks:
        return False, "板块少于1个涨停"
    # 是否还有可买的板块,板块只允许买1个
    # can_buy_blocks = can_buy_blocks - sv.板块成交代码.keys()
    # if not can_buy_blocks:
    #     return False, "板块已有成交代码"
    tr = 0.06 if target_code.find("30") != 0 else 0.12
    rate = (sv.今日大单数据[-1][4] - sv.昨日收盘价) / sv.昨日收盘价
    if rate >= tr:
        return False, f"涨幅过高:{rate}"
 
    tr = 0.1 if target_code.find("30") != 0 else 0.2
    if (sv.今日大单数据[-1][4] - sv.昨日最低价) / sv.昨日最低价 >= tr:
        return False, "价格超过昨日最低价的110%"
 
    buy_money = 0
    sell_money = 0
    order_ids = set()
    if sv.今日大单数据:
        for d in reversed(sv.今日大单数据):
            if d[0] in order_ids:
                continue
            order_ids.add(d[0])
            if d[4] >= sv.昨日收盘价 * 1.06:
                continue
            buy_money += d[2]
    if sv.今日大单数据 and str(sv.今日大单数据[-1][3]).find("92") == 0:
        return False, "大单时间在09:30之前"
 
    if sv.今日卖大单数据:
        for d in reversed(sv.今日卖大单数据):
            if d[0] in order_ids:
                continue
            order_ids.add(d[0])
            sell_money += d[2]
 
    if buy_money - sell_money < 299e4:
        # print(target_code, "卖单多于买单: ", sv.今日卖大单数据)
        return False, "卖单多于买单"
 
    # if (sv.今日大单数据[-1][4] - sv.今日大单均价) / sv.昨日收盘价 > 0.03:
    #     return False, f"高于大单均价({sv.今日大单均价})3个点"
 
    # 算抛压均价
    # high_price = sv.日最高价_10
    # high_rate = (sv.今日大单数据[-1][4] - high_price) / high_price
    # if high_rate < 0.03:
    #     pass
    # else:
    #     return False, f"抛压涨幅({high_rate}/{high_rate})>0.03"
 
    if sv.今日大单数据[-1][4] <= max(sv.昨日收盘价, sv.昨日开盘价):
        return False, f"尚未昨日突破"
    # print(sv.板块涨停)
    return True, can_buy_blocks, (
        f"大单数量:{big_order_count}",
        f"买入价:{sv.今日大单数据[-1][4]},涨幅:{round((sv.今日大单数据[-1][4] - sv.昨日收盘价) * 100 / sv.昨日收盘价, 2)}%",
        [(p, f"领涨次数:{sv.领涨板块信息.get(p)[1]}/{sv.领涨板块信息.get(p)[2]}", sv.开盘啦领涨板块涨停.get(p)) for p in can_buy_blocks],
        sv.今日大单数据[-1])
 
 
compute_result = can_buy()