| | |
| | | |
| | | @classmethod |
| | | def __save_buy1_price(cls, code, buy_1_price): |
| | | # 不保存重复的数据 |
| | | if code in cls.__current_buy_1_price and cls.__current_buy_1_price[code] == buy_1_price: |
| | | return |
| | | cls.__current_buy_1_price[code] = buy_1_price |
| | | RedisUtils.setex(cls.__get_redis(), f"buy1_price-{code}", tool.get_expire(), buy_1_price) |
| | | |
| | |
| | | day = tool.get_now_date_str() |
| | | is_target_code = gpcode_manager.FirstCodeManager().is_in_first_record_cache(code) |
| | | code_extra_infos = [] |
| | | if l2_trade_util.BlackListCodeManager.is_in_cache(code): |
| | | if l2_trade_util.BlackListCodeManager().is_in_cache(code): |
| | | code_extra_infos.append("黑名单") |
| | | if l2_trade_util.WhiteListCodeManager.is_in(code): |
| | | code_extra_infos.append("白名单") |
| | |
| | | return_str = json.dumps({"code": 0}) |
| | | elif type == 301: |
| | | # 黑名单列表 |
| | | codes = l2_trade_util.BlackListCodeManager.list_codes() |
| | | codes = l2_trade_util.BlackListCodeManager().list_codes() |
| | | datas = [] |
| | | for code in codes: |
| | | name = gpcode_manager.get_code_name(code) |
| | |
| | | |
| | | # 涨停列表中匹配关键词,返回(板块:代码集合),代码集合中已经排除自身 |
| | | if not keys: |
| | | return cls.BLOCK_TYPE_NONE, None, "尚未找到涨停原因" |
| | | return None, "尚未找到涨停原因" |
| | | code_limit_up_reason_dict = {} |
| | | load_code_block() |
| | | msg_list = [] |
| | |
| | | f"板块-{block}: 不是top4涨停板块,满足精选/行业流入要求,不为主板龙1(实时身位-{current_shsz_rank},历史身位-{record_shsz_rank})") |
| | | continue |
| | | if len(can_buy_blocks) == len(keys): |
| | | blocks = "/".join([x[0] for x in can_buy_blocks]) |
| | | blocks = [x[0] for x in can_buy_blocks] |
| | | blocks_msg = "\n".join([x[1] for x in can_buy_blocks]) |
| | | return blocks, blocks_msg |
| | | |
| | |
| | | if constant.TEST: |
| | | return True, "", cls.BLOCK_TYPE_NONE |
| | | |
| | | block, block_msg = cls.get_can_buy_block(code, current_limit_up_datas, |
| | | limit_up_record_datas, yesterday_current_limit_up_codes, |
| | | before_blocks_dict) |
| | | if block is None: |
| | | blocks, block_msg = cls.get_can_buy_block(code, current_limit_up_datas, |
| | | limit_up_record_datas, yesterday_current_limit_up_codes, |
| | | before_blocks_dict) |
| | | if not blocks: |
| | | return False, block_msg |
| | | |
| | | # ---------------------------------判断目标代码的板块-------------------start------------ |
| | |
| | | # ---------------------------------加载已经下单/成交的代码信息------------end------------- |
| | | |
| | | msg_list = [] |
| | | for key in [block]: |
| | | for key in blocks: |
| | | # 板块中已经有成交的就不下单了 |
| | | if key in trade_success_blocks_count: |
| | | success_codes_count = len(trade_success_blocks_count[key]) |
| | | if success_codes_count >= 2: |
| | | if success_codes_count >= 1: |
| | | msg_list.append(f"【{key}】中已经有{success_codes_count}个成交代码") |
| | | log.logger_kpl_debug.debug(f"{code}:板块({key})已经有成交【{trade_success_blocks_count[key]}】") |
| | | continue |
| | |
| | | limit_up_dict, limit_up_codes, open_limit_up_codes = limit_up_data_filter.get_limit_up_info(codes_set) |
| | | score_dict = limit_up_data_filter.get_codes_scores_dict(codes_set) |
| | | want_codes = gpcode_manager.WantBuyCodesManager().list_code_cache() |
| | | black_codes = BlackListCodeManager.list_codes() |
| | | black_codes = BlackListCodeManager().list_codes() |
| | | total_datas = KPLLimitUpDataRecordManager.total_datas |
| | | code_info_dict = {} |
| | | for val in total_datas: |
| | |
| | | |
| | | |
| | | class BlackListCodeManager: |
| | | __redis_manager = redis_manager.RedisManager(2) |
| | | __forbidden_trade_codes_cache = set() |
| | | __instance = None |
| | | |
| | | @classmethod |
| | | def __get_redis(cls): |
| | | return cls.__redis_manager.getRedis() |
| | | def __new__(cls, *args, **kwargs): |
| | | if not cls.__instance: |
| | | cls.__instance = super(BlackListCodeManager, cls).__new__(cls, *args, **kwargs) |
| | | # 初始化设置 |
| | | # 获取交易窗口的锁 |
| | | cls.__instance.__redis_manager = redis_manager.RedisManager(2) |
| | | cls.__instance.__forbidden_trade_codes_cache = RedisUtils.smembers(cls.__instance.__get_redis(), |
| | | "forbidden-trade-codes") |
| | | |
| | | @classmethod |
| | | def add_code(cls, code): |
| | | cls.__forbidden_trade_codes_cache.add(code) |
| | | RedisUtils.sadd(cls.__get_redis(), "forbidden-trade-codes", code) |
| | | RedisUtils.expire(cls.__get_redis(), "forbidden-trade-codes", tool.get_expire()) |
| | | return cls.__instance |
| | | |
| | | @classmethod |
| | | def remove_code(cls, code): |
| | | cls.__forbidden_trade_codes_cache.discard(code) |
| | | RedisUtils.srem(cls.__get_redis(), "forbidden-trade-codes", code) |
| | | def __get_redis(self): |
| | | return self.__redis_manager.getRedis() |
| | | |
| | | @classmethod |
| | | def is_in(cls, code): |
| | | return RedisUtils.sismember(cls.__get_redis(), "forbidden-trade-codes", code) |
| | | def add_code(self, code): |
| | | self.__forbidden_trade_codes_cache.add(code) |
| | | RedisUtils.sadd(self.__get_redis(), "forbidden-trade-codes", code) |
| | | RedisUtils.expire(self.__get_redis(), "forbidden-trade-codes", tool.get_expire()) |
| | | |
| | | @classmethod |
| | | def is_in_cache(cls, code): |
| | | return code in cls.__forbidden_trade_codes_cache |
| | | def remove_code(self, code): |
| | | self.__forbidden_trade_codes_cache.discard(code) |
| | | RedisUtils.srem(self.__get_redis(), "forbidden-trade-codes", code) |
| | | |
| | | @classmethod |
| | | def list_codes(cls): |
| | | codes = RedisUtils.smembers(cls.__get_redis(), "forbidden-trade-codes") |
| | | cls.__forbidden_trade_codes_cache = codes |
| | | def is_in(self, code): |
| | | return RedisUtils.sismember(self.__get_redis(), "forbidden-trade-codes", code) |
| | | |
| | | def is_in_cache(self, code): |
| | | return code in self.__forbidden_trade_codes_cache |
| | | |
| | | def list_codes(self): |
| | | codes = RedisUtils.smembers(self.__get_redis(), "forbidden-trade-codes") |
| | | self.__forbidden_trade_codes_cache = codes |
| | | return codes |
| | | |
| | | @classmethod |
| | | def clear(cls): |
| | | cls.__forbidden_trade_codes_cache.clear() |
| | | RedisUtils.delete(cls.__get_redis(), "forbidden-trade-codes") |
| | | def clear(self): |
| | | self.__forbidden_trade_codes_cache.clear() |
| | | RedisUtils.delete(self.__get_redis(), "forbidden-trade-codes") |
| | | |
| | | |
| | | # 初始化禁止交易代码库 |
| | | def init_forbidden_trade_codes(): |
| | | BlackListCodeManager.clear() |
| | | BlackListCodeManager.add_code("000000") |
| | | BlackListCodeManager().clear() |
| | | BlackListCodeManager().add_code("000000") |
| | | |
| | | |
| | | # 移除禁止交易代码 |
| | | def remove_from_forbidden_trade_codes(code): |
| | | BlackListCodeManager.remove_code(code) |
| | | BlackListCodeManager().remove_code(code) |
| | | |
| | | |
| | | # 添加代码到禁止交易 |
| | | def add_to_forbidden_trade_codes(code): |
| | | BlackListCodeManager.add_code(code) |
| | | BlackListCodeManager().add_code(code) |
| | | |
| | | |
| | | # 禁止代码交易 |
| | |
| | | |
| | | |
| | | def is_in_forbidden_trade_codes(code): |
| | | return BlackListCodeManager.is_in_cache(code) |
| | | return BlackListCodeManager().is_in_cache(code) |
| | | |
| | | |
| | | if __name__ == "__main__": |
| | |
| | | |
| | | # 代码实时价格管理器 |
| | | class CodeActualPriceProcessor: |
| | | __redisManager = redis_manager.RedisManager(0) |
| | | __instance = None |
| | | |
| | | def __new__(cls, *args, **kwargs): |
| | | if not cls.__instance: |
| | | cls.__instance = super(CodeActualPriceProcessor, cls).__new__(cls, *args, **kwargs) |
| | | # 初始化设置 |
| | | # 获取交易窗口的锁 |
| | | cls.__instance.__redisManager = redis_manager.RedisManager(0) |
| | | cls.__instance.__under_water_last_time_cache = {} |
| | | cls.__instance.__code_current_rate_cache = {} |
| | | |
| | | return cls.__instance |
| | | |
| | | def __get_redis(self): |
| | | return self.__redisManager.getRedis() |
| | |
| | | # 保存跌价的时间 |
| | | def __save_down_price_time(self, code, time_str): |
| | | key = "under_water_last_time-{}".format(code) |
| | | tool.CodeDataCacheUtil.set_cache(self.__under_water_last_time_cache, code, time_str) |
| | | RedisUtils.setex(self.__get_redis(), key, tool.get_expire(), time_str) |
| | | |
| | | def __remove_down_price_time(self, code): |
| | | key = "under_water_last_time-{}".format(code) |
| | | tool.CodeDataCacheUtil.clear_cache(self.__under_water_last_time_cache, code) |
| | | RedisUtils.delete(self.__get_redis(), key) |
| | | |
| | | def __get_last_down_price_time(self, code): |
| | | key = "under_water_last_time-{}".format(code) |
| | | return RedisUtils.get(self.__get_redis(), key) |
| | | |
| | | def __get_last_down_price_time_cache(self, code): |
| | | cache_result = tool.CodeDataCacheUtil.get_cache(self.__under_water_last_time_cache, code) |
| | | if cache_result[0]: |
| | | return cache_result[1] |
| | | val = self.__get_last_down_price_time(code) |
| | | tool.CodeDataCacheUtil.set_cache(self.__under_water_last_time_cache, code, val) |
| | | return val |
| | | |
| | | def __increment_down_price_time(self, code, seconds): |
| | | key = "under_water_seconds-{}".format(code) |
| | |
| | | |
| | | # 保存当前涨幅 |
| | | def __save_current_rate(self, code, rate): |
| | | tool.CodeDataCacheUtil.set_cache(self.__code_current_rate_cache, code, rate) |
| | | key = "code_current_rate-{}".format(code) |
| | | RedisUtils.setex(self.__get_redis(), key, tool.get_expire(), rate) |
| | | |
| | |
| | | return None |
| | | |
| | | def get_current_rate(self, code): |
| | | return self.__get_current_rate(code) |
| | | cache_result = tool.CodeDataCacheUtil.get_cache(self.__code_current_rate_cache, code) |
| | | if cache_result[0]: |
| | | return cache_result[1] |
| | | val = self.__get_current_rate(code) |
| | | tool.CodeDataCacheUtil.set_cache(self.__code_current_rate_cache, code, val) |
| | | return val |
| | | |
| | | def process_rate(self, code, rate, time_str): |
| | | # 保存目前的代码涨幅 |
| | |
| | | return |
| | | # now_str = tool.get_now_time_str() |
| | | if rate >= 0: |
| | | down_start_time = self.__get_last_down_price_time(code) |
| | | down_start_time = self.__get_last_down_price_time_cache(code) |
| | | if down_start_time is None: |
| | | return |
| | | else: |
| | |
| | | self.__remove_down_price_time(code) |
| | | else: |
| | | # 记录开始值 |
| | | if self.__get_last_down_price_time(code) is None: |
| | | if self.__get_last_down_price_time_cache(code) is None: |
| | | self.__save_down_price_time(code, time_str) |
| | | |
| | | # 保存现价 |
| | |
| | | infos = [] |
| | | for k in keys: |
| | | code = k.split("-")[1] |
| | | rate = self.__get_current_rate(code) |
| | | rate = self.get_current_rate(code) |
| | | infos.append((code, rate)) |
| | | # 排序信息 |
| | | sorted_infos = sorted(infos, key=lambda tup: tup[1], reverse=True) |