| | |
| | | return False |
| | | __start_time = tool.get_now_timestamp() |
| | | |
| | | can, need_clear_data, reason = cls.__can_buy_first(code) |
| | | can, need_clear_data, reason, is_valid_exec_index = cls.__can_buy_first(code) |
| | | |
| | | # __start_time = l2_data_log.l2_time(code, tool.get_now_timestamp() - __start_time, "最后判断是否能下单", force=True) |
| | | # 删除虚拟下单 |
| | |
| | | order_begin_pos = cls.__get_order_begin_pos( |
| | | code) |
| | | if not can: |
| | | if not is_valid_exec_index: |
| | | if cls.__latest_exec_indexes.get(code) and cls.__latest_exec_indexes[code][ |
| | | -1] == order_begin_pos.buy_exec_index: |
| | | # 如果执行位置算做无效,就需要删除当前执行位置 |
| | | cls.__latest_exec_indexes[code].pop() |
| | | l2_log.debug(code, "不可以下单,原因:{}", reason) |
| | | trade_record_log_util.add_cant_place_order_log(code, reason) |
| | | if need_clear_data: |
| | |
| | | |
| | | @classmethod |
| | | def __can_buy_first(cls, code): |
| | | # if code.find("60") == 0: |
| | | # return False, True, f"上证暂不交易" |
| | | """ |
| | | 是否可以下单 |
| | | @param code: |
| | | @return:(是否可以下单, 是否清理信号数据, 不能下单消息, 是否算有效执行) |
| | | """ |
| | | |
| | | if not cls.__TradeStateManager.is_can_buy_cache(): |
| | | return False, True, f"今日已禁止交易" |
| | | return False, True, f"今日已禁止交易", True |
| | | |
| | | if l2_trade_util.is_in_forbidden_trade_codes(code): |
| | | return False, True, f"代码禁止交易" |
| | | return False, True, f"代码禁止交易", True |
| | | |
| | | if cls.__PauseBuyCodesManager.is_in_cache(code): |
| | | return False, True, f"该代码被暂停交易" |
| | | return False, True, f"该代码被暂停交易", True |
| | | now_time_int = int(tool.get_now_time_str().replace(":", "")) |
| | | if now_time_int >= 145700: |
| | | return False, True, f"14:57后不能交易" |
| | | return False, True, f"14:57后不能交易", True |
| | | if 130100 >= now_time_int >= 112900 or now_time_int < 93100: |
| | | if now_time_int < 93100: |
| | | # 判断近120天是否有涨停 |
| | | k_format = code_nature_analyse.CodeNatureRecordManager().get_k_format_cache(code) |
| | | if k_format and len(k_format) >= 12 and not k_format[11]: |
| | | return False, True, f"09:31:00之前下单,90个交易日无涨停" |
| | | return False, True, f"09:31:00之前下单,90个交易日无涨停", True |
| | | |
| | | # 判断成交的大单数量 |
| | | data_list = BigOrderDealManager().get_total_buy_money_list(code) |
| | |
| | | fdatas.append(d) |
| | | thresh_count = 3 if tool.is_sh_code(code) else 1 |
| | | if len(fdatas) < thresh_count: |
| | | return False, True, f"09:31:00之前下单,成交大单数量({len(fdatas)})不足{thresh_count}个" |
| | | return False, True, f"09:31:00之前下单,成交大单数量({len(fdatas)})不足{thresh_count}个", True |
| | | else: |
| | | # 判断数据是否卡 |
| | | total_datas = local_today_datas.get(code) |
| | | if tool.trade_time_sub_with_ms(tool.get_now_time_with_ms_str(), |
| | | L2DataUtil.get_time_with_ms(total_datas[-1]["val"])) > 500: |
| | | return False, True, f"09:31:00之前下单,L2数据时间相差500ms以上" |
| | | return False, True, f"09:31:00之前下单,L2数据时间相差500ms以上", True |
| | | else: |
| | | return False, True, f"09:31:00之前,11:29:00-13:01:00不能交易" |
| | | |
| | | # place_order_count = cls.__PlaceOrderCountManager.get_place_order_count(code) |
| | | # if place_order_count > 0 and now_time_int >= 140000: |
| | | # # 14:00:00后只打老大的回封 |
| | | # return False, True, f"14:00:00不打回封" |
| | | return False, True, f"09:31:00之前,11:29:00-13:01:00不能交易", True |
| | | |
| | | limit_up_price = gpcode_manager.get_limit_up_price_as_num(code) |
| | | |
| | |
| | | # 小市值高股价可买 |
| | | zyltgb = global_util.zyltgb_map.get(code) |
| | | if zyltgb > 25e8 or limit_up_price > constant.MAX_SUBSCRIPT_CODE_PRICE: |
| | | return False, True, f"股价大于{constant.MAX_CODE_PRICE}块/小于{constant.MIN_CODE_PRICE}块" |
| | | return False, True, f"股价大于{constant.MAX_CODE_PRICE}块/小于{constant.MIN_CODE_PRICE}块", True |
| | | else: |
| | | return False, True, f"股价小于{constant.MIN_CODE_PRICE}块" |
| | | return False, True, f"股价小于{constant.MIN_CODE_PRICE}块", True |
| | | |
| | | # place_order_count = cls.__PlaceOrderCountManager.get_place_order_count(code) |
| | | # if place_order_count and place_order_count >= 10: |
| | |
| | | # ---------均价约束------------- |
| | | average_rate = cls.__Buy1PriceManager.get_average_rate(code) |
| | | if average_rate and average_rate <= 0.01 and tool.trade_time_sub(tool.get_now_time_str(), "10:30:00") >= 0: |
| | | return False, True, f"均价涨幅({average_rate})小于1%" |
| | | return False, True, f"均价涨幅({average_rate})小于1%", True |
| | | |
| | | total_data = local_today_datas.get(code) |
| | | |
| | |
| | | if limit_up_data: |
| | | limit_up_time = tool.to_time_str(limit_up_data[2]) |
| | | if int(limit_up_time.replace(":", "")) < int("093000"): |
| | | return False, True, f"上证开一09:32之前不下单" |
| | | return False, True, f"上证开一09:32之前不下单", True |
| | | |
| | | # ------------挂单时间约束---------- |
| | | order_begin_pos = cls.__get_order_begin_pos( |
| | | code) |
| | | if not trade_result_manager.can_place_order_for_cancel_time(code, total_data[order_begin_pos.buy_exec_index]): |
| | | return False, True, f"距离上次挂单小于时间限制" |
| | | return False, True, f"距离上次挂单小于时间限制", True |
| | | |
| | | # ------------板块约束------------- |
| | | if not cls.__WantBuyCodesManager.is_in_cache(code): |
| | | # 想买单无板块约束 |
| | | block_buy_result = buy_strategy_util.is_block_can_buy(code, cls.__get_can_buy_block(code)) |
| | | if not block_buy_result[0]: |
| | | return block_buy_result |
| | | return block_buy_result[0], block_buy_result[1], block_buy_result[2], True |
| | | |
| | | if constant.L2_SOURCE_TYPE == constant.L2_SOURCE_TYPE_HUAXIN: |
| | | # ---------------------判断是否为板上放量---------------------- |
| | | trade_price = current_price_process_manager.get_trade_price(code) |
| | | if trade_price is None: |
| | | return False, True, f"尚未获取到当前成交价" |
| | | return False, True, f"尚未获取到当前成交价", True |
| | | # 判断是否为板上放量: |
| | | # 1.当前成交价为涨停价 |
| | | # 2.距离最近的非板上成交的时间大于一个阈值 |
| | |
| | | trade_index, |
| | | order_begin_pos.buy_single_index) |
| | | if not cancel_rate_reieved_info[0]: |
| | | return False, True, f"板上放量距离远({not_limit_up_trade_time_with_ms}),有小群撤, 整体撤单比例不足({trade_index}-{order_begin_pos.buy_single_index}){cancel_rate_reieved_info[1]}" |
| | | return False, True, f"板上放量距离远({not_limit_up_trade_time_with_ms}),有小群撤, 整体撤单比例不足({trade_index}-{order_begin_pos.buy_single_index}){cancel_rate_reieved_info[1]}", False |
| | | else: |
| | | return False, True, f"板上放量距离远({not_limit_up_trade_time_with_ms}),没有小群撤({trade_index}-{order_begin_pos.buy_single_index})" |
| | | return False, True, f"板上放量距离远({not_limit_up_trade_time_with_ms}),没有小群撤({trade_index}-{order_begin_pos.buy_single_index})", False |
| | | except Exception as e: |
| | | l2_log.info(code, logger_l2_error, f"板上放量({not_limit_up_trade_time_with_ms})不足异常:{str(e)}") |
| | | logger_l2_error.exception(e) |
| | | return False, True, f"板上放量计算异常" |
| | | return False, True, f"板上放量计算异常", False |
| | | |
| | | # -------是否距离成交进度位太远-------- |
| | | buy1_money = code_price_manager.Buy1PriceManager().get_latest_buy1_money(code) |
| | |
| | | if not buy1_money: |
| | | buy1_money = 1 |
| | | if buy_strategy_util.is_far_away_from_trade_index(code, trade_index, buy1_money): |
| | | return False, True, f"距离成交进度位太远:成交进度-{trade_index} 买1-{buy1_money}" |
| | | return False, True, f"距离成交进度位太远:成交进度-{trade_index} 买1-{buy1_money}", False |
| | | |
| | | # ------------------上证下单需要有成交大单(包含主动买与被动买)或者挂买的大单----------------- |
| | | if tool.is_sh_code(code): |
| | |
| | | limit_up_price, |
| | | min_money=min_money) |
| | | if left_count < 1: |
| | | return False, False, f"没有已挂或者成交的大单" |
| | | return False, False, f"没有已挂或者成交的大单", False |
| | | place_order_count = trade_data_manager.PlaceOrderCountManager().get_place_order_count(code) |
| | | # ------------------第一和第二次下单都必须要有至少一笔未成交的大单-------------------------- |
| | | # 计算大单 |
| | |
| | | total_datas[-1]["index"], |
| | | limit_up_price, min_money) |
| | | if left_count < 1: |
| | | return False, False, f"第{place_order_count + 1}下单无待成交的大单" |
| | | return False, False, f"第{place_order_count + 1}下单无待成交的大单", False |
| | | |
| | | # -------判断是否是量化下单,如果是就不跟到下单-------- |
| | | # 重要:量化下单会增加下单次数,板块下单中有下单次数的使用,所以板块需要在量化判断之前 |
| | |
| | | is_quantization_result = buy_strategy_util.is_quantization(code, range_indexes[0], range_indexes[1]) |
| | | if is_quantization_result[0]: |
| | | cls.__next_buy_time_dict[code] = is_quantization_result[1] |
| | | return False, True, is_quantization_result[2] |
| | | return True, False, "满足下单条件" |
| | | return False, True, is_quantization_result[2], True |
| | | return True, False, "满足下单条件", True |
| | | |
| | | # 获取可以买的板块 |
| | | @classmethod |