From e9680308bd91bb112c29f03a1316a0fc49e1917a Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期一, 09 九月 2024 14:58:35 +0800 Subject: [PATCH] 一个板块扫入之后不能再次扫入 --- l2/l2_data_manager_new.py | 175 +++++++++++++++++++++++++++++++++------------------------- 1 files changed, 99 insertions(+), 76 deletions(-) diff --git a/l2/l2_data_manager_new.py b/l2/l2_data_manager_new.py index c689068..6ec5472 100644 --- a/l2/l2_data_manager_new.py +++ b/l2/l2_data_manager_new.py @@ -691,29 +691,29 @@ @classmethod def get_active_buy_blocks(cls, code): """ - 鑾峰彇婵�杩涗拱鍏ョ殑鏉垮潡 + 鑾峰彇绉瀬涔板叆鐨勬澘鍧� @param code: @return: """ if tool.is_sh_code(code): - # 涓婅瘉涓嶆縺杩涗笅鍗� + # 涓婅瘉涓嶇Н鏋佷笅鍗� return None current_total_sell_data = L2MarketSellManager().get_current_total_sell_data(code) place_order_count = trade_data_manager.PlaceOrderCountManager().get_place_order_count(code) - # 鍙湁鍒濇涓嬪崟 + 鎬绘姏鍘嬪ぇ浜�500w鑳芥縺杩涗笅鍗� + # 鍙湁鍒濇涓嬪崟 + 鎬绘姏鍘嬪ぇ浜�500w鑳界Н鏋佷笅鍗� if place_order_count > 0 or current_total_sell_data is None or current_total_sell_data[1] < 500 * 10000: return None if global_util.zyltgb_map.get(code) > 50 * 100000000: - # 50浜夸互涓婄殑鏃犳硶婵�杩涗笅鍗� + # 50浜夸互涓婄殑鏃犳硶绉瀬涓嬪崟 return None can_buy_result = CodePlateKeyBuyManager.can_buy(code) if can_buy_result: if can_buy_result[5]: return can_buy_result[5] elif not can_buy_result[0] and can_buy_result[1]: - # 10:00:00 鍓嶇殑鐙嫍鍙縺杩涗拱鍏� + # 10:00:00 鍓嶇殑鐙嫍鍙Н鏋佷拱鍏� if tool.trade_time_sub(tool.get_now_time_str(), "10:00:00") <= 0: return ["鐙嫍"] return None @@ -735,7 +735,7 @@ code) if order_begin_pos.MODE_RADICAL == order_begin_pos.mode: - # 婵�杩涗笅鍗曚笉鍒ゆ柇鏉′欢 + # 绉瀬涓嬪崟涓嶅垽鏂潯浠� 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) @@ -804,7 +804,7 @@ temps = [] temps.extend([f"{x[0]}" for x in can_buy_result[0]]) if can_buy_result[5]: - temps.append(f"婵�杩涗拱鍏ワ細{can_buy_result[5]}") + temps.append(f"绉瀬涔板叆锛歿can_buy_result[5]}") info.set_kpl_match_blocks(temps) trade_record_log_util.add_place_order_log(code, info) except Exception as e: @@ -856,8 +856,17 @@ return True, "" @classmethod - def __is_on_limit_up_buy(cls, code, buy_exec_index): + def __is_at_limit_up_buy(cls, code, buy_exec_index=None): + """ + 鏄惁鏄澘涓婃斁閲忎拱 + @param code: + @param buy_exec_index: + @return: + """ total_data = local_today_datas.get(code) + if buy_exec_index is None: + # 鎵ц浣嶇疆涓虹┖锛屽氨鍙栨渶杩戠殑涓�鏉℃暟鎹� + buy_exec_index = total_data[-1]["index"] latest_exec_indexes = cls.__latest_exec_indexes[code] if not latest_exec_indexes: latest_exec_indexes = [] @@ -984,7 +993,7 @@ # 1.褰撳墠鎴愪氦浠蜂负娑ㄥ仠浠� # 2.璺濈鏈�杩戠殑闈炴澘涓婃垚浜ょ殑鏃堕棿澶т簬涓�涓槇鍊� if abs(limit_up_price - float(trade_price)) < 0.001: - is_limit_up_buy = cls.__is_on_limit_up_buy(code, order_begin_pos.buy_exec_index) + is_limit_up_buy = cls.__is_at_limit_up_buy(code, order_begin_pos.buy_exec_index) if is_limit_up_buy: # 鏉夸笂涔颁笖闈炲姞缁� # 鑾峰彇鏈�杩戠殑闈炴定鍋滀环鎴愪氦鏃堕棿 @@ -1360,21 +1369,42 @@ cls.unreal_buy_dict[code] = (buy_exec_index, capture_time) trade_result_manager.virtual_buy_success(code) - # 鏄惁鏄湪鏉夸笂涔� @classmethod - def __is_at_limit_up_buy(cls, code_): - # 鎬诲崠涓�0锛屽綋鍓嶆垚浜や环涓烘定鍋滀环灏卞垽鏂负鏉夸笂涔� - current_sell_data = cls.__L2MarketSellManager.get_current_total_sell_data(code_) - if current_sell_data and tool.trade_time_sub(tool.get_now_time_str(), current_sell_data[0]) < 5: - # 5s鍐呯殑鏁版嵁鎵嶆湁鏁� - if current_sell_data[1] <= 0: - # 鎬诲崠涓�0 - trade_price = current_price_process_manager.get_trade_price(code_) - limit_up_price = gpcode_manager.get_limit_up_price(code_) - if trade_price and limit_up_price and abs(float(trade_price) - float(limit_up_price)) <= 0.001: - # 褰撳墠鎴愪氦浠蜂负娑ㄥ仠浠� - return True - return False + def __process_with_find_exec_index(cls, code, order_begin_pos: OrderBeginPosInfo, compute_end_index): + """ + 澶勭悊鎵惧埌鎵ц浣嶇疆 + @return: + """ + total_datas = local_today_datas.get(code) + l2_log.debug(code, "鑾峰彇鍒颁拱鍏ユ墽琛屼綅缃細{} m鍊硷細{} 绾拱鎵嬫暟锛歿} 绾拱鍗曟暟锛歿} 鏄惁鏉夸笂涔帮細{} 鏁版嵁锛歿} ,閲忔瘮:{} ,涓嬪崟妯″紡锛歿}", + order_begin_pos.buy_exec_index, + order_begin_pos.threshold_money, + order_begin_pos.num, + order_begin_pos.count, order_begin_pos.at_limit_up, total_datas[order_begin_pos.buy_exec_index], + cls.volume_rate_info[code], order_begin_pos.mode) + cls.__save_order_begin_data(code, order_begin_pos) + cls.__LimitUpTimeManager.save_limit_up_time(code, total_datas[order_begin_pos.buy_exec_index]["val"]["time"]) + l2_log.debug(code, "delete_buy_cancel_point") + if code not in cls.__latest_exec_indexes: + cls.__latest_exec_indexes[code] = [] + cls.__latest_exec_indexes[code].append(order_begin_pos.buy_exec_index) + # 淇濈暀鏈�杩�3娆$殑涔板叆鎵ц浣嶇疆 + if len(cls.__latest_exec_indexes[code]) > 3: + cls.__latest_exec_indexes[code] = cls.__latest_exec_indexes[code][-3:] + + # 鐩存帴涓嬪崟 + ordered = cls.__buy(code, 0, total_datas[-1], total_datas[-1]["index"], True) + + # 鏁版嵁鏄惁澶勭悊瀹屾瘯 + if order_begin_pos.buy_exec_index < compute_end_index: + if ordered: + cls.__process_order(code, order_begin_pos.buy_exec_index + 1, compute_end_index, 0, True, + False) + else: + cls.__start_compute_buy(code, order_begin_pos.buy_exec_index + 1, compute_end_index, + order_begin_pos.threshold_money, + 0, + True, False) @classmethod def __start_compute_buy(cls, code, compute_start_index, compute_end_index, threshold_money, capture_time, @@ -1408,18 +1438,44 @@ _start_time = tool.get_now_timestamp() total_datas = local_today_datas[code] + # ---------璁$畻婵�杩涗拱鍏ョ殑淇″彿--------- + radical_result = cls.__compute_radical_order_begin_pos(code, compute_start_index, compute_end_index) + if radical_result[0]: + buy_single_index, buy_exec_index = radical_result[1], radical_result[1] + buy_volume_rate = cls.volume_rate_info[code][0] + refer_sell_data = cls.__L2MarketSellManager.get_refer_sell_data(code, total_datas[buy_single_index]["val"][ + "time"]) + if refer_sell_data: + sell_info = (refer_sell_data[0], refer_sell_data[1]) + else: + sell_info = (total_datas[buy_single_index]["val"]["time"], 0) + threshold_money = 0 + + order_begin_pos_info = OrderBeginPosInfo(buy_single_index=buy_single_index, + buy_exec_index=buy_exec_index, + buy_compute_index=buy_exec_index, + num=total_datas[buy_single_index]["val"]["num"], count=1, + max_num_set=set(), + buy_volume_rate=buy_volume_rate, + mode=OrderBeginPosInfo.MODE_RADICAL, + mode_desc="婵�杩涗拱鍏�", + sell_info=sell_info, + threshold_money=threshold_money) + order_begin_pos_info.at_limit_up = cls.__is_at_limit_up_buy(code) + cls.__process_with_find_exec_index(code, order_begin_pos_info, compute_end_index) + return + # 鑾峰彇涔板叆淇″彿璁$畻璧峰浣嶇疆 - order_begin_pos = cls.__get_order_begin_pos( - code) + order_begin_pos = cls.__get_order_begin_pos(code) # 鏄惁涓烘柊鑾峰彇鍒扮殑浣嶇疆 new_get_single = False buy_single_index = order_begin_pos.buy_single_index if buy_single_index is None: # ------------------------------纭畾淇″彿绉嶇被---------------------------------- - # 绗竴姝ワ細鑾峰彇婵�杩涗笅鍗曚俊鍙� + # 绗竴姝ワ細鑾峰彇绉瀬涓嬪崟淇″彿 # if code.find('60') == 0: - # 婵�杩涗拱 + # 绉瀬涔� continue_count = 1 has_single, _index, sell_info, single_msg, mode = cls.__compute_active_order_begin_pos(code, continue_count, compute_start_index, @@ -1475,12 +1531,6 @@ if new_get_single: start_process_index = order_begin_pos.buy_single_index - # _start_time = l2_data_log.l2_time(code, tool.get_now_timestamp() - _start_time, "璁$畻m鍊煎ぇ鍗�") - - # threshold_money, msg = cls.__get_threshmoney(code) - - # _start_time = l2_data_log.l2_time(code, tool.get_now_timestamp() - _start_time, "m鍊奸槇鍊艰绠�") - # 璁剧疆涓烘�诲崠棰� new_buy_exec_index, buy_nums, buy_count, rebegin_buy_pos, threshold_money_new, max_num_set_new, not_buy_msg, clear_buy_single = cls.__sum_buy_num_for_order_active( code, @@ -1506,42 +1556,17 @@ return if new_buy_exec_index is not None: - l2_log.debug(code, "鑾峰彇鍒颁拱鍏ユ墽琛屼綅缃細{} m鍊硷細{} 绾拱鎵嬫暟锛歿} 绾拱鍗曟暟锛歿} 鏄惁鏉夸笂涔帮細{} 鏁版嵁锛歿} ,閲忔瘮:{} ,涓嬪崟妯″紡锛歿}", new_buy_exec_index, - threshold_money, - buy_nums, - buy_count, order_begin_pos.at_limit_up, total_datas[new_buy_exec_index], - cls.volume_rate_info[code], order_begin_pos.mode) - cls.__save_order_begin_data(code, OrderBeginPosInfo(buy_single_index=buy_single_index, - buy_exec_index=new_buy_exec_index, - buy_compute_index=new_buy_exec_index, - num=buy_nums, count=buy_count, - max_num_set=max_num_set_new, - buy_volume_rate=cls.volume_rate_info[code][0], - mode=order_begin_pos.mode, - mode_desc=order_begin_pos.mode_desc, - sell_info=order_begin_pos.sell_info, - threshold_money=threshold_money)) - cls.__LimitUpTimeManager.save_limit_up_time(code, total_datas[new_buy_exec_index]["val"]["time"]) - l2_log.debug(code, "delete_buy_cancel_point") - if code not in cls.__latest_exec_indexes: - cls.__latest_exec_indexes[code] = [] - cls.__latest_exec_indexes[code].append(new_buy_exec_index) - # 淇濈暀鏈�杩�3娆$殑涔板叆鎵ц浣嶇疆 - if len(cls.__latest_exec_indexes[code]) > 3: - cls.__latest_exec_indexes[code] = cls.__latest_exec_indexes[code][-3:] - - # 鐩存帴涓嬪崟 - ordered = cls.__buy(code, capture_time, total_datas[-1], total_datas[-1]["index"], is_first_code) - - # 鏁版嵁鏄惁澶勭悊瀹屾瘯 - if new_buy_exec_index < compute_end_index: - if ordered: - cls.__process_order(code, new_buy_exec_index + 1, compute_end_index, capture_time, is_first_code, - False) - else: - cls.__start_compute_buy(code, new_buy_exec_index + 1, compute_end_index, threshold_money, - capture_time, - is_first_code, False) + cls.__process_with_find_exec_index(code, OrderBeginPosInfo(buy_single_index=buy_single_index, + buy_exec_index=new_buy_exec_index, + buy_compute_index=new_buy_exec_index, + num=buy_nums, count=buy_count, + max_num_set=max_num_set_new, + buy_volume_rate=cls.volume_rate_info[code][0], + mode=order_begin_pos.mode, + mode_desc=order_begin_pos.mode_desc, + sell_info=order_begin_pos.sell_info, + threshold_money=threshold_money), + compute_end_index) else: # 鏈揪鍒颁笅鍗曟潯浠讹紝淇濆瓨绾拱棰濓紝璁剧疆绾拱棰� # 璁板綍涔板叆淇″彿浣嶇疆 @@ -1773,7 +1798,7 @@ return True, i, [refer_sell_data[0], 0], '涓婅瘉涔板叆', OrderBeginPosInfo.MODE_ACTIVE if active_buy_blocks else OrderBeginPosInfo.MODE_FAST - return False, -1, "鏈幏鍙栧埌婵�杩涗拱鐨勮捣濮嬩俊鍙�", '', OrderBeginPosInfo.MODE_NORMAL + return False, -1, "鏈幏鍙栧埌绉瀬涔扮殑璧峰淇″彿", '', OrderBeginPosInfo.MODE_NORMAL else: # 娣辫瘉 if refer_sell_data is None: @@ -1796,7 +1821,7 @@ # 鍒ゆ柇鏈�杩戞湁娌℃湁娑ㄥ仠鍗栨暟鎹� limit_up_sell_count = L2TradeSingleDataProcessor.get_latest_limit_up_sell_order_count(code) if (limit_up_sell_count == 0 or active_buy_blocks) and not single: - # 濡傛灉娌℃湁娑ㄥ仠鍗栨暟鎹�/婵�杩涗笅鍗曡�屼笖杩樻病鏈夋垚浜や拱鍏ヤ俊鍙凤紝灏辨寜鐓у師鏉ョ殑鎬诲崠棰濊绠� + # 濡傛灉娌℃湁娑ㄥ仠鍗栨暟鎹�/绉瀬涓嬪崟鑰屼笖杩樻病鏈夋垚浜や拱鍏ヤ俊鍙凤紝灏辨寜鐓у師鏉ョ殑鎬诲崠棰濊绠� threshold_money, sell_1_price = copy.deepcopy(refer_sell_data[1]), refer_sell_data[3][0] for i in range(start_index - 1, -1, -1): val = total_datas[i]["val"] @@ -1832,7 +1857,7 @@ return True, buy_single_index, [refer_sell_data[0], 0], "鏉夸笂鏀鹃噺", OrderBeginPosInfo.MODE_ACTIVE if active_buy_blocks else OrderBeginPosInfo.MODE_NORMAL - return False, -1, "鏈幏鍙栧埌婵�杩涗拱鐨勮捣濮嬩俊鍙�", '', OrderBeginPosInfo.MODE_NORMAL + return False, -1, "鏈幏鍙栧埌绉瀬涔扮殑璧峰淇″彿", '', OrderBeginPosInfo.MODE_NORMAL # 璁$畻婵�杩涗拱鐨勪笅鍗曚俊鍙� @classmethod @@ -1844,10 +1869,9 @@ @param code: @param start_index: @param end_index: - @return: (鏄惁鑾峰彇鍒颁俊鍙�, 淇″彿浣嶇疆) + @return: (鏄惁鑾峰彇鍒颁俊鍙�, 淇″彿浣嶇疆, 娑堟伅) """ # 婵�杩涗拱淇″彿鐨勬椂闂� - radical_data = RadicalBuyDealCodesManager.buy_by_l2_delegate_expire_time_dict.get(code) if not radical_data: @@ -1855,9 +1879,8 @@ if t.time() > radical_data[0]: return False, None, "瓒呰繃鐢熸晥鏃堕棿" - # 鍒ゆ柇鏄惁鏄澘涓婃斁閲� - if cls.__is_on_limit_up_buy(code, start_index): + if cls.__is_at_limit_up_buy(code, start_index): return False, None, "鏉夸笂鏀鹃噺" total_datas = local_today_datas[code] min_num = int(29900 / gpcode_manager.get_limit_up_price_as_num(code)) -- Gitblit v1.8.0