| | |
| | | val = json.loads(val) |
| | | cls.__max_price_info_cache[code] = val |
| | | |
| | | def set_price_info(self, code, price, time): |
| | | def set_price_info(self, code, price, time, sell1_info): |
| | | """ |
| | | 设置价格信息 |
| | | @param sell1_info: 卖1信息:(卖1价, 卖1量) |
| | | @param code: |
| | | @param price: |
| | | @param time: |
| | |
| | | old_price_info = self.__max_price_info_cache.get(code) |
| | | if old_price_info and old_price_info[0] >= price: |
| | | return |
| | | price_info = (price, time) |
| | | price_info = (price, time, sell1_info) |
| | | tool.CodeDataCacheUtil.set_cache(self.__max_price_info_cache, code, price_info) |
| | | RedisUtils.setex_async( |
| | | self.__db, "max_price_info-{}".format(code), tool.get_expire(), json.dumps(price_info)) |
| | |
| | | if out_tool.get_limit_up_rate(pMarketDataField.SecurityID) > 1.1001: |
| | | # 涨停板20%以上的打折 |
| | | rate = rate / 2 |
| | | # (代码, 现价, 涨幅, 量, 当前时间, 买1价, 买1量, 买2价, 买2量, 更新时间) |
| | | # (代码, 现价, 涨幅, 量, 当前时间, 买1价, 买1量, 买2价, 买2量, 更新时间, 卖1价, 卖1量) |
| | | level1_data_dict[pMarketDataField.SecurityID] = ( |
| | | pMarketDataField.SecurityID, pMarketDataField.LastPrice, rate, pMarketDataField.Volume, time.time(), |
| | | pMarketDataField.BidPrice1, pMarketDataField.BidVolume1, pMarketDataField.BidPrice2, |
| | | pMarketDataField.BidVolume2, pMarketDataField.UpdateTime) |
| | | pMarketDataField.BidVolume2, pMarketDataField.UpdateTime, pMarketDataField.AskPrice1, |
| | | pMarketDataField.AskVolume1) |
| | | |
| | | |
| | | __latest_subscript_codes = set() |
| | |
| | | from trade.buy_radical.new_block_processor import BeforeBlocksComputer |
| | | from trade.buy_strategy import OpenLimitUpGoodBlocksBuyStrategy |
| | | from trade.buy_radical.radical_buy_data_manager import RadicalBuyBlockManager, BeforeSubDealBigOrderManager |
| | | from utils import global_util, tool, data_export_util, init_data_util |
| | | from trade.huaxin import huaxin_trade_record_manager |
| | | from trade.trade_data_manager import RadicalBuyDealCodesManager |
| | | from utils import global_util, tool, data_export_util, init_data_util, huaxin_util |
| | | from code_attribute import gpcode_manager, code_nature_analyse |
| | | from log_module import log_analyse, log_export, async_log_util |
| | | from l2 import code_price_manager, l2_data_util, transaction_progress |
| | | from cancel_strategy.s_l_h_cancel_strategy import HourCancelBigNumComputer, LCancelRateManager |
| | | from cancel_strategy.s_l_h_cancel_strategy import HourCancelBigNumComputer, LCancelRateManager, \ |
| | | CancelRateHumanSettingManager |
| | | from output.limit_up_data_filter import IgnoreCodeManager |
| | | from third_data import kpl_util, kpl_data_manager, kpl_api, block_info |
| | | from third_data.code_plate_key_manager import RealTimeKplMarketData, KPLPlateForbiddenManager |
| | |
| | | except: |
| | | is_limit_up = 0 |
| | | pass |
| | | |
| | | # 获取L后人为设置的撤单比例 |
| | | l_down_human_rate = None |
| | | if single_code: |
| | | # 获取挂单 |
| | | try: |
| | | current_delegates = huaxin_trade_record_manager.DelegateRecordManager().list_current_delegates() |
| | | codes_set = set() |
| | | if current_delegates: |
| | | for c in current_delegates: |
| | | if int(c["direction"]) != huaxin_util.TORA_TSTP_D_Buy: |
| | | continue |
| | | codes_set.add(c["securityID"]) |
| | | if code not in codes_set: |
| | | # 没有挂单 |
| | | l_down_human_rate = CancelRateHumanSettingManager().get_l_down(code) |
| | | except: |
| | | pass |
| | | fresults.append( |
| | | (code, code_name, deal_big_order_info, deal_big_order_detail_info, big_order_enough_type, |
| | | current_rate_dict.get(code, 0), is_limit_up)) |
| | | current_rate_dict.get(code, 0), is_limit_up, l_down_human_rate)) |
| | | response_data = json.dumps({"code": 0, "data": fresults}) |
| | | except Exception as e: |
| | | response_data = json.dumps({"code": 1, "data": str(1)}) |
| | |
| | | response_data = json.dumps({"code": 0, "data": fdata}) |
| | | elif url.path == "/get_want_buy_detail_list": |
| | | # 获取想买单详细信息 |
| | | codes = gpcode_manager.WantBuyCodesManager().list_code_cache() |
| | | |
| | | history_limit_up_datas = LimitUpDataConstant.history_limit_up_datas |
| | | codes = set() |
| | | if history_limit_up_datas: |
| | | codes |= set([x[3] for x in history_limit_up_datas]) |
| | | want_codes = gpcode_manager.WantBuyCodesManager().list_code_cache() |
| | | if want_codes: |
| | | codes |= want_codes |
| | | # 拉取涨停时间 |
| | | # 拉取最近成交信息 |
| | | fdatas = [] |
| | | yesterday_codes = kpl_data_manager.get_yesterday_limit_up_codes() |
| | | for code in codes: |
| | | # (代码,名称,涨停时间,涨幅,现手,自由市值,现价) |
| | | data = [code, gpcode_manager.get_code_name(code)] |
| | |
| | | data.append(price) |
| | | else: |
| | | data.append("--") |
| | | # 是否是想买单 |
| | | data.append(1 if code in want_codes else 0) |
| | | # 显示代码板块身位 |
| | | block_rank_info = None |
| | | # 获取当前板块 |
| | | try: |
| | | if limit_up_time: |
| | | # 涨停过的数据才有身位 |
| | | blocks = LimitUpCodesBlockRecordManager().get_radical_buy_blocks(code) |
| | | if blocks: |
| | | blocks_info=[] |
| | | for b in blocks: |
| | | info = radical_buy_data_manager.RadicalBuyBlockManager.get_history_index(code,b, yesterday_codes) |
| | | blocks_info.append((b,info[0],info[2])) |
| | | max_info = max(blocks_info, key= lambda x:x[2]) |
| | | block_rank_info = max_info |
| | | except: |
| | | pass |
| | | data.append(block_rank_info) |
| | | fdatas.append(data) |
| | | |
| | | |
| | | |
| | | fdatas.sort(key=lambda x: x[2] if x[2] else time.time()) |
| | | response_data = json.dumps({"code": 0, "data": fdatas}) |
| | | |
| | |
| | | # 09:25之后才开始记录 |
| | | if datas and tool.get_now_time_str() > '09:25:00': |
| | | for d in datas: |
| | | MaxPriceInfoManager().set_price_info(d[0], price=d[1], time=d[9]) |
| | | MaxPriceInfoManager().set_price_info(d[0], price=d[1], time=d[9], sell1_info=(d[10], d[11])) |
| | | except Exception as e: |
| | | logger_debug.exception(e) |
| | | |
| | |
| | | @classmethod |
| | | def get_history_index(cls, code, block, yesterday_limit_up_codes, exclude_codes=None, ignore_open_limit_up=True): |
| | | datas = cls.__get_history_index(code, block, yesterday_limit_up_codes, exclude_codes, ignore_open_limit_up) |
| | | return datas[0], datas[1] |
| | | return datas[0], datas[1], datas[3] |
| | | |
| | | @classmethod |
| | | def filter_before_codes(cls, code, block, history_index, |
| | |
| | | @param yesterday_limit_up_codes: |
| | | @param exclude_codes: |
| | | @param ignore_open_limit_up: 是否忽略开1代码 |
| | | @return: |
| | | @return:身位,前排代码信息,炸板代码持续涨停时间小于1分钟的代码,板块代码总数 |
| | | """ |
| | | if exclude_codes is None: |
| | | exclude_codes = set() |
| | |
| | | # 不是这个板块 |
| | | if block not in blocks: |
| | | continue |
| | | |
| | | # 剔除高位板 |
| | | if _code in yesterday_limit_up_codes: |
| | | continue |
| | | # 剔除4板以上且板块数量大于1个 |
| | | if CodeHighLevel().get_high_level(_code) >= 4 and len(blocks) > 1: |
| | | continue |
| | |
| | | # 剔除开1的数据 |
| | | if ignore_open_limit_up and timestamp_start <= int(k[5]) < timestamp_end: |
| | | continue |
| | | # 剔除高位板 |
| | | if _code in yesterday_limit_up_codes: |
| | | continue |
| | | |
| | | # 剔除炸板代码持续涨停时间小于1分钟的代码 且 只能用于不排除前2条数据 |
| | | if _code not in cls.__current_limit_up_codes and _code in cls.__total_limit_up_space_dict and \ |
| | | cls.__total_limit_up_space_dict[_code] < 60 and not exclude_codes and len( |
| | |
| | | break |
| | | else: |
| | | before_codes_info.append(block_codes_infos[i]) |
| | | return history_index, before_codes_info, limit_up_space_ge_60s_codes |
| | | return history_index, before_codes_info, limit_up_space_ge_60s_codes, len(block_codes_infos) |
| | | |
| | | @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, limit_up_space_ge_60s_codes = 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) |
| | | # ----获取实时身位---- |
| | | current_index, current_before_codes_info = cls.__get_current_index(code, block, yesterday_limit_up_codes, |
| | |
| | | # 只有一个开1 |
| | | # 获取包含高位板的身位 |
| | | # ----获取历史身位---- |
| | | history_index, history_before_codes_info, limit_up_space_ge_60s_codes = cls.__get_history_index(code, block, |
| | | 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(), |
| | |
| | | return False, f"开1数量:{count},历史-{history_index + 1} 实时-{current_index + 1}" |
| | | |
| | | # 获取主板的身位(已经排除了开1的代码) |
| | | history_index, history_before_codes_info, limit_up_space_ge_60s_codes = 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, limit_up_space_ge_60s_codes = cls.__get_history_index(code, |
| | | 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, limit_up_space_ge_60s_codes = cls.__get_history_index( |
| | | 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) |
| | |
| | | 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, limit_up_space_ge_60s_codes = cls.__get_history_index( |
| | | 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, limit_up_space_ge_60s_codes = cls.__get_history_index(code, block, |
| | | 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"有其他炸板" |
| | |
| | | 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, limit_up_space_ge_60s_codes = 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, |
| | | ignore_open_limit_up=False) |
| | | if history_before_codes_info: |
| | |
| | | if len(codes) < 2: |
| | | return False, "板块涨停个数小于2个" |
| | | |
| | | history_index, history_before_codes_info, limit_up_space_ge_60s_codes = 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, |
| | | ignore_open_limit_up=False) |
| | | if history_before_codes_info: |
| | |
| | | delete_blocks.add(b) |
| | | continue |
| | | # 新题材只买前2 |
| | | history_index, history_before_codes_info, limit_up_space_ge_60s_codes = cls.__get_history_index( |
| | | history_index, history_before_codes_info, limit_up_space_ge_60s_codes,_ = cls.__get_history_index( |
| | | code, b, |
| | | yesterday_limit_up_codes) |
| | | if history_index > 1: |