| | |
| | | from third_data.code_plate_key_manager import KPLCodeJXBlockManager, RealTimeKplMarketData |
| | | from third_data.history_k_data_manager import HistoryKDataManager |
| | | from third_data.history_k_data_util import JueJinApi, HistoryKDatasUtils |
| | | from third_data.kpl_data_constant import LimitUpDataConstant |
| | | from third_data.kpl_data_manager import KPLDataManager |
| | | from third_data.kpl_limit_up_data_manager import CodeLimitUpSequenceManager |
| | | from third_data.kpl_util import KPLDataType |
| | |
| | | client_id, |
| | | request_id) |
| | | |
| | | elif ctype == "get_same_block_limit_up_codes_count": |
| | | # 获取相同板块的涨停代码数量 |
| | | codes = data.get("codes") |
| | | codes = json.loads(codes) |
| | | block_codes = {} |
| | | for code in codes: |
| | | # 获取板块 |
| | | fblocks, before_fblocks = RadicalBuyBlockManager.get_code_blocks(code) |
| | | # 获取板块历史涨停 |
| | | for b in fblocks: |
| | | codes = LimitUpDataConstant.get_history_limit_up_block_codes(b) |
| | | if codes: |
| | | if code not in block_codes: |
| | | block_codes[code] = {} |
| | | block_codes[code][b] = len(codes) |
| | | self.send_response({"code": 0, "data": json.dumps(block_codes)}, |
| | | client_id, |
| | | request_id) |
| | | |
| | | |
| | | |
| | | except Exception as e: |
| | | logging.exception(e) |
| | |
| | | if not cls.__WantBuyCodesManager.is_in_cache( |
| | | code) and not gpcode_manager.GreenListCodeManager().is_in_cache(code): |
| | | return False, True, f"只买想买:没在想买单和绿单", True |
| | | if not cls.__WantBuyCodesManager.is_in_cache(code): |
| | | average_rate = cls.__Buy1PriceManager.get_average_rate(code) |
| | | if average_rate and average_rate <= 0.05: |
| | | return False, True, f"均价涨幅({average_rate})小于5%", True |
| | | |
| | | return True, False, f"", False |
| | | |
| | |
| | | history_limit_up_datas = [] |
| | | current_limit_up_datas = [] |
| | | __current_limit_up_block_codes = {} |
| | | __history_limit_up_block_codes = {} |
| | | |
| | | @classmethod |
| | | def set_current_limit_up_datas(cls, current_limit_up_datas): |
| | |
| | | # kpl_block_util.open_limit_up_time_range[1]: |
| | | # blocks |= set(d[6].split("、")) |
| | | blocks -= constant.KPL_INVALID_BLOCKS |
| | | if blocks: |
| | | for b in blocks: |
| | | if b not in cls.__history_limit_up_block_codes: |
| | | cls.__history_limit_up_block_codes[b] = set() |
| | | cls.__history_limit_up_block_codes[b].add(code) |
| | | cls.__history_code_blocks_dict[code] = BlockMapManager().filter_blocks(blocks) |
| | | cls.__history_code_data_dict[code] = d |
| | | |
| | |
| | | def get_current_limit_up_block_codes(cls, block): |
| | | return cls.__current_limit_up_block_codes.get(block) |
| | | |
| | | @classmethod |
| | | def get_history_limit_up_block_codes(cls, block): |
| | | return cls.__history_limit_up_block_codes.get(block) |
| | | |
| | | |
| | | if __name__ == "__main__": |
| | | ContainsLimitupCodesBlocksManager() |
| | |
| | | |
| | | @classmethod |
| | | def get_history_index(cls, code, block, yesterday_limit_up_codes, exclude_codes=None, ignore_open_limit_up=True): |
| | | return cls.__get_history_index(code, block, yesterday_limit_up_codes, exclude_codes, ignore_open_limit_up) |
| | | datas = cls.__get_history_index(code, block, yesterday_limit_up_codes, exclude_codes, ignore_open_limit_up) |
| | | return datas[0], datas[1] |
| | | |
| | | @classmethod |
| | | def filter_before_codes(cls, code, block, history_index, |
| | |
| | | break |
| | | else: |
| | | before_codes_info.append(block_codes_infos[i]) |
| | | return history_index, before_codes_info |
| | | return history_index, before_codes_info, limit_up_space_ge_60s_codes |
| | | |
| | | @classmethod |
| | | def __is_radical_buy_with_open_limitup(cls, code, block, yesterday_limit_up_codes): |
| | |
| | | open_limit_up_block_codes = list(open_limit_up_block_codes_dict.get(block)) |
| | | count = len(open_limit_up_block_codes) |
| | | # ----获取历史身位---- |
| | | history_index, history_before_codes_info = cls.__get_history_index(code, block, yesterday_limit_up_codes) |
| | | history_index, history_before_codes_info, limit_up_space_ge_60s_codes = cls.__get_history_index(code, block, |
| | | yesterday_limit_up_codes) |
| | | # ----获取实时身位---- |
| | | current_index, current_before_codes_info = cls.__get_current_index(code, block, yesterday_limit_up_codes, |
| | | limit_up_time=limit_up_timestamp) |
| | |
| | | # 只有一个开1 |
| | | # 获取包含高位板的身位 |
| | | # ----获取历史身位---- |
| | | history_index, history_before_codes_info = cls.__get_history_index(code, block, set()) |
| | | history_index, history_before_codes_info, limit_up_space_ge_60s_codes = cls.__get_history_index(code, block, |
| | | set()) |
| | | # ----获取实时身位---- |
| | | current_index, current_before_codes_info = cls.__get_current_index(code, block, set(), |
| | | limit_up_time=limit_up_timestamp) |
| | |
| | | return False, f"开1数量:{count},历史-{history_index + 1} 实时-{current_index + 1}" |
| | | |
| | | # 获取主板的身位(已经排除了开1的代码) |
| | | history_index, history_before_codes_info = cls.__get_history_index(code, block, |
| | | history_index, history_before_codes_info, limit_up_space_ge_60s_codes = cls.__get_history_index(code, block, |
| | | yesterday_limit_up_codes, |
| | | exclude_codes=exclude_codes) |
| | | # 过滤不正的原因 |
| | |
| | | return False, f"距离上个代码涨停已过去{THRESHOLD_MINUTES}分钟({current_before_codes_info[-1]})" |
| | | |
| | | # 包含高位板的整体排序 |
| | | all_history_index, all_history_before_codes_info = cls.__get_history_index(code, block, set(), |
| | | all_history_index, all_history_before_codes_info, limit_up_space_ge_60s_codes = cls.__get_history_index(code, |
| | | block, |
| | | set(), |
| | | ignore_open_limit_up=False) |
| | | |
| | | history_index_first, history_before_codes_info_first = cls.__get_history_index(code, block, |
| | | history_index_first, history_before_codes_info_first, limit_up_space_ge_60s_codes = cls.__get_history_index( |
| | | code, block, |
| | | yesterday_limit_up_codes, |
| | | ignore_open_limit_up=False) |
| | | all_first_history_before_codes = [x[0] for x in history_before_codes_info_first] |
| | |
| | | open_limit_up_code_dict = kpl_data_constant.open_limit_up_code_dict_for_radical_buy |
| | | if open_limit_up_code_dict: |
| | | exclude_codes |= set(open_limit_up_code_dict.keys()) |
| | | origin_history_index, origin_history_before_codes_info = cls.__get_history_index(code, block, |
| | | origin_history_index, origin_history_before_codes_info, limit_up_space_ge_60s_codes = cls.__get_history_index( |
| | | code, block, |
| | | yesterday_limit_up_codes, |
| | | exclude_codes) |
| | | # 过滤不正的原因 |
| | |
| | | current_index, current_before_codes_info = cls.__get_current_index(code, block, set(), |
| | | limit_up_time=cls.__get_limit_up_timestamp( |
| | | code)) |
| | | history_index, history_before_codes_info = cls.__get_history_index(code, block, set()) |
| | | history_index, history_before_codes_info, limit_up_space_ge_60s_codes = cls.__get_history_index(code, block, |
| | | set()) |
| | | if current_index != history_index: |
| | | return False, f"有其他炸板" |
| | | if current_index >= 1: |
| | |
| | | # 获取板块炸板情况 |
| | | for k in LimitUpDataConstant.history_limit_up_datas: |
| | | _code = k[3] |
| | | if _code not in limit_up_space_ge_60s_codes: |
| | | continue |
| | | blocks = LimitUpCodesBlockRecordManager().get_radical_buy_blocks(_code) |
| | | if not blocks: |
| | | blocks = set() |
| | |
| | | block_codes = BlockSpecialCodesManager().get_block_codes(block) |
| | | if not block_codes or code not in block_codes: |
| | | return False, "无辨识度" |
| | | history_index, history_before_codes_info = cls.__get_history_index(code, block, yesterday_limit_up_codes, |
| | | history_index, history_before_codes_info, limit_up_space_ge_60s_codes = cls.__get_history_index(code, block, |
| | | yesterday_limit_up_codes, |
| | | ignore_open_limit_up=False) |
| | | if history_index > 5: |
| | | return False, f"处于首板老{history_index + 1}" |