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.六个交易日涨幅过高: # # 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" 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 sv.日最高价_10 <= o[4] < sv.昨日收盘价 * 1.06])) if big_order_count < 1: # max(1, int(round(sv.昨日成交额 * 0.33 / 1e8))): return False, f"({big_order_count})少于1个大单" if not sv.代码板块: return False, "没有板块" can_buy_blocks = set([k for k in sv.代码板块 if sv.板块涨停 and k in sv.板块涨停 and len(sv.板块涨停[k]) >= 1]) if not can_buy_blocks: return False, "板块少于1个涨停" # 是否还有可买的板块 can_buy_blocks = sv.代码板块 - sv.板块成交代码.keys() if not can_buy_blocks: return False, "板块已有成交代码" tr = 0.06 if target_code.find("30") != 0 else 0.12 if (sv.今日大单数据[-1][4] - sv.昨日收盘价) / sv.昨日收盘价 >= tr: return False, "涨幅过高" 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个点" return True, can_buy_blocks, ( f"大单数量:{big_order_count}", f"买入价:{sv.今日大单数据[-1][4]},涨幅:{round((sv.今日大单数据[-1][4] - sv.昨日收盘价) * 100 / sv.昨日收盘价, 2)}%", sv.今日大单数据[-1], [(p, sv.板块涨停.get(p)) for p in can_buy_blocks]) compute_result = can_buy()