"""
|
激进买数据管理
|
"""
|
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 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
|
|
|
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]:
|
# 昨天炸板,且当前的量比小于33%
|
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.get_volume_rate(code, total_sell_volume=total_sell_volume)
|
if volume_rate < 0.33:
|
return False, f"昨日炸板,量比({volume_rate})<0.33"
|
|
# MAX_CODE_PRICE = 50
|
# MIN_CODE_PRICE = 2
|
# 获取涨停价
|
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_PRICE or price > constant.MAX_CODE_PRICE:
|
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, ""
|
|
|
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)
|