| | |
| | | logger_trade, logger_trade_position_api_request, logger_request_api, \ |
| | | logger_real_place_order_position, logger_device |
| | | from output import l2_output_util |
| | | from third_data import kpl_data_manager, kpl_util, history_k_data_manager, huaxin_l1_data_manager |
| | | from third_data import kpl_data_manager, kpl_util, history_k_data_manager, huaxin_l1_data_manager, third_blocks_manager |
| | | from third_data.code_plate_key_manager import CodePlateKeyBuyManager, KPLCodeJXBlockManager |
| | | from third_data.history_k_data_manager import HistoryKDataManager |
| | | from third_data.history_k_data_util import JueJinApi, HistoryKDatasUtils |
| | |
| | | l1_subscript_codes_manager.save_codes(codes_sh, codes_sz) |
| | | result = {"code": 0, "data": {"codes_sh": len(codes_sh), "codes_sz": len(codes_sz)}} |
| | | self.send_response(result, client_id, request_id) |
| | | # 拉取三方板块 |
| | | codes = [] |
| | | codes.extend(codes_sh) |
| | | codes.extend(codes_sz) |
| | | threading.Thread(target=third_blocks_manager.load_if_less, args=(codes,), daemon=True).start() |
| | | except Exception as e: |
| | | logger_debug.error(e) |
| | | |
| | |
| | | kpl_blocks = KPLCodeJXBlockManager().get_jx_blocks_radical(code) |
| | | if kpl_blocks is None: |
| | | kpl_blocks = set() |
| | | if not kpl_blocks: |
| | | KPLCodeJXBlockManager().load_jx_blocks_radical(code) |
| | | match_blocks, info = CodeThirdBlocksManager().get_intersection_blocks_info(code, kpl_blocks) |
| | | source_origin_dict[SOURCE_TYPE_KPL] = kpl_blocks |
| | | source_dict[SOURCE_TYPE_KPL] = BlockMapManager().filter_blocks(kpl_blocks) |
| | |
| | | request_id) |
| | | except Exception as e: |
| | | logging.exception(e) |
| | | logger_debug.exception(e) |
| | | self.send_response({"code": 1, "msg": f"数据处理出错:{e}"}, client_id, request_id) |
| | | finally: |
| | | use_time = time.time() - __start_time |
| | |
| | | __buy_compute_index_info_cache = {} |
| | | __buy_cancel_single_pos_cache = {} |
| | | __instance = None |
| | | # 最近的下单模式 |
| | | __latest_place_order_mode_cache = {} |
| | | |
| | | def __new__(cls, *args, **kwargs): |
| | | if not cls.__instance: |
| | |
| | | |
| | | # 获取买入点信息 |
| | | # 返回数据为:买入点 累计纯买额 已经计算的数据索引 |
| | | |
| | | def get_buy_compute_start_data(self, code): |
| | | _key = "buy_compute_index_info-{}".format(code) |
| | | _data_json = RedisUtils.get(self.__get_redis(), _key) |
| | |
| | | # nums 累计纯买额 |
| | | |
| | | def set_buy_compute_start_data_v2(self, code, order: OrderBeginPosInfo): |
| | | |
| | | if order.mode is not None: |
| | | self.__latest_place_order_mode_cache[code] = order.mode |
| | | |
| | | expire = tool.get_expire() |
| | | _key = "buy_compute_index_info-{}".format(code) |
| | | data_ = None |
| | |
| | | def is_placed_order(cls, order_begin_pos: OrderBeginPosInfo): |
| | | return order_begin_pos and order_begin_pos.buy_exec_index is not None and order_begin_pos.buy_exec_index > -1 |
| | | |
| | | @classmethod |
| | | def get_latest_place_order_mode(cls, code): |
| | | """ |
| | | 获取最近下单的模式 |
| | | @param code: |
| | | @return: |
| | | """ |
| | | return cls.__latest_place_order_mode_cache.get(code) |
| | | |
| | | |
| | | # 清除l2数据 |
| | | def clear_l2_data(code): |
| | |
| | | |
| | | if order_begin_pos.MODE_RADICAL == order_begin_pos.mode: |
| | | # 积极下单不判断条件 |
| | | can, need_clear_data, reason, is_valid_exec_index = True, False, "激进下单", True |
| | | can, need_clear_data, reason, is_valid_exec_index = True, False, "扫入下单", True |
| | | else: |
| | | can, need_clear_data, reason, is_valid_exec_index = cls.__can_buy_first(code) |
| | | |
| | |
| | | # 是否是交易队列触发 |
| | | order_begin_pos = cls.__get_order_begin_pos( |
| | | code) |
| | | # 激进下单只有L撤能撤单 |
| | | # 扫入下单只有L撤能撤单 |
| | | if order_begin_pos and order_begin_pos.mode == OrderBeginPosInfo.MODE_RADICAL and cancel_type not in { |
| | | trade_constant.CANCEL_TYPE_L, trade_constant.CANCEL_TYPE_L_UP, trade_constant.CANCEL_TYPE_L_DOWN}: |
| | | return False |
| | |
| | | buy_count += int(total_datas[i]["re"]) |
| | | if buy_nums >= threshold_num: |
| | | l2_log.info(code, logger_l2_trade_buy, |
| | | f"{code}获取到买入执行点(激进下单):{i} 统计纯买手数:{buy_nums} 目标纯买手数:{threshold_num} 统计纯买单数:{buy_count}") |
| | | f"{code}获取到买入执行点(积极下单):{i} 统计纯买手数:{buy_nums} 目标纯买手数:{threshold_num} 统计纯买单数:{buy_count}") |
| | | elif L2DataUtil.is_limit_up_price_buy_cancel(_val): |
| | | # 判断买入位置是否在买入信号之前 |
| | | buy_index = l2_data_source_util.L2DataSourceUtils.get_buy_index_with_cancel_data_v2(total_datas[i], |
| | |
| | | |
| | | safe_count = 1 |
| | | if active_buy_blocks and current_sell_data[1] > 5000000: |
| | | # 有激进板块且大于500w才能激进下单 |
| | | # 有激进板块且大于500w才能扫入下单 |
| | | safe_count = 1 |
| | | else: |
| | | # 无激进下单板块 |
| | |
| | | mode = data.get('mode') |
| | | mode_desc = data.get('mode_desc') |
| | | if mode == OrderBeginPosInfo.MODE_ACTIVE: |
| | | records_new_data.append((time_, "激进下单", |
| | | records_new_data.append((time_, "积极下单", |
| | | mode_desc, |
| | | extra_datas)) |
| | | elif mode == OrderBeginPosInfo.MODE_FAST: |
| | | records_new_data.append((time_, "闪电下单", |
| | | mode_desc, |
| | | extra_datas)) |
| | | elif mode == OrderBeginPosInfo.MODE_RADICAL: |
| | | records_new_data.append((time_, "扫入下单", |
| | | mode_desc, |
| | | extra_datas)) |
| | | else: |
| | | records_new_data.append((time_, "常规下单", |
| | | mode_desc, |
| | |
| | | if huaxin_util.is_deal(order_status): |
| | | if int(str(data["direction"])) == huaxin_util.TORA_TSTP_D_Buy: |
| | | l2_trade_util.forbidden_trade(data["securityID"], msg="已成交", force=True) |
| | | RadicalBuyDealCodesManager().add_deal_code(data["securityID"]) |
| | | if TradePointManager.get_latest_place_order_mode(data["securityID"]) == OrderBeginPosInfo.MODE_RADICAL: |
| | | RadicalBuyDealCodesManager().add_deal_code(data["securityID"]) |
| | | # 成交,更新成交列表与资金列表 |
| | | huaxin_trade_data_update.add_deal_list() |
| | | huaxin_trade_data_update.add_money_list() |
| | |
| | | l2_data_manager_new.L2TradeDataProcessor.start_buy(code, total_datas[-1], total_datas[-1]["index"], |
| | | True) |
| | | else: |
| | | l2_log.debug(code, "积极下单,不满足激进下单条件,无法激进") |
| | | l2_log.debug(code, "积极下单,不满足扫入下单条件,无法扫入") |
| | | else: |
| | | if not tool.is_sz_code(code): |
| | | return |
| | |
| | | |
| | | if price_rate > 0.03: |
| | | if not self.__code_blocks_for_radical_buy.get(code): |
| | | start_time = time.time() |
| | | blocks = kpl_api.getCodeJingXuanBlocks(code, jx=False) |
| | | blocks = set([b[1] for b in blocks]) |
| | | # fblocks = BlockMapManager().filter_blocks(blocks) |
| | | async_log_util.info(logger_kpl_block_can_buy, |
| | | f"{code}:获取到板块(激进买) 过滤前-{blocks} 耗时:{int(time.time() - start_time)}s") |
| | | self.save_jx_blocks_for_radical_buy(code, list(blocks)) |
| | | self.load_jx_blocks_radical(code) |
| | | except Exception as e: |
| | | logger_kpl_block_can_buy.error(f"{code} 获取板块出错") |
| | | logger_kpl_block_can_buy.exception(e) |
| | | |
| | | def load_jx_blocks_radical(self, code): |
| | | start_time = time.time() |
| | | blocks = kpl_api.getCodeJingXuanBlocks(code, jx=False) |
| | | blocks = set([b[1] for b in blocks]) |
| | | # fblocks = BlockMapManager().filter_blocks(blocks) |
| | | async_log_util.info(logger_kpl_block_can_buy, |
| | | f"{code}:获取到板块(激进买) 过滤前-{blocks} 耗时:{int(time.time() - start_time)}s") |
| | | self.save_jx_blocks_for_radical_buy(code, list(blocks)) |
| | | |
| | | |
| | | # 禁止下单的板块 |
| | | class ForbiddenBlockManager: |
| | |
| | | return cls.__current_reason_codes_dict.keys() |
| | | return set() |
| | | |
| | | @classmethod |
| | | def get_new_blocks(cls, day): |
| | | """ |
| | | 获取某一天新出现的板块 |
| | | @param day: |
| | | @return: |
| | | """ |
| | | sql = f"SELECT k.`_hot_block_name`, k.`_day` FROM `kpl_limit_up_record` k GROUP BY k.`_hot_block_name` HAVING k.`_day`='{day}' ORDER BY k.`_day` DESC" |
| | | mysqldb = mysql_data.Mysqldb() |
| | | results = mysqldb.select_all(sql) |
| | | return [x[0] for x in results] |
| | | |
| | | |
| | | class KPLDataManager: |
| | | __latest_datas = {} |
| | |
| | | from itertools import combinations |
| | | |
| | | from db.mysql_data_delegate import Mysqldb |
| | | from third_data import kpl_api |
| | | from third_data import kpl_api, block_web_api |
| | | from utils import middle_api_protocol |
| | | |
| | | SOURCE_TYPE_KPL = 1 # 东方财富 |
| | | SOURCE_TYPE_TDX = 2 # 通达信 |
| | |
| | | return self.__block_map.keys() |
| | | |
| | | |
| | | def load_if_less(codes): |
| | | """ |
| | | 加载 |
| | | @param codes: |
| | | @return: |
| | | """ |
| | | for code in codes: |
| | | source_blocks = CodeThirdBlocksManager().get_source_blocks_origin(code) |
| | | if source_blocks is None: |
| | | source_blocks = {} |
| | | all_source = {SOURCE_TYPE_EASTMONEY, SOURCE_TYPE_TDX, SOURCE_TYPE_THS} |
| | | sources = all_source - source_blocks.keys() |
| | | for source in sources: |
| | | try: |
| | | blocks = middle_api_protocol.request(middle_api_protocol.get_third_blocks(code, source)) |
| | | if blocks: |
| | | CodeThirdBlocksManager().set_blocks(code, blocks, source) |
| | | except: |
| | | pass |
| | | |
| | | |
| | | if __name__ == '__main__': |
| | | code = "000761" |
| | | blocks = kpl_api.getCodeJingXuanBlocks(code, jx=False) |
| | | blocks = set([b[1] for b in blocks]) |
| | | print(CodeThirdBlocksManager().get_intersection_blocks_info(code, blocks)) |
| | | try: |
| | | blocks = middle_api_protocol.request(middle_api_protocol.get_third_blocks(code, 4)) |
| | | print(blocks) |
| | | except Exception as e: |
| | | print(e) |
| | |
| | | from db import mysql_data_delegate as mysql_data, redis_manager_delegate as redis_manager |
| | | from db.mysql_data_delegate import Mysqldb |
| | | from db.redis_manager_delegate import RedisUtils |
| | | from l2.l2_data_manager import OrderBeginPosInfo |
| | | from l2.l2_data_manager import OrderBeginPosInfo, TradePointManager |
| | | from log_module import async_log_util |
| | | from output import kp_client_msg_manager |
| | | from trade import trade_data_manager, l2_trade_util, trade_juejin, trade_huaxin, trade_constant |
| | |
| | | # 加入黑名单 |
| | | if not l2_trade_util.is_in_forbidden_trade_codes(code): |
| | | l2_trade_util.forbidden_trade(code, "buy success", force=True) |
| | | RadicalBuyDealCodesManager().add_deal_code(code) |
| | | if TradePointManager().get_latest_place_order_mode(code) == OrderBeginPosInfo.MODE_RADICAL: |
| | | RadicalBuyDealCodesManager().add_deal_code(code) |
| | | # 取s消所有的挂单 |
| | | if constant.API_TRADE_ENABLE: |
| | | if constant.TRADE_WAY == constant.TRADE_WAY_JUEJIN: |
| | |
| | | def load_push_msg(data): |
| | | fdata = {"type": "push_msg", "data": {"ctype": "push_msg", "data": data}} |
| | | return fdata |
| | | |
| | | |
| | | # ------------------------------获取三方板块------------------------------------ |
| | | def get_third_blocks(code, source): |
| | | fdata = {"type": "get_third_blocks", "data": {"ctype": "get_third_blocks", "data": {"code": code, "source": source}}} |
| | | return fdata |