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()