From 0e68e24f54db11d340785b17570fff2bc5fc7ac6 Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期一, 24 七月 2023 13:05:16 +0800 Subject: [PATCH] bug修复 --- l2/l2_data_manager_new.py | 396 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 320 insertions(+), 76 deletions(-) diff --git a/l2/l2_data_manager_new.py b/l2/l2_data_manager_new.py index e4dfe44..30015b9 100644 --- a/l2/l2_data_manager_new.py +++ b/l2/l2_data_manager_new.py @@ -1,34 +1,34 @@ import logging -import random import time as t -import big_money_num_manager -import code_data_util -import code_volumn_manager +from code_attribute import big_money_num_manager, code_volumn_manager, code_data_util, industry_codes_sort, \ + limit_up_time_manager, global_data_loader, gpcode_manager import constant -import global_util -import gpcode_manager -import industry_codes_sort +from l2.huaxin import l2_huaxin_util, huaxin_delegate_postion_manager +from third_data import kpl_data_manager, block_info +from utils import global_util, ths_industry_util, tool import l2_data_util -import l2_trade_test -import limit_up_time_manager from db import redis_manager -import ths_industry_util -import tool -from trade import trade_data_manager, trade_manager, trade_queue_manager, l2_trade_factor, l2_trade_util, \ - trade_result_manager -from l2 import safe_count_manager, l2_data_manager, l2_data_log, l2_log, l2_data_source_util, code_price_manager +from third_data.code_plate_key_manager import CodePlateKeyBuyManager +from trade import trade_manager, trade_queue_manager, l2_trade_factor, l2_trade_util, \ + trade_result_manager, first_code_score_manager, current_price_process_manager +from l2 import safe_count_manager, l2_data_manager, l2_data_log, l2_log, l2_data_source_util, code_price_manager, \ + transaction_progress from l2.cancel_buy_strategy import SecondCancelBigNumComputer, HourCancelBigNumComputer, L2LimitUpMoneyStatisticUtil, \ - L2LimitUpSellStatisticUtil + L2LimitUpSellStatisticUtil, DCancelBigNumComputer, LCancelBigNumComputer from l2.l2_data_manager import L2DataException, TradePointManager -from l2.l2_data_util import local_today_datas, L2DataUtil, load_l2_data, local_today_num_operate_map, local_latest_datas +from l2.l2_data_util import local_today_datas, L2DataUtil, local_today_num_operate_map, local_today_buyno_map, \ + local_latest_datas import l2.l2_data_util -from log import logger_l2_trade, logger_l2_trade_cancel, logger_l2_trade_buy, logger_l2_process, logger_l2_error +from log_module.log import logger_l2_trade_buy, logger_l2_process, \ + logger_place_order_score, logger_l2_error # TODO l2鏁版嵁绠$悊 from trade.trade_data_manager import CodeActualPriceProcessor import dask + +from trade.trade_manager import TradeTargetCodeModeManager class L2DataManager: @@ -160,7 +160,18 @@ __ths_l2_trade_queue_manager = trade_queue_manager.thsl2tradequeuemanager() __thsBuy1VolumnManager = trade_queue_manager.THSBuy1VolumnManager() __buyL2SafeCountManager = safe_count_manager.BuyL2SafeCountManager() - __l2PlaceOrderParamsManager = l2_trade_factor.L2PlaceOrderParamsManager() + __l2PlaceOrderParamsManagerDict = {} + __last_buy_single_dict = {} + __TradeBuyQueue = transaction_progress.TradeBuyQueue() + + # 鑾峰彇浠g爜璇勫垎 + @classmethod + def get_code_scores(cls): + score_dict = {} + for code in cls.__l2PlaceOrderParamsManagerDict: + score = cls.__l2PlaceOrderParamsManagerDict[code].score + score_dict[code] = score + return score_dict @classmethod # 鏁版嵁澶勭悊鍏ュ彛 @@ -181,7 +192,9 @@ # 鏁版嵁涓嶆甯搁渶瑕佺姝氦鏄� l2_trade_util.forbidden_trade(code) # 绾犳鏁版嵁 - datas = l2.l2_data_util.L2DataUtil.correct_data(code, local_latest_datas.get(code), datas) + if constant.L2_SOURCE_TYPE == constant.L2_SOURCE_TYPE_THS: + # 鍚岃姳椤洪渶瑕佺籂姝f暟鎹紝鍏朵粬娓犻亾涓嶉渶瑕� + datas = l2.l2_data_util.L2DataUtil.correct_data(code, local_latest_datas.get(code), datas) _start_index = 0 if local_today_datas.get(code) is not None and len( local_today_datas[code]) > 0: @@ -202,6 +215,43 @@ if code in cls.unreal_buy_dict: cls.unreal_buy_dict.pop(code) + # 澶勭悊鍗庨懌L2鏁版嵁 + @classmethod + def process_huaxin(cls, code, datas): + print("process_huaxin", code, len(datas)) + origin_start_time = round(t.time() * 1000) + try: + # 鍔犺浇鍘嗗彶鐨凩2鏁版嵁 + is_normal = l2.l2_data_util.load_l2_data(code, load_latest=False) + if not is_normal: + print("鍘嗗彶鏁版嵁寮傚父:", code) + # 鏁版嵁涓嶆甯搁渶瑕佺姝氦鏄� + l2_trade_util.forbidden_trade(code) + # 杞崲鏁版嵁鏍煎紡 + _start_index = 0 + if local_today_datas.get(code) is not None and len( + local_today_datas[code]) > 0: + _start_index = local_today_datas[code][-1]["index"] + 1 + datas = l2_huaxin_util.get_format_l2_datas(code, datas, + gpcode_manager.get_limit_up_price(code), _start_index) + # 鑾峰彇涓嬪崟浣嶇疆 + place_order_index = huaxin_delegate_postion_manager.get_l2_place_order_position(code, datas) + if place_order_index: + logger_l2_process.info("code:{} 鑾峰彇鍒颁笅鍗曠湡瀹炰綅缃細{}", code, place_order_index) + DCancelBigNumComputer.set_real_order_index(code, place_order_index) + + __start_time = round(t.time() * 1000) + cls.process_add_datas(code, datas, 0, __start_time) + except Exception as e: + print("huaxin L2鏁版嵁澶勭悊寮傚父", code, str(e)) + logging.exception(e) + logger_l2_error.exception(e) + finally: + l2_data_log.l2_time(code, round(t.time() * 1000) - origin_start_time, + "l2鏁版嵁澶勭悊鎬昏�楁椂", + True) + l2.l2_data_util.save_l2_data(code, None, datas) + @classmethod def process_add_datas(cls, code, add_datas, capture_timestamp, __start_time): now_time_str = tool.get_now_time_str() @@ -210,6 +260,7 @@ # 鎷兼帴鏁版嵁 local_today_datas[code].extend(add_datas) l2.l2_data_util.load_num_operate_map(local_today_num_operate_map, code, add_datas) + l2.l2_data_util.load_buy_no_map(local_today_buyno_map, code, add_datas) # 绗�1鏉℃暟鎹槸鍚︿负09:30:00 if add_datas[0]["val"]["time"] == "09:30:00": @@ -226,17 +277,30 @@ "l2鏁版嵁棰勫鐞嗘椂闂�") if len(add_datas) > 0: + # 鏄惁涓洪鏉夸唬鐮� + is_first_code = gpcode_manager.FirstCodeManager.is_in_first_record(code) # 璁$畻閲� volume_rate = code_volumn_manager.get_volume_rate(code) volume_rate_index = code_volumn_manager.get_volume_rate_index(volume_rate) + # 璁$畻鍒嗗�� + limit_up_time = limit_up_time_manager.get_limit_up_time(code) + if limit_up_time is None: + limit_up_time = tool.get_now_time_str() + score = first_code_score_manager.get_score(code, volume_rate, limit_up_time, True) + cls.__l2PlaceOrderParamsManagerDict[code] = l2_trade_factor.L2PlaceOrderParamsManager(code, is_first_code, + volume_rate, + volume_rate_index, + score, + total_datas[-1][ + 'val']['time']) cls.volume_rate_info[code] = (volume_rate, volume_rate_index) - # 鏄惁涓洪鏉夸唬鐮� - is_first_code = gpcode_manager.FirstCodeManager.is_in_first_record(code) + latest_time = add_datas[len(add_datas) - 1]["val"]["time"] + + __start_time = l2_data_log.l2_time(code, round(t.time() * 1000) - __start_time, + "l2鏁版嵁鍑嗗鏃堕棿") # 鏃堕棿宸笉鑳藉お澶ф墠鑳藉鐞� - if l2.l2_data_util.L2DataUtil.is_same_time(now_time_str, - latest_time) and not l2_trade_util.is_in_forbidden_trade_codes( - code): + if not l2_trade_util.is_in_forbidden_trade_codes(code): # 鍒ゆ柇鏄惁宸茬粡鎸傚崟 state = trade_manager.get_trade_state(code) start_index = len(total_datas) - len(add_datas) @@ -245,8 +309,9 @@ # 宸叉寕鍗� cls.__process_order(code, start_index, end_index, capture_timestamp, is_first_code) else: - # 鏈寕鍗� - cls.__process_not_order(code, start_index, end_index, capture_timestamp, is_first_code) + # 鏈寕鍗�,鏃堕棿鐩稿樊涓嶅ぇ鎵嶈兘鎸傚崟 + if l2.l2_data_util.L2DataUtil.is_same_time(now_time_str, latest_time): + cls.__process_not_order(code, start_index, end_index, capture_timestamp, is_first_code) logger_l2_process.info("code:{} 澶勭悊鏁版嵁鑼冨洿: {}-{} 澶勭悊鏃堕棿:{} 鎴浘鏃堕棿鎴筹細{}", code, add_datas[0]["index"], add_datas[-1]["index"], round(t.time() * 1000) - __start_time, @@ -339,7 +404,8 @@ def h_cancel(): _start_time = round(t.time() * 1000) try: - b_need_cancel, b_cancel_data = HourCancelBigNumComputer.need_cancel(code, buy_exec_index, start_index, + b_need_cancel, b_cancel_data = HourCancelBigNumComputer.need_cancel(code, buy_single_index, + buy_exec_index, start_index, end_index, total_data, local_today_num_operate_map.get( code), @@ -353,6 +419,24 @@ logging.exception(e) finally: l2_data_log.l2_time(code, round(t.time() * 1000) - _start_time, "宸蹭笅鍗�-H鎾ゅぇ鍗曡绠�") + return None, "" + + # L鎾� + @dask.delayed + def l_cancel(): + _start_time = round(t.time() * 1000) + try: + b_need_cancel, b_cancel_data = LCancelBigNumComputer.need_cancel(code, + buy_exec_index, start_index, + end_index, total_data, + local_today_num_operate_map.get( + code), is_first_code) + if b_need_cancel and b_cancel_data: + return b_cancel_data, "L鎾ら攢姣斾緥瑙﹀彂闃堝��" + except Exception as e: + logging.exception(e) + finally: + l2_data_log.l2_time(code, round(t.time() * 1000) - _start_time, "宸蹭笅鍗�-L鎾ゅぇ鍗曡绠�") return None, "" # 鏉夸笂鍗栨挙 @@ -402,9 +486,10 @@ f4 = h_cancel() f5 = buy_1_cancel() f6 = sell_cancel() - dask_result = is_need_cancel(f1, f2, f3, f4, f5, f6) + f7 = l_cancel() + dask_result = is_need_cancel(f1, f2, f3, f4, f5, f6, f7) if is_first_code: - dask_result = is_need_cancel(f3, f4) + dask_result = is_need_cancel(f3, f4, f7) cancel_data, cancel_msg = dask_result.compute() @@ -413,6 +498,7 @@ if cancel_data: l2_log.debug(code, "瑙﹀彂鎾ゅ崟锛屾挙鍗曚綅缃細{} 锛屾挙鍗曞師鍥狅細{}", cancel_data["index"], cancel_msg) + l2_log.trade_record(code, "鎾ゅ崟", "'index':{} , 'msg':'{}'", cancel_data["index"], cancel_msg) # 鎾ゅ崟 if cls.cancel_buy(code, cancel_msg): _start_time = l2_data_log.l2_time(code, tool.get_now_timestamp() - _start_time, @@ -439,22 +525,27 @@ @classmethod def __buy(cls, code, capture_timestamp, last_data, last_data_index, is_first_code): __start_time = tool.get_now_timestamp() - can, need_clear_data, reason = cls.__can_buy(code, is_first_code) + can, need_clear_data, reason = False, False, "" + if not is_first_code: + can, need_clear_data, reason = cls.__can_buy(code) + else: + can, need_clear_data, reason = cls.__can_buy_first(code) __start_time = l2_data_log.l2_time(code, tool.get_now_timestamp() - __start_time, "鏈�鍚庡垽鏂槸鍚﹁兘涓嬪崟", force=True) # 鍒犻櫎铏氭嫙涓嬪崟 if code in cls.unreal_buy_dict: cls.unreal_buy_dict.pop(code) + buy_single_index, buy_exec_index, buy_compute_index, num, count, max_num_set, buy_volume_rate = cls.__get_order_begin_pos( + code) if not can: l2_log.debug(code, "涓嶅彲浠ヤ笅鍗曪紝鍘熷洜锛歿}", reason) if need_clear_data: - buy_single_index, buy_exec_index, buy_compute_index, num, count, max_num_set, buy_volume_rate = cls.__get_order_begin_pos( - code) trade_result_manager.real_cancel_success(code, buy_single_index, buy_exec_index, local_today_datas.get(code)) return else: l2_log.debug(code, "鍙互涓嬪崟锛屽師鍥狅細{}", reason) + try: l2_log.debug(code, "寮�濮嬫墽琛屼拱鍏�") trade_manager.start_buy(code, capture_timestamp, last_data, @@ -462,7 +553,14 @@ ################涓嬪崟鎴愬姛澶勭悊################ trade_result_manager.real_buy_success(code) l2_log.debug(code, "鎵ц涔板叆鎴愬姛") + params_desc = cls.__l2PlaceOrderParamsManagerDict[code].get_buy_rank_desc() + l2_log.debug(code, params_desc) + l2_log.trade_record(code, "涓嬪崟", + "'buy_start_index':{} ,'buy_exec_index':{},'volume_reate':{},'score':{},'desc':'{}'", + buy_single_index, buy_exec_index, cls.volume_rate_info[code][0], + cls.__l2PlaceOrderParamsManagerDict[code].score, params_desc) except Exception as e: + logger_l2_error.exception(e) l2_log.debug(code, "鎵ц涔板叆寮傚父:{}", str(e)) pass finally: @@ -505,28 +603,20 @@ # 鏄惁鍙互涔� # 杩斿洖鏄惁鍙互涔�,鏄惁闇�瑕佹竻闄や箣鍓嶇殑涔板叆淇℃伅锛屽師鍥� @classmethod - def __can_buy(cls, code, is_first_code): + def __can_buy(cls, code): __start_time = t.time() - # 鍒ゆ柇鏄惁涓洪鏉夸唬鐮� - if is_first_code: - if not gpcode_manager.WantBuyCodesManager.is_in(code): - is_limited_up = gpcode_manager.FirstCodeManager.is_limited_up(code) - gpcode_manager.FirstCodeManager.add_limited_up_record([code]) - if not code_price_manager.Buy1PriceManager.is_can_buy(code): - return False, True, "棣栨澘浠g爜锛屾病鍦ㄦ兂瑕佷拱鍚嶅崟涓笖鏈墦寮�娑ㄥ仠鏉�" - if not is_limited_up: - return False, True, "棣栨澘浠g爜锛屾病鍦ㄦ兂瑕佷拱鍚嶅崟涓笖鏈定鍋滆繃" - - # 涔嬪墠鐨勪唬鐮� - # 棣栨澘浠g爜涓斿皻鏈定鍋滆繃鐨勪笉鑳戒笅鍗� - # is_limited_up = gpcode_manager.FirstCodeManager.is_limited_up(code) - # if not is_limited_up: - # gpcode_manager.FirstCodeManager.add_limited_up_record([code]) - # place_order_count = trade_data_manager.placeordercountmanager.get_place_order_count( - # code) - # if place_order_count == 0: - # trade_data_manager.placeordercountmanager.place_order(code) - # return False, True, "棣栨澘浠g爜锛屼笖灏氭湭娑ㄥ仠杩�" + if not trade_manager.TradeStateManager.is_can_buy(): + return False, True, f"浠婃棩宸茬姝氦鏄�" + # 涔嬪墠鐨勪唬鐮� + # 棣栨澘浠g爜涓斿皻鏈定鍋滆繃鐨勪笉鑳戒笅鍗� + # is_limited_up = gpcode_manager.FirstCodeManager.is_limited_up(code) + # if not is_limited_up: + # gpcode_manager.FirstCodeManager.add_limited_up_record([code]) + # place_order_count = trade_data_manager.placeordercountmanager.get_place_order_count( + # code) + # if place_order_count == 0: + # trade_data_manager.placeordercountmanager.place_order(code) + # return False, True, "棣栨澘浠g爜锛屼笖灏氭湭娑ㄥ仠杩�" try: # 涔�1浠锋牸蹇呴』涓烘定鍋滀环鎵嶈兘涔� @@ -566,7 +656,7 @@ logging.exception(e) # 閲忔瘮瓒呰繃1.3鐨勪笉鑳戒拱 - volumn_rate = l2_trade_factor.L2TradeFactorUtil.get_volumn_rate_by_code(code) + volumn_rate = cls.volume_rate_info[code][0] if volumn_rate >= 1.3: return False, False, "鏈�澶ч噺姣旇秴杩�1.3涓嶈兘涔�" @@ -574,7 +664,7 @@ if limit_up_time is not None: limit_up_time_seconds = l2.l2_data_util.L2DataUtil.get_time_as_second( limit_up_time) - if not is_first_code and limit_up_time_seconds >= l2.l2_data_util.L2DataUtil.get_time_as_second( + if limit_up_time_seconds >= l2.l2_data_util.L2DataUtil.get_time_as_second( "13:00:00"): return False, False, "浜屾澘涓嬪崍娑ㄥ仠鐨勪笉鑳戒拱锛屾定鍋滄椂闂翠负{}".format(limit_up_time) if limit_up_time_seconds >= l2.l2_data_util.L2DataUtil.get_time_as_second("14:55:00"): @@ -639,6 +729,148 @@ return True, False, None finally: l2_data_log.l2_time(code, round((t.time() - __start_time) * 1000), "鏄惁鍙互涓嬪崟璁$畻") + + @classmethod + def __can_buy_first(cls, code): + if not trade_manager.TradeStateManager.is_can_buy(): + return False, True, f"浠婃棩宸茬姝氦鏄�" + + if gpcode_manager.PauseBuyCodesManager.is_in(code): + return False, True, f"璇ヤ唬鐮佽鏆傚仠浜ゆ槗" + + limit_up_price = gpcode_manager.get_limit_up_price(code) + + if float(limit_up_price) >= 40: + return False, True, "鑲′环澶т簬40鍧�" + + 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"灏氭湭鑾峰彇鍒板綋鍓嶆垚浜や环" + if float(limit_up_price) - float(trade_price) > 0.02001: + return False, False, f"褰撳墠鎴愪氦浠凤紙{trade_price}锛夊皻鏈湪2妗e強浠ュ唴" + + # 鍒ゆ柇鎴愪氦杩涘害鏄惁璺濈鎴戜滑鐨勪綅缃緢杩� + total_data = local_today_datas.get(code) + trade_index, is_default = cls.__TradeBuyQueue.get_traded_index(code) + if not is_default and trade_index: + buy_index_set = set() + num_operate_map = local_today_num_operate_map.get(code) + for i in range(trade_index + 1, total_data[-1]["index"] + 1): + if L2DataUtil.is_limit_up_price_buy(total_data[i]["val"]): + left_count = l2_data_source_util.L2DataSourceUtils.get_limit_up_buy_no_canceled_count(code, + total_data[ + i][ + "index"], + total_data, + num_operate_map) + if left_count > 0: + buy_index_set.add(total_data[i]["index"]) + + if len(buy_index_set) < 5: + return False, False, f"鎴愪氦浣嶇疆璺濈褰撳墠浣嶇疆灏忎簬5绗�" + else: + # 鍒ゆ柇涔�1浠锋牸妗d綅 + zyltgb = global_util.zyltgb_map.get(code) + if zyltgb is None: + global_data_loader.load_zyltgb() + zyltgb = global_util.zyltgb_map.get(code) + + if zyltgb >= 200 * 100000000: + buy1_price = code_price_manager.Buy1PriceManager.get_buy1_price(code) + if buy1_price is None: + return False, True, f"灏氭湭鑾峰彇鍒颁拱1浠�" + dif = float(limit_up_price) - float(buy1_price) + # 澶т簬10妗� + if dif > 0.10001: + return False, True, f"鑷敱娴侀��200浜夸互涓婏紝涔�1鍓╀綑妗f暟澶т簬10妗o紝涔颁竴锛坽buy1_price}锛夋定鍋滐紙{limit_up_price}锛�" + + open_limit_up_lowest_price = code_price_manager.Buy1PriceManager.get_open_limit_up_lowest_price(code) + price_pre_close = gpcode_manager.get_price_pre(code) + if open_limit_up_lowest_price and ( + float(open_limit_up_lowest_price) - price_pre_close) / price_pre_close < 0.05: + return False, True, f"鐐告澘鍚庢渶浣庝环璺岃嚦5%浠ヤ笅" + + limit_up_info = code_price_manager.Buy1PriceManager.get_limit_up_info(code) + if limit_up_info[0] is None and False: + total_data = local_today_datas.get(code) + buy_single_index, buy_exec_index, buy_compute_index, num, count, max_num_set, buy_volume_rate = cls.__get_order_begin_pos( + code) + # 涔嬪墠娌℃湁娑ㄥ仠杩� + # 缁熻涔板叆淇″彿浣嶅埌褰撳墠浣嶇疆娌℃湁鎾ょ殑澶у崟閲戦 + min_money_w = l2_data_util.get_big_money_val(float(total_data[buy_single_index]["val"]["price"])) // 10000 + left_big_num = l2.cancel_buy_strategy.SecondCancelBigNumComputer.compute_left_big_num(code, + buy_single_index, + buy_exec_index, + total_data[-1][ + "index"], + total_data, + 0, min_money_w) + if left_big_num > 0: + # 閲嶆柊鑾峰彇鍒嗘暟涓庡垎鏁扮储寮� + limit_up_time = limit_up_time_manager.get_limit_up_time(code) + if limit_up_time is None: + limit_up_time = tool.get_now_time_str() + score = first_code_score_manager.get_score(code, cls.volume_rate_info[code][0], limit_up_time, True, + left_big_num) + cls.__l2PlaceOrderParamsManagerDict[code].set_score(score) + + logger_place_order_score.info("code={},data='score_index':{},'score_info':{}", code, + cls.__l2PlaceOrderParamsManagerDict[code].score_index, + cls.__l2PlaceOrderParamsManagerDict[code].score_info) + + if not gpcode_manager.WantBuyCodesManager.is_in(code): + if TradeTargetCodeModeManager.get_mode() == TradeTargetCodeModeManager.MODE_ONLY_BUY_WANT_CODES: + return False, True, f"鍙拱鎯充拱鍗曚腑鐨勪唬鐮�" + score_index = cls.__l2PlaceOrderParamsManagerDict[code].score_index + score = cls.__l2PlaceOrderParamsManagerDict[code].score + score_info = cls.__l2PlaceOrderParamsManagerDict[code].score_info + return cls.can_buy_first(code, limit_up_price, score_index, score, score_info, cls.volume_rate_info[code]) + else: + return True, False, "鍦ㄦ兂涔板悕鍗曚腑" + + @classmethod + def can_buy_first(cls, code, limit_up_price, score_index, score, score_info, volume_rate_info): + def is_has_k_format(score_info): + # (15涓氦鏄撴棩娑ㄥ箙鏄惁澶т簬24.9%,鏄惁鐮村墠楂橈紝鏄惁瓒呰穼锛屾槸鍚︽帴杩戝墠楂橈紝鏄惁N,鏄惁V,鏄惁鏈夊舰鎬�,澶╅噺澶ч槼淇℃伅,鏄惁鍏锋湁杈ㄨ瘑搴�) + + if score_info[1][3][6][0] and not score_info[1][3][3][0]: + return True + if score_info[1][3][7][0]: + return True + return False + + if float(limit_up_price) >= 40: + return False, True, "鑲′环澶т簬40鍧�" + + # 9:35涔嬪墠涔板ぇ甯傚��(>=80浜�)绁� + if int(tool.get_now_date_str("%Y%m%d")) < int("093500"): + zyltgb = global_util.zyltgb_map.get(code) + if zyltgb is None: + global_data_loader.load_zyltgb() + zyltgb = global_util.zyltgb_map.get(code) + if zyltgb >= 80 * 100000000: + return True, False, "{9:30:00-9:35:00}鑷敱甯傚�尖墺80浜�" + # 鍒ゆ柇鏉垮潡 + plate_can_buy, msg = CodePlateKeyBuyManager.can_buy(code, + kpl_data_manager.KPLLimitUpDataRecordManager.latest_origin_datas, + kpl_data_manager.KPLLimitUpDataRecordManager.total_datas,block_info.get_before_blocks_dict()) + if not plate_can_buy: + return False, True, msg + return True, False, msg + + # if volume_rate_info[0] < 0.4: + # return False, True, f"閲忓ぇ浜�40%鎵嶄笅鍗�,閲忔瘮锛歿volume_rate_info[0]}" + + # 鏄惁鏈塊绾垮舰鎬�(鏈塊绾垮舰鎬佹垨鑰呭ぉ閲忓ぇ闃�),10鐐瑰悗鎵嶉渶瑕佸垽鏂槸鍚︽湁K绾垮舰鎬佷笌鍒嗗�� + if int(tool.get_now_time_str().replace(":", "")) > int("100000"): + has_k_format = score_info[1][3][6][0] or score_info[1][3][7][0] + if not has_k_format: + return False, True, f"鏃燢绾垮舰鎬�" + + if score_index < 0: + return False, True, f"鍒嗗�硷細{score}鏈揪鍒伴渶瑕佷拱鍏ョ殑鍒嗘暟绾�" + return True, False, "" @classmethod def __cancel_buy(cls, code): @@ -707,18 +939,24 @@ # 鏄惁涓烘柊鑾峰彇鍒扮殑浣嶇疆 new_get_single = False if buy_single_index is None: - continue_count = cls.__l2PlaceOrderParamsManager.get_begin_continue_buy_count(cls.volume_rate_info[code][1]) + continue_count = cls.__l2PlaceOrderParamsManagerDict[code].get_begin_continue_buy_count() # 鏈変拱鍏ヤ俊鍙� has_single, _index = cls.__compute_order_begin_pos(code, max( (compute_start_index - continue_count - 1) if new_add else compute_start_index, 0), continue_count, compute_end_index) + # 濡傛灉涔板叆淇″彿涓庝笂娆$殑涔板叆淇″彿涓�鏍峰氨涓嶈兘绠楁柊鐨勪俊鍙� + if cls.__last_buy_single_dict.get(code) == _index: + has_single = None + _index = None + buy_single_index = _index if has_single: + cls.__last_buy_single_dict[code] = buy_single_index new_get_single = True num = 0 count = 0 - l2_log.debug(code, "鑾峰彇鍒颁拱鍏ヤ俊鍙疯捣濮嬬偣锛歿} ,璁$畻鑼冨洿锛歿}-{} 锛屾暟鎹細{}", buy_single_index, compute_start_index, - compute_end_index, total_datas[buy_single_index]) + l2_log.debug(code, "鑾峰彇鍒颁拱鍏ヤ俊鍙疯捣濮嬬偣锛歿} ,璁$畻鑼冨洿锛歿}-{} 锛岄噺姣旓細{}锛屾暟鎹細{}", buy_single_index, compute_start_index, + compute_end_index, cls.volume_rate_info[code], total_datas[buy_single_index]) # 濡傛灉鏄粖澶╃涓�娆℃湁涓嬪崟寮�濮嬩俊鍙凤紝闇�瑕佽缃ぇ鍗曡捣濮嬬偣 cls.l2BigNumForMProcessor.set_begin_pos(code, buy_single_index) @@ -764,8 +1002,9 @@ return if compute_index is not None: - l2_log.debug(code, "鑾峰彇鍒颁拱鍏ユ墽琛屼綅缃細{} m鍊硷細{} 绾拱鎵嬫暟锛歿} 绾拱鍗曟暟锛歿} 鏁版嵁锛歿}", compute_index, threshold_money, buy_nums, - buy_count, total_datas[compute_index]) + l2_log.debug(code, "鑾峰彇鍒颁拱鍏ユ墽琛屼綅缃細{} m鍊硷細{} 绾拱鎵嬫暟锛歿} 绾拱鍗曟暟锛歿} 鏁版嵁锛歿} ,閲忔瘮:{} ", compute_index, threshold_money, + buy_nums, + buy_count, total_datas[compute_index], cls.volume_rate_info[code]) f1 = dask.delayed(cls.__save_order_begin_data)(code, buy_single_index, compute_index, compute_index, buy_nums, buy_count, max_num_set_new, @@ -869,12 +1108,18 @@ last_index = None count = 0 start = None - + now_time_s = tool.get_time_as_second(tool.get_now_time_str()) for i in range(start_index, end_index + 1): _val = datas[i]["val"] + time_s = L2DataUtil.get_time_as_second(_val["time"]) # 鏃堕棿瑕�>=09:30:00 - if L2DataUtil.get_time_as_second(_val["time"]) < second_930: + if time_s < second_930: continue + + if not constant.TEST: + if abs(now_time_s - time_s) > 2: + # 姝e紡鐜涓嬩笉澶勭悊2s澶栫殑鏁版嵁 + continue if L2DataUtil.is_limit_up_price_buy(_val): @@ -901,7 +1146,7 @@ @classmethod def __get_threshmoney(cls, code): - return l2_trade_factor.L2TradeFactorUtil.compute_m_value(code, cls.volume_rate_info[code][1]) + return cls.__l2PlaceOrderParamsManagerDict[code].get_m_val() # 璁$畻涓囨墜鍝ョ瑪鏁� @classmethod @@ -936,9 +1181,7 @@ # place_order_count = trade_data_manager.placeordercountmanager.get_place_order_count(code) # 鐩爣璁㈠崟鏁伴噺 - threshold_count = cls.__buyL2SafeCountManager.get_safe_count(code, is_first_code, - cls.__l2PlaceOrderParamsManager.get_safe_count_rate( - cls.volume_rate_info[code][1])) + threshold_count = cls.__l2PlaceOrderParamsManagerDict[code].get_safe_count() buy_single_time_seconds = L2DataUtil.get_time_as_second(total_datas[buy_single_index]["val"]["time"]) @@ -946,13 +1189,13 @@ trigger_buy = True # 闂撮殧鏈�澶ф椂闂翠緷娆′负锛�3,9,27,81 - max_space_time = cls.__l2PlaceOrderParamsManager.get_time_range(cls.volume_rate_info[code][1]) + max_space_time = cls.__l2PlaceOrderParamsManagerDict[code].get_time_range() # 鏈�澶т拱閲� max_buy_num = 0 max_buy_num_set = set(max_num_set) # 闇�瑕佺殑鏈�灏忓ぇ鍗曠瑪鏁� - big_num_count = cls.__l2PlaceOrderParamsManager.get_big_num_count(cls.volume_rate_info[code][1]) + big_num_count = cls.__l2PlaceOrderParamsManagerDict[code].get_big_num_count() # 杈冨ぇ鍗曠殑鎵嬫暟 bigger_num = round(5900 / limit_up_price) @@ -961,8 +1204,8 @@ data = total_datas[i] _val = total_datas[i]["val"] trigger_buy = False - # 蹇呴』涓鸿繛缁�3绉掑唴鐨勬暟鎹� - if L2DataUtil.get_time_as_second(_val["time"]) - buy_single_time_seconds > max_space_time: + # 蹇呴』涓鸿繛缁�2绉掑唴鐨勬暟鎹� + if L2DataUtil.get_time_as_second(_val["time"]) - buy_single_time_seconds + 1 > max_space_time: TradePointManager.delete_buy_point(code) if i == compute_end_index: # 鏁版嵁澶勭悊瀹屾瘯 @@ -1018,15 +1261,17 @@ l2_log.buy_debug(code, "浣嶇疆-{}锛屾�绘墜鏁帮細{}锛岀洰鏍囨墜鏁帮細{}", i, buy_nums, threshold_num) + max_buy_num_set_count = 0 + for i in max_buy_num_set: + max_buy_num_set_count += total_datas[i]["re"] # 鏈夋挙鍗曚俊鍙凤紝涓斿皬浜庨槇鍊� - if buy_nums >= threshold_num and buy_count >= get_threshold_count() and trigger_buy and len( - max_buy_num_set) >= big_num_count: + if buy_nums >= threshold_num and buy_count >= get_threshold_count() and trigger_buy and max_buy_num_set_count >= big_num_count: return i, buy_nums, buy_count, None, max_buy_num_set l2_log.buy_debug(code, "灏氭湭鑾峰彇鍒颁拱鍏ユ墽琛岀偣锛岃捣濮嬭绠椾綅缃細{} 缁熻绾拱鎵嬫暟锛歿} 鐩爣绾拱鎵嬫暟锛歿} 缁熻绾拱鍗曟暟锛歿} 鐩爣绾拱鍗曟暟锛歿} 澶у崟鏁伴噺锛歿} 鐩爣澶у崟鏁伴噺锛歿}", compute_start_index, buy_nums, - threshold_num, buy_count, get_threshold_count(), len(max_buy_num_set), big_num_count) + threshold_num, buy_count, get_threshold_count(), max_buy_num_set_count, big_num_count) return None, buy_nums, buy_count, None, max_buy_num_set @@ -1042,6 +1287,5 @@ # local_today_num_operate_map.get( # "600213")) # print(buy_index, buy_data) - dict_ = {"code": 0} - dict_.clear() - print(dict_) + volume_rate = code_volumn_manager.get_volume_rate("002343") + print(volume_rate) -- Gitblit v1.8.0