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 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.昨日成交额 * 0.33 / 1e8))):
|
return False, f"({big_order_count})少于1个大单"
|
if not sv.新代码板块:
|
return False, "没有板块"
|
can_buy_blocks = set()
|
for k in sv.新代码板块:
|
if sv.板块涨停 and len(sv.板块涨停.get(k, [])) >= 1:
|
can_buy_blocks.add(k)
|
if not can_buy_blocks:
|
return False, "板块少于1个涨停"
|
# 判断是否是新板块
|
can_buy_blocks = can_buy_blocks - sv.日出现的板块_5
|
if not can_buy_blocks:
|
return False, "没有新板块"
|
# 是否还有可买的板块
|
# 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个点"
|
|
# 算抛压均价
|
# 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"
|
return True, can_buy_blocks, (
|
f"大单数量:{big_order_count}",
|
f"买入价:{sv.今日大单数据[-1][4]},涨幅:{round((sv.今日大单数据[-1][4] - sv.昨日收盘价) * 100 / sv.昨日收盘价, 2)}%",
|
sv.今日大单数据[-1], f"板块:{can_buy_blocks}", [(p, sv.板块涨停.get(p)) for p in can_buy_blocks])
|
|
|
compute_result = can_buy()
|