| | |
| | | import dask |
| | | import requests |
| | | |
| | | import constant |
| | | from code_attribute.gpcode_manager import BlackListCodeManager |
| | | from l2.huaxin import huaxin_target_codes_manager |
| | | from l2.l2_transaction_data_manager import HuaXinBuyOrderManager |
| | |
| | | deal_big_order_detail_info = None |
| | | try: |
| | | # 获取成交大单:(参考大单金额,已成交大单金额,大单要求金额, 已成交涨停买金额, 已成交涨停卖金额) |
| | | th_buy, is_temp = BeforeSubDealBigOrderManager().get_big_order_threshold_info(code) |
| | | th_temp_buy_info = BeforeSubDealBigOrderManager().get_temp_deal_big_order_threshold_info( |
| | | code) |
| | | th_buy, th_buy_default = BeforeSubDealBigOrderManager().get_big_order_threshold(code) |
| | | th_sell = BeforeSubDealBigOrderManager().get_big_sell_order_threshold(code) |
| | | deal_big_money_info = radical_buy_data_manager.get_total_deal_big_order_info( |
| | | code, gpcode_manager.get_limit_up_price_as_num(code)) |
| | | # 大单成交信息 |
| | | deal_big_order_info = [ |
| | | (output_util.money_desc(th_buy), output_util.money_desc(th_sell)), output_util.money_desc(deal_big_money_info[1]), |
| | | (output_util.money_desc(th_temp_buy_info[0] if th_temp_buy_info else 0), # 临时买大单阈值 |
| | | output_util.money_desc(th_buy), # 买大单阈值 |
| | | output_util.money_desc(th_sell) |
| | | ), # 卖单阈值 |
| | | output_util.money_desc(deal_big_money_info[1]), |
| | | output_util.money_desc(deal_big_money_info[2])] |
| | | if len(codes) == 1: |
| | | # 加载大单详情 |
| | | deal_big_order_detail_info = radical_buy_data_manager.get_l2_big_order_deal_info(code) |
| | | # 加载涨停大单详情 |
| | | limit_up_big_order_detail = radical_buy_data_manager.get_total_detal_big_order_details(code) |
| | | deal_big_order_info.append(output_util.money_desc(limit_up_big_order_detail[0]+limit_up_big_order_detail[1])) |
| | | limit_up_big_order_detail = radical_buy_data_manager.get_total_detal_big_order_details( |
| | | code) |
| | | deal_big_order_info.append( |
| | | output_util.money_desc(limit_up_big_order_detail[0] + limit_up_big_order_detail[1])) |
| | | deal_big_order_info.append( |
| | | output_util.money_desc(limit_up_big_order_detail[2] + limit_up_big_order_detail[3])) |
| | | deal_big_order_info.append( |
| | | radical_buy_data_manager.TotalDealBigOrderInfoManager().get_big_order_rate(code)) |
| | | |
| | | except Exception as e: |
| | | logger_debug.error(f"可能没有获取到涨停价:{code}") |
| | | logger_debug.exception(e) |
| | |
| | | code_name = gpcode_manager.get_code_name(code) |
| | | fresults.append((code, code_name, deal_big_order_info, deal_big_order_detail_info)) |
| | | response_data = json.dumps({"code": 0, "data": fresults}) |
| | | except Exception as e: |
| | | except Exception as e: |
| | | response_data = json.dumps({"code": 1, "data": str(1)}) |
| | | |
| | | elif url.path == "/get_all_special_codes": |
| | |
| | | except: |
| | | pass |
| | | |
| | | try: |
| | | records = KPLLimitUpDataRecordManager.total_datas |
| | | |
| | | # 计算今日新增的题材概念 |
| | | block_codes = {} |
| | | for x in records: |
| | | b = kpl_util.filter_block(x[2]) |
| | | if b not in block_codes: |
| | | block_codes[b] = set() |
| | | block_codes[b].add(x[3]) |
| | | reasons = set(block_codes.keys()) |
| | | reasons -= constant.KPL_INVALID_BLOCKS |
| | | reasons -= LimitUpCodesBlockRecordManager().get_total_before_blocks() |
| | | if reasons: |
| | | for r in reasons: |
| | | for c in block_codes[r]: |
| | | LimitUpCodesBlockRecordManager().add_new_blocks(c, r) |
| | | except: |
| | | pass |
| | | |
| | | self.__kplDataManager.save_data(type_, result_list_) |
| | | except Exception as e: |
| | | logger_debug.exception(e) |
| | |
| | | import constant |
| | | from db import redis_manager_delegate as redis_manager |
| | | from db.redis_manager_delegate import RedisUtils |
| | | from log_module import async_log_util |
| | | from log_module.log import logger_debug |
| | | from third_data import kpl_util |
| | | from third_data.third_blocks_manager import BlockMapManager |
| | | |
| | |
| | | # 原始数据 |
| | | __radical_buy_reasons_origin_data_dict = {} |
| | | |
| | | # 所有的涨停原因 |
| | | __all_limit_up_reasons = set() |
| | | |
| | | # 今日的新概念 |
| | | __new_blocks = set() |
| | | |
| | | __instance = None |
| | | |
| | | __day = tool.get_now_date_str() |
| | |
| | | limit_up_reasons_dict = {} |
| | | limit_up_recommend_block_dict = {} |
| | | for r in kpl_results: |
| | | cls.__all_limit_up_reasons.add(kpl_util.filter_block(r[2])) |
| | | code = r[0] |
| | | if code not in limit_up_reasons_dict: |
| | | limit_up_reasons_dict[code] = [] |
| | |
| | | return set(self.__radical_buy_reasons_dict.get(code)) |
| | | return None |
| | | |
| | | def add_new_blocks(self, code, block): |
| | | """ |
| | | 添加新题材的板块 |
| | | @param code: |
| | | @param block: |
| | | @return: |
| | | """ |
| | | if block in constant.KPL_INVALID_BLOCKS: |
| | | return |
| | | old_blocks = self.__radical_buy_reasons_dict.get(code) |
| | | if old_blocks is None: |
| | | old_blocks = set() |
| | | if block in old_blocks: |
| | | return |
| | | self.__new_blocks.add(block) |
| | | old_blocks.add(block) |
| | | async_log_util.info(logger_debug, f"今日新增概念:{code} - {block}") |
| | | self.__radical_buy_reasons_dict[code] = old_blocks |
| | | |
| | | def get_total_before_blocks(self): |
| | | """ |
| | | 获取所有之前的板块 |
| | | @return: |
| | | """ |
| | | return self.__all_limit_up_reasons |
| | | |
| | | def get_new_blocks(self): |
| | | """ |
| | | 获取新概念 |
| | | @return: |
| | | """ |
| | | return self.__new_blocks |
| | | |
| | | |
| | | class TodayLimitUpReasonChangeManager: |
| | | """ |
| | |
| | | """ |
| | | import constant |
| | | from db import mysql_data_delegate as mysql_data |
| | | from third_data import kpl_util |
| | | from third_data.history_k_data_util import HistoryKDatasUtils |
| | | from utils import tool |
| | | |
| | |
| | | limit_up_info_map = self.__get_limit_up_info(min_day) |
| | | fdatas = [] |
| | | for b in block_codes_dict: |
| | | # if b != '人工智能': |
| | | # if b != '机器人': |
| | | # continue |
| | | |
| | | if b in constant.KPL_INVALID_BLOCKS: |
| | |
| | | continue |
| | | # [(板块, 代码名称, 代码, 涨停次数, 自由市值)] |
| | | fdatas.append( |
| | | (b, limit_up_info_map[code][1], code, code_block_dict[code][b], |
| | | (kpl_util.filter_block(b), limit_up_info_map[code][1], code, code_block_dict[code][b], |
| | | int(float(limit_up_info_map[code][2])))) |
| | | if index >= 10: |
| | | break |
| | |
| | | |
| | | if __name__ == "__main__": |
| | | # print(datas) |
| | | print(BlockSpecialCodesManager().get_code_blocks("002582")) |
| | | datas = AnalysisBlockSpecialCodesManager().get_block_special_codes() |
| | | # print(BlockSpecialCodesManager().get_code_blocks("002582")) |
| | |
| | | # 已经成交的累计大卖单金额:用于初次上板尚未订阅的情况 |
| | | __already_total_sell_deal_big_order_money = {} |
| | | __redis_manager = redis_manager.RedisManager(3) |
| | | # 临时大单阈值,初次上板使用 |
| | | # 临时大单阈值,初次上板使用: {"代码":(金额,更新时间)} |
| | | __temp_big_order_threshold = {} |
| | | |
| | | def __init__(self): |
| | |
| | | if not is_first_limit_up_buy(code): |
| | | return self.get_big_order_threshold(code)[0], False |
| | | else: |
| | | money = self.get_temp_deal_big_order_threshold(code) |
| | | if not money: |
| | | money_info = self.get_temp_deal_big_order_threshold_info(code) |
| | | if not money_info or money_info[1] < time.time(): |
| | | # 默认阈值为 1个亿 |
| | | money = int(round(1e8)) |
| | | else: |
| | | money = money_info[0] |
| | | return money, True |
| | | |
| | | def __get_base_big_order_threshold(self, code): |
| | |
| | | @param money_info_list: 成交的大买单:[(订单号,总股数,成交金额,成交开始时间,成交结束时间, 最近的成交价格, 最近的卖单号, 涨停价成交金额)] |
| | | @return: |
| | | """ |
| | | if code in self.__temp_big_order_threshold: |
| | | if code in self.__temp_big_order_threshold and time.time() < self.__temp_big_order_threshold[code][1]: |
| | | return |
| | | if not money_info_list or len(money_info_list) < 2: |
| | | return |
| | | fmoney_list = [] |
| | | min_money = l2_data_util.get_big_money_val(gpcode_manager.get_limit_up_price_as_num(code), tool.is_ge_code(code)) |
| | | min_money = l2_data_util.get_big_money_val(gpcode_manager.get_limit_up_price_as_num(code), |
| | | tool.is_ge_code(code)) |
| | | for info in money_info_list: |
| | | # 要求是10s之内成交的 |
| | | if tool.trade_time_sub(tool.get_now_time_str(), l2_huaxin_util.convert_time(info[3])) > 10: |
| | | continue |
| | | if info[7] >= min_money: |
| | | # 涨停价成交部分是大单 |
| | | fmoney_list.append((info[7], info[0])) |
| | |
| | | return |
| | | money_list = [x[0] for x in fmoney_list] |
| | | # 计算大单: 前2个大单的均值 |
| | | self.__temp_big_order_threshold[code] = int(sum(money_list[:2]) // 2) |
| | | self.__temp_big_order_threshold[code] = (int(sum(money_list[:2]) // 2), time.time()+10) |
| | | async_log_util.info(logger_l2_radical_buy_data, |
| | | f"首次上板临时买大单:{code}-{self.__temp_big_order_threshold[code]}-{fmoney_list[:2]}") |
| | | |
| | | def get_temp_deal_big_order_threshold(self, code): |
| | | return self.__temp_big_order_threshold.get(code) |
| | | def get_temp_deal_big_order_threshold_info(self, code): |
| | | data = self.__temp_big_order_threshold.get(code) |
| | | return data |
| | | |
| | | |
| | | @tool.singleton |
| | |
| | | @param code: |
| | | @return: 过滤后的板块,过滤前的板块 |
| | | """ |
| | | # blocks = cls.get_code_kpl_blocks(code) |
| | | # match_blocks, info = CodeThirdBlocksManager().get_intersection_blocks_info(code, blocks) |
| | | # match_blocks -= constant.KPL_INVALID_BLOCKS |
| | | # fblocks = match_blocks & RealTimeKplMarketData.get_top_market_jingxuan_blocks() |
| | | # if not fblocks: |
| | | # fblocks = set() |
| | | # match_blocks_3, info = CodeThirdBlocksManager().get_intersection_blocks_info(code, blocks, same_count=3) |
| | | # if match_blocks_3: |
| | | # match_blocks_3 -= constant.KPL_INVALID_BLOCKS |
| | | # fblocks |= match_blocks_3 |
| | | # # 获取开盘啦历史涨停原因 |
| | | # kpl_history_blocks = CodesHisReasonAndBlocksManager().get_history_blocks_cache(code) |
| | | # if kpl_history_blocks: |
| | | # fblocks |= BlockMapManager().filter_blocks(kpl_history_blocks) |
| | | # jx_out_blocks = RealTimeKplMarketData.get_top_market_jingxuan_out_blocks() |
| | | # if jx_out_blocks: |
| | | # fblocks -= jx_out_blocks |
| | | # |
| | | # return fblocks, match_blocks |
| | | |
| | | # 新版本 |
| | | before_fblocks = LimitUpCodesBlockRecordManager().get_radical_buy_blocks(code) |
| | |
| | | jx_in_blocks = RealTimeKplMarketData.get_top_market_jingxuan_blocks() |
| | | if jx_in_blocks and block in jx_in_blocks: |
| | | return True, False |
| | | |
| | | if block in LimitUpCodesBlockRecordManager().get_new_blocks(): |
| | | # 今日新板块不考虑净流入 |
| | | return True, False |
| | | |
| | | # 获取当前板块涨停数量 |
| | | codes = LimitUpDataConstant.get_current_limit_up_block_codes(block) |
| | | if codes and len(codes) >= 5: |
| | |
| | | cls.__l2_big_order_deal_info_dict[code] = (deal_big_order_detail_info, tool.get_now_time_str()) |
| | | if total_trade_value == 0: |
| | | total_trade_value = 1 |
| | | cls.__l2_big_order_deal_rate_dict[code] = round(deal_big_order_detail_info[1][0]/total_trade_value, 2) |
| | | cls.__l2_big_order_deal_rate_dict[code] = round(deal_big_order_detail_info[1][0] / total_trade_value, 2) |
| | | |
| | | @classmethod |
| | | def get_big_order_info(cls, code): |
| | |
| | | """ |
| | | return cls.__l2_big_order_deal_info_dict.get(code) |
| | | |
| | | |
| | | @classmethod |
| | | def get_big_order_rate(cls, code): |
| | | """ |
| | |
| | | @return: |
| | | """ |
| | | return cls.__l2_big_order_deal_rate_dict.get(code) |
| | | |
| | | |
| | | |
| | | |
| | | def get_total_detal_big_order_details(code): |
| | |
| | | return datas |
| | | return None |
| | | |
| | | |
| | | def is_first_limit_up_buy(code): |
| | | """ |
| | | 是否是首封下单: (下单次数为0+没在涨停代码中) 或者 (处于下单状态 + 下单次数为1,且下单为首次下单) |
| | |
| | | selling_num = L2LimitUpSellDataManager.get_delegating_sell_num(code) |
| | | if selling_num is None: |
| | | selling_num = 0 |
| | | # 总卖 = 涨停主动买成交的累计金额 + 处于委托状态的涨停卖金额 |
| | | total_sell = __deal_active_buy_total_money[code] + selling_num * price |
| | | if total_sell == 0: |
| | | total_sell = 1 |
| | | rate = round(__deal_active_buy_total_money[code] / total_sell, 2) |
| | | # 获取当前的成交量比 |
| | | limit_up_price = gpcode_manager.get_limit_up_price_as_num(code) |
| | | volume_rate = code_volumn_manager.CodeVolumeManager().get_volume_rate_refer_in_5days(code, |
| | | total_sell_volume=int( |
| | | total_sell / limit_up_price)) |
| | | if volume_rate is None: |
| | | volume_rate = 0.5 |
| | | # 剩余涨停卖金额 |
| | | left_limit_up_sell_money = selling_num * price |
| | | |
| | | THRESHOLD_RATE = radical_buy_data_manager.get_volume_rate_threshold(code, volume_rate) |
| | | if rate >= THRESHOLD_RATE: |
| | | # 根据大单判断是否可以扫 |
| | | big_order_deal_result = radical_buy_data_manager.is_big_order_deal_enough(code, volume_rate, |
| | | refer_sell_money, for_buy=True) |
| | | if big_order_deal_result[0]: |
| | | return BUY_MODE_DIRECT, f"剩余涨停总卖额-{selling_num * price},原涨停总卖-{total_sell},已成交额-{__deal_active_buy_total_money[code]},成交比例-{rate}/{THRESHOLD_RATE}, 大单信息-{big_order_deal_result}" |
| | | else: |
| | | # 无大单成交就只能通过L2下单 |
| | | return BUY_MODE_BY_L2, f"无大单成交-{big_order_deal_result},原涨停总卖-{total_sell},已成交额-{__deal_active_buy_total_money[code]},成交比例-{rate}/{THRESHOLD_RATE} " |
| | | # 如果剩余总卖小于100w直接根据L2买入 |
| | | if left_limit_up_sell_money < 100e4: |
| | | return BUY_MODE_BY_L2, f"剩余总卖小于100w({left_limit_up_sell_money})" |
| | | |
| | | big_order_count = radical_buy_data_manager.EveryLimitupBigDealOrderManager().get_big_buy_deal_order_count(code) |
| | | big_order_money = radical_buy_data_manager.EveryLimitupBigDealOrderManager().get_big_buy_deal_order_money(code) |
| | | if big_order_count >= 2: |
| | | average_big_order_money = int(big_order_money / big_order_count) |
| | | if average_big_order_money > left_limit_up_sell_money: |
| | | # 剩余总卖小于均大单才能下单 |
| | | return BUY_MODE_DIRECT, f"剩余涨停总卖额-{left_limit_up_sell_money},均大单-{average_big_order_money}" |
| | | else: |
| | | return BUY_MODE_NONE, f"被动卖成交比例未达到:剩余涨停总卖额-{selling_num * price},原涨停总卖-{total_sell},已成交额-{__deal_active_buy_total_money[code]},成交比例-{rate}/{THRESHOLD_RATE}" |
| | | average_big_order_money = 0 |
| | | return BUY_MODE_NONE, f"均大单-{average_big_order_money}({big_order_money}/{big_order_count}),剩余涨停卖:{left_limit_up_sell_money}" |
| | | # #总卖 = 涨停主动买成交的累计金额 + 处于委托状态的涨停卖金额 |
| | | # total_sell = __deal_active_buy_total_money[code] + left_limit_up_sell_money |
| | | # if total_sell == 0: |
| | | # total_sell = 1 |
| | | # rate = round(__deal_active_buy_total_money[code] / total_sell, 2) |
| | | # # 获取当前的成交量比 |
| | | # limit_up_price = gpcode_manager.get_limit_up_price_as_num(code) |
| | | # volume_rate = code_volumn_manager.CodeVolumeManager().get_volume_rate_refer_in_5days(code, |
| | | # total_sell_volume=int( |
| | | # total_sell / limit_up_price)) |
| | | # if volume_rate is None: |
| | | # volume_rate = 0.5 |
| | | # |
| | | # THRESHOLD_RATE = radical_buy_data_manager.get_volume_rate_threshold(code, volume_rate) |
| | | # if rate >= THRESHOLD_RATE: |
| | | # # 根据大单判断是否可以扫 |
| | | # big_order_deal_result = radical_buy_data_manager.is_big_order_deal_enough(code, volume_rate, |
| | | # refer_sell_money, for_buy=True) |
| | | # if big_order_deal_result[0]: |
| | | # return BUY_MODE_DIRECT, f"剩余涨停总卖额-{selling_num * price},原涨停总卖-{total_sell},已成交额-{__deal_active_buy_total_money[code]},成交比例-{rate}/{THRESHOLD_RATE}, 大单信息-{big_order_deal_result}" |
| | | # else: |
| | | # # 无大单成交就只能通过L2下单 |
| | | # return BUY_MODE_BY_L2, f"无大单成交-{big_order_deal_result},原涨停总卖-{total_sell},已成交额-{__deal_active_buy_total_money[code]},成交比例-{rate}/{THRESHOLD_RATE} " |
| | | # else: |
| | | # return BUY_MODE_NONE, f"被动卖成交比例未达到:剩余涨停总卖额-{selling_num * price},原涨停总卖-{total_sell},已成交额-{__deal_active_buy_total_money[code]},成交比例-{rate}/{THRESHOLD_RATE}" |
| | | |
| | | |
| | | def is_can_buy_with_open_price(code, open_price): |