| | |
| | | 代码价格管理 |
| | | """ |
| | | import json |
| | | import threading |
| | | import time |
| | | |
| | | from code_attribute.gpcode_manager import CodePrePriceManager |
| | | from db.redis_manager_delegate import RedisUtils |
| | | from utils import tool |
| | | from utils import tool, middle_api_protocol |
| | | from db import redis_manager_delegate as redis_manager |
| | | from log_module.log import logger_trade_queue_price_info |
| | | |
| | |
| | | (limit_up_time, open_limit_up_time)) |
| | | RedisUtils.setex_async(self.__db, f"buy1_price_limit_up_info-{code}", tool.get_expire(), |
| | | json.dumps((limit_up_time, open_limit_up_time))) |
| | | |
| | | |
| | | def __get_buy1_price_limit_up_info_cache(self, code): |
| | | cache_result = tool.CodeDataCacheUtil.get_cache(self.__buy1_price_limit_up_info_cache, code) |
| | |
| | | return self.__latest_3m_buy1_money_list_dict.get(code) |
| | | |
| | | |
| | | class CurrentPriceManager: |
| | | """ |
| | | 现价管理 |
| | | """ |
| | | # 代码涨幅数据 |
| | | __current_rate_dict = {} |
| | | # 最近上传时间 |
| | | __latest_upload_time = 0 |
| | | |
| | | @classmethod |
| | | def set_current_price(cls, code, price): |
| | | """ |
| | | 设置现价 |
| | | @param code: |
| | | @param price: |
| | | @return: |
| | | """ |
| | | pre_close_price = CodePrePriceManager.get_price_pre_cache(code) |
| | | if pre_close_price: |
| | | rate = round((price - pre_close_price) * 100 / pre_close_price, 2) |
| | | cls.__current_rate_dict[code] = rate |
| | | # 判断是否要上传 |
| | | if time.time() - cls.__latest_upload_time >= 3: |
| | | # 间隔3s上传 |
| | | cls.__latest_upload_time = time.time() |
| | | threading.Thread(target=lambda: middle_api_protocol.request( |
| | | middle_api_protocol.load_l2_subscript_codes_rate(cls.__current_rate_dict)), daemon=True).start() |
| | | |
| | | |
| | | if __name__ == "__main__": |
| | | print(Buy1PriceManager().get_limit_up_info("002777")) |
| | |
| | | average_rate = cls.__Buy1PriceManager.get_average_rate(code) |
| | | if average_rate : |
| | | if tool.is_ge_code(code): |
| | | if average_rate <= 0.07: |
| | | return False, True, f"均价涨幅({average_rate})小于7%", True |
| | | if average_rate <= 0.1: |
| | | return False, True, f"均价涨幅({average_rate})小于10%", True |
| | | else: |
| | | if average_rate <= 0.03: |
| | | return False, True, f"均价涨幅({average_rate})小于3%", True |
| | | if average_rate <= 0.05: |
| | | return False, True, f"均价涨幅({average_rate})小于5%", True |
| | | return True, False, f"", False |
| | | |
| | | @classmethod |
| | |
| | | # 是否是交易队列触发 |
| | | # 扫入下单只有L撤能撤单 |
| | | if order_begin_pos and order_begin_pos.mode == OrderBeginPosInfo.MODE_RADICAL and cancel_type not in { |
| | | trade_constant.CANCEL_TYPE_L_DOWN, trade_constant.CANCEL_TYPE_L, trade_constant.CANCEL_TYPE_RD}: |
| | | trade_constant.CANCEL_TYPE_L_DOWN, trade_constant.CANCEL_TYPE_L, trade_constant.CANCEL_TYPE_RD, trade_constant.CANCEL_TYPE_P}: |
| | | l2_log.cancel_debug(code, "撤单中断,原因:{}", "扫入下单不是L撤") |
| | | return False |
| | | # 加绿只有L撤/人撤生效 |
| | | if gpcode_manager.GreenListCodeManager().is_in_cache(code): |
| | | if cancel_type not in {trade_constant.CANCEL_TYPE_L, trade_constant.CANCEL_TYPE_L_UP, |
| | | trade_constant.CANCEL_TYPE_L_DOWN, trade_constant.CANCEL_TYPE_RD}: |
| | | trade_constant.CANCEL_TYPE_L_DOWN, trade_constant.CANCEL_TYPE_RD, trade_constant.CANCEL_TYPE_P}: |
| | | l2_log.cancel_debug(code, "撤单中断,原因:{}", "加绿不是L撤") |
| | | return False |
| | | |
| | |
| | | if not need_cancel: |
| | | need_cancel, cancel_msg = FCancelBigNumComputer().need_cancel_for_p(code, |
| | | order_begin_pos) |
| | | cancel_type = trade_constant.CANCEL_TYPE_F |
| | | cancel_type = trade_constant.CANCEL_TYPE_P |
| | | # 判断时间是否与本地时间相差5s以上 |
| | | if tool.trade_time_sub(tool.get_now_time_str(), l2_huaxin_util.convert_time(datas[-1][3])) > 10: |
| | | now_seconds = int(tool.get_now_time_str().replace(":", "")) |
| | |
| | | |
| | | @classmethod |
| | | def l2_market_data(cls, code, data): |
| | | |
| | | def update_kpl_jx_block(code_, buy_1_price_, limit_up_price_): |
| | | # ----------------------------------板块相关------------------------------ |
| | | try: |
| | | if code_ in cls.__updating_jx_blocks_codes: |
| | | return |
| | | cls.__updating_jx_blocks_codes.add(code_) |
| | | cls.__KPLCodeJXBlockManager.load_jx_blocks(code_, buy_1_price_, limit_up_price_, |
| | | kpl_data_manager.KPLLimitUpDataRecordManager.get_current_reasons()) |
| | | # 更新板块信息 |
| | | latest_current_limit_up_records = kpl_data_manager.get_latest_current_limit_up_records() |
| | | |
| | | codes_delegate = set(CodesTradeStateManager().get_codes_by_trade_states_cache( |
| | | {trade_constant.TRADE_STATE_BUY_DELEGATED, trade_constant.TRADE_STATE_BUY_PLACE_ORDER})) |
| | | codes_success = set(CodesTradeStateManager().get_codes_by_trade_states_cache( |
| | | {trade_constant.TRADE_STATE_BUY_SUCCESS})) |
| | | |
| | | CodePlateKeyBuyManager.update_can_buy_blocks(code_, |
| | | kpl_data_manager.KPLLimitUpDataRecordManager.latest_origin_datas, |
| | | kpl_data_manager.KPLLimitUpDataRecordManager.total_datas, |
| | | latest_current_limit_up_records, |
| | | block_info.get_before_blocks_dict(), |
| | | kpl_data_manager.KPLLimitUpDataRecordManager.get_current_limit_up_reason_codes_dict(), |
| | | codes_delegate, codes_success) |
| | | finally: |
| | | cls.__updating_jx_blocks_codes.discard(code_) |
| | | |
| | | time_str = f"{data['dataTimeStamp']}" |
| | | if time_str.startswith("9"): |
| | | time_str = "0" + time_str |
| | | time_str = time_str[:6] |
| | | time_str = f"{time_str[0:2]}:{time_str[2:4]}:{time_str[4:6]}" |
| | | time_str = l2_huaxin_util.convert_time(time_str) |
| | | buy_1_price, buy_1_volume = data["buy"][0] |
| | | sell_1_price, sell_1_volume = data["sell"][0] |
| | | limit_up_price = gpcode_manager.get_limit_up_price_as_num(code) |
| | | # 涨幅 |
| | | price = data['lastPrice'] |
| | | |
| | | code_price_manager.CurrentPriceManager.set_current_price(code, price) |
| | | |
| | | code_price_manager.Buy1PriceManager().set_latest_buy1_money(code, buy_1_price, buy_1_volume) |
| | | |
| | |
| | | except Exception as e: |
| | | logger_debug.exception(e) |
| | | |
| | | if limit_up_price is not None: |
| | | pre_close_price = CodePrePriceManager.get_price_pre_cache(code) |
| | | if pre_close_price is not None: |
| | | average_rate = None |
| | | try: |
| | | average_price = data["totalValueTrade"] / data["totalVolumeTrade"] |
| | | pre_close_price = CodePrePriceManager.get_price_pre_cache(code) |
| | | average_rate = round((average_price - pre_close_price) / pre_close_price, 4) |
| | | except: |
| | | pass |
| | |
| | | |
| | | |
| | | if __name__ == "__main__": |
| | | datas = LatestLimitUpBlockManager().statistics_limit_up_block_infos() |
| | | print(datas) |
| | | # datas = LatestLimitUpBlockManager().statistics_limit_up_block_infos() |
| | | # print(datas) |
| | | code = "600126" |
| | | blocks = LimitUpCodesBlockRecordManager().get_radical_buy_blocks(code) |
| | | print(blocks) |
| | |
| | | f"SELECT r.`_hot_block_name`, r.`_code`, COUNT(*) FROM kpl_limit_up_record r WHERE r.`_day`>'{min_day}' and r.`_day`<'{max_day}' and r._code not like '68%' group by r.`_hot_block_name`, r.`_code`") |
| | | return results |
| | | |
| | | def __list_code_blocks(self, min_day, max_day): |
| | | results = self.__mysql.select_all( |
| | | f"SELECT r.`_hot_block_name`, r.`_code`, r.`_day` FROM kpl_limit_up_record r WHERE r.`_day`>'{min_day}' and r.`_day`<'{max_day}' and r._code not like '68%'") |
| | | return results |
| | | |
| | | def __get_limit_up_info(self, min_day): |
| | | sql = f"SELECT r.`_code`, COUNT(r.`_code`),r.`_code_name`,IF( r.`_zylt_val` is null, 1, r.`_zylt_val`/100000000 ) FROM (SELECT * FROM kpl_limit_up_record r ORDER BY r.`_create_time` DESC) r WHERE r.`_day`>'{min_day}' GROUP BY r.`_code`" |
| | | results = self.__mysql.select_all(sql) |
| | |
| | | 获取板块有辨识度的代码 |
| | | @return: |
| | | """ |
| | | trading_dates = HistoryKDatasUtils.get_latest_trading_date(8) |
| | | max_day = trading_dates[-1] |
| | | trading_dates = HistoryKDatasUtils.get_latest_trading_date(9) |
| | | max_day = trading_dates[0] |
| | | min_day = tool.date_sub(max_day, 180) |
| | | |
| | | block_map = self.__get_block_map() |
| | | # [(板块名称,代码, 在板块中的涨停次数)] |
| | | code_block_infos = self.__get_code_blocks(min_day, max_day) |
| | | # 统计最近180天涨停数据 |
| | | # [(板块名称,代码, 日期)] |
| | | code_block_infos = self.__list_code_blocks(min_day, max_day) |
| | | |
| | | # 统计最近8天的涨停数据 |
| | | min_day = trading_dates[-1] |
| | | code_block_infos_8 = self.__get_code_blocks(min_day, max_day) |
| | | # 统计涨停次数大于3次的涨停代码 |
| | | # 格式:{"代码":涨停次数} |
| | | count_dict = {} |
| | | filter_codes = set() |
| | | for d in code_block_infos_8: |
| | | if d[1] not in count_dict: |
| | | count_dict[d[1]] = 0 |
| | | count_dict[d[1]] += d[2] |
| | | if count_dict[d[1]] > 3: |
| | | filter_codes.add(d[1]) |
| | | count_dict.clear() |
| | | code_block_infos_8.clear() |
| | | |
| | | # 删除数据 |
| | | temp_data_dict = {} |
| | | for d in code_block_infos: |
| | | if d[1] in filter_codes and int(d[2].replace("-", "")) > int(min_day.replace("-", "")): |
| | | # 需要过滤且最近8天涨停 |
| | | continue |
| | | block, code = d[0], d[1] |
| | | k = f"{block}#{code}" |
| | | if k not in temp_data_dict: |
| | | temp_data_dict[k] = [block, code, 0] |
| | | temp_data_dict[k][2] += 1 |
| | | code_block_infos = [temp_data_dict[k] for k in temp_data_dict] |
| | | |
| | | min_day = tool.date_sub(max_day, 180) |
| | | |
| | | code_block_dict = {} # {"代码":{"板块": 涨停次数}} |
| | | for b in code_block_infos: |
| | | if b[1] not in code_block_dict: |
| | |
| | | for bb in bs: |
| | | if bb not in code_block_dict[b[1]]: |
| | | code_block_dict[b[1]][bb] = 0 |
| | | code_block_dict[b[1]][bb] += b[2] |
| | | if tool.is_ge_code(b[1]): |
| | | # 创业板1次涨停算2次涨停 |
| | | code_block_dict[b[1]][bb] += b[2] * 2 |
| | | else: |
| | | code_block_dict[b[1]][bb] += b[2] |
| | | block_codes_dict = {} # {"板块":[(代码,涨停次数)]} |
| | | for code in code_block_dict: |
| | | for b in code_block_dict[code]: |
| | |
| | | if __name__ == "__main__": |
| | | # print(datas) |
| | | datas = AnalysisBlockSpecialCodesManager().get_block_special_codes() |
| | | print(datas) |
| | | # print(BlockSpecialCodesManager().get_code_blocks("002582")) |
| | |
| | | return |
| | | money_list = [x[0] for x in fmoney_list] |
| | | money_list = money_list[:2] |
| | | # 计算大单: 前2个大单的均值 |
| | | # 计算大单: 前2个大单+万手的均值 |
| | | # if tool.is_ge_code(code): |
| | | # money_list.append(gpcode_manager.get_limit_up_price_as_num(code) * 300000) |
| | | # else: |
| | | # money_list.append(gpcode_manager.get_limit_up_price_as_num(code) * 1000000) |
| | | self.__temp_big_order_threshold[code] = ( |
| | | int(sum(money_list) // len(money_list)), time.time() + 10, len(money_list) < 2) |
| | | async_log_util.info(logger_l2_radical_buy_data, |
| | |
| | | |
| | | # RD撤 |
| | | CANCEL_TYPE_RD = 12 |
| | | |
| | | # P撤 |
| | | CANCEL_TYPE_P = 13 |
| | |
| | | fdata = {"type": "l2_subscript_codes", "data": {"ctype": "l2_subscript_codes", "data": datas}} |
| | | return fdata |
| | | |
| | | # ------------------------------L2订阅代码的实时涨幅------------------------------------ |
| | | def load_l2_subscript_codes_rate(datas): |
| | | fdata = {"type": "l2_subscript_codes_rate", "data": {"ctype": "l2_subscript_codes_rate", "data": datas}} |
| | | return fdata |
| | | |
| | | |
| | | # ------------------------------消息推送------------------------------------ |
| | | def load_push_msg(data): |