From 5ae8b19fdc000fc719f3ad45fa5f7462fdbffbdf Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期二, 20 九月 2022 18:46:10 +0800 Subject: [PATCH] l2数据计算优化 --- l2_data_manager.py | 247 +++++++++++++++++++++++++++++-------------------- 1 files changed, 146 insertions(+), 101 deletions(-) diff --git a/l2_data_manager.py b/l2_data_manager.py index dd7890c..f04ee18 100644 --- a/l2_data_manager.py +++ b/l2_data_manager.py @@ -1,6 +1,9 @@ import decimal import json +import logging import os +import random +import threading import time as t from datetime import datetime @@ -15,7 +18,7 @@ import redis_manager import tool import trade_manager -from log import logger_l2_trade +from log import logger_l2_trade, logger_l2_trade_cancel from trade_data_manager import TradeBuyDataManager _redisManager = redis_manager.RedisManager(1) @@ -67,21 +70,26 @@ _key = "buy_compute_index_info-{}".format(code) _data_json = redis.get(_key) if _data_json is None: - return None, 0, None + return None, None, None, 0 _data = json.loads(_data_json) - return _data[0], _data[1], _data[2] + return _data[0], _data[1], _data[2], _data[3] # 璁剧疆涔板叆鐐圭殑鍊� + # buy_single_index 涔板叆淇″彿浣� + # buy_exec_index 涔板叆鎵ц浣� + # compute_index 璁$畻浣嶇疆 + # nums 绱绾拱棰� @staticmethod - def set_buy_compute_start_data(code, nums, compute_index, buy_index): + def set_buy_compute_start_data(code, buy_single_index, buy_exec_index, compute_index, nums): redis = TradePointManager.__get_redis() expire = tool.get_expire() _key = "buy_compute_index_info-{}".format(code) - if buy_index is not None: - redis.setex(_key, expire, json.dumps((buy_index, nums, compute_index))) + if buy_single_index is not None: + redis.setex(_key, expire, json.dumps((buy_single_index, buy_exec_index, compute_index, nums))) else: - _buy_index, _nums, _compute_index = TradePointManager.get_buy_compute_start_data(code) - redis.setex(_key, expire, json.dumps((_buy_index, nums, compute_index))) + _buy_single_index, _buy_exec_index, _compute_index, _nums = TradePointManager.get_buy_compute_start_data( + code) + redis.setex(_key, expire, json.dumps((_buy_single_index, buy_exec_index, compute_index, nums))) # 鑾峰彇鎾や拱鍏ュ紑濮嬭绠楃殑淇℃伅 # 杩斿洖鏁版嵁鐨勫唴瀹逛负锛氭挙閿�鐐圭储寮� 鎾や拱绾拱棰� 璁$畻鐨勬暟鎹储寮� @@ -161,12 +169,6 @@ # 璁$畻淇濈暀鐨勬椂闂� expire = tool.get_expire() - start_index = redis_instance.get("l2-maxindex-{}".format(code)) - if start_index is None: - start_index = -1 - else: - start_index = int(start_index) - max_index = start_index i = 0 for _data in datas: i += 1 @@ -174,20 +176,20 @@ value = redis_instance.get(key) if value is None: # 鏂板 - max_index = start_index + i - value = {"index": start_index + i, "re": _data["re"]} - redis_instance.setex(key, expire, json.dumps(value)) + try: + value = {"index": _data["index"], "re": _data["re"]} + redis_instance.setex(key, expire, json.dumps(value)) + except: + logging.error("鏇存L2鏁版嵁鍑洪敊锛歿} key:{}".format(code, key)) else: json_value = json.loads(value) if json_value["re"] != _data["re"]: json_value["re"] = _data["re"] redis_instance.setex(key, expire, json.dumps(json_value)) - - redis_instance.setex("l2-maxindex-{}".format(code), expire, max_index) finally: redis_instance.delete("l2-save-{}".format(code)) - print("淇濆瓨鏂版暟鎹敤鏃讹細", msg, round(t.time() * 1000) - start_time) + print("淇濆瓨鏂版暟鎹敤鏃讹細", msg, "鑰楁椂锛歿}".format(round(t.time() * 1000) - start_time)) return datas @@ -231,8 +233,8 @@ @classmethod def is_same_time(cls, time1, time2): # TODO 娴嬭瘯 - # if 1 > 0: - # return True + if global_util.TEST: + return True time1_s = time1.split(":") time1_second = int(time1_s[0]) * 3600 + int(time1_s[1]) * 60 + int(time1_s[2]) time2_s = time2.split(":") @@ -251,10 +253,11 @@ __latest_datas = local_latest_datas.get(code) if __latest_datas is not None and len(__latest_datas) > 0: last_key = __latest_datas[-1]["key"] + count = 0 start_index = -1 # 濡傛灉鍘熸潵娌℃湁鏁版嵁 - # TODO 璁剧疆add_data鐨勫簭鍙� + # 璁剧疆add_data鐨勫簭鍙� for n in reversed(datas): count += 1 if n["key"] == last_key: @@ -283,7 +286,8 @@ save_list = [] for data in _datas: for _ldata in latest_data: - if _ldata["key"] == data["key"] and _ldata["re"] != data["re"]: + # 鏂版暟鎹潯鏁版瘮鏃ф暟鎹鎵嶄繚瀛� + if _ldata["key"] == data["key"] and _ldata["re"] < data["re"]: max_re = max(_ldata["re"], data["re"]) _ldata["re"] = max_re data["re"] = max_re @@ -291,6 +295,7 @@ save_list.append(_ldata) if len(save_list) > 0: saveL2Data(code, save_list, "淇濆瓨绾犳鏁版嵁") + local_latest_datas[code] = latest_data return _datas # 澶勭悊l2鏁版嵁 @@ -330,12 +335,13 @@ return datas @classmethod - def get_time_as_second(time_str): + def get_time_as_second(cls, time_str): ts = time_str.split(":") return int(ts[0]) * 3600 + int(ts[1]) * 60 + int(ts[2]) # 鏄惁鏄定鍋滀环涔� - def is_limit_up_price_buy(val): + @classmethod + def is_limit_up_price_buy(cls, val): if int(val["limitPrice"]) != 1: return False @@ -349,7 +355,8 @@ return True # 鏄惁娑ㄥ仠涔版挙 - def is_limit_up_price_buy_cancel(val): + @classmethod + def is_limit_up_price_buy_cancel(cls, val): if int(val["limitPrice"]) != 1: return False @@ -371,14 +378,31 @@ # L2浜ゆ槗鏁版嵁澶勭悊鍣� +# 涓�浜涘父瑙佺殑姒傚康锛� +# 涔板叆淇″彿浣嶇疆(鍑虹幇涓嬪崟淇″彿鐨勭涓�鏉℃暟鎹殑浣嶇疆)锛歜uy_single_index +# 涔板叆鎵ц浣嶇疆锛堢鍚堜笅鍗曚俊鍙风殑鏈�鍚庝竴鏉℃暟鎹級锛歜uy_exec_index +# 璁$畻浣嶇疆锛堝綋鍓嶈绠楃殑鏁翠釜璁$畻鐨勪綅缃級锛歝ompute_index +# + class L2TradeDataProcessor: unreal_buy_dict = {} + random_key = {} + + @classmethod + def debug(cls, code, content, *args): + logger_l2_trade.debug(("thread-id={} code={} ".format(cls.random_key[code], code) + content).format(*args)) + + @classmethod + def cancel_debug(cls, code, content, *args): + logger_l2_trade_cancel.debug( + ("thread-id={} code={} ".format(cls.random_key[code], code) + content).format(*args)) @classmethod # 鏁版嵁澶勭悊鍏ュ彛 # datas: 鏈鎴浘鏁版嵁 # capture_timestamp:鎴浘鏃堕棿鎴� def process(cls, code, datas, capture_timestamp): + cls.random_key[code] = random.randint(0, 100000) now_time_str = datetime.now().strftime("%H:%M:%S") __start_time = round(t.time() * 1000) try: @@ -393,7 +417,7 @@ datas = L2DataUtil.correct_data(code, datas) _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"] + _start_index = local_today_datas[code][-1]["index"] + 1 add_datas = L2DataUtil.get_add_data(code, datas, _start_index) if len(add_datas) > 0: # 鎷兼帴鏁版嵁 @@ -415,7 +439,7 @@ state = trade_manager.get_trade_state(code) if state == trade_manager.TRADE_STATE_BUY_DELEGATED or state == trade_manager.TRADE_STATE_BUY_PLACE_ORDER: # 宸叉寕鍗� - cls.__process_order(code, len(total_datas) - len(add_datas) - 3) + cls.__process_order(code, len(total_datas) - len(add_datas) - 3, capture_timestamp) else: # 鏈寕鍗� cls.__process_not_order(code, add_datas, capture_timestamp) @@ -451,20 +475,30 @@ start_index = 0 # 鑾峰彇涔嬪墠鏄惁鏈夎褰曠殑鎾や拱淇″彿 cancel_index, buy_num_for_cancel, computed_index = cls.__has_order_cancel_begin_pos(code) - buy_index, buy_num = cls.__get_order_begin_pos(code) + buy_single_index, buy_exec_index, buy_compute_index, buy_num = cls.__get_order_begin_pos(code) if cancel_index is None: # 鏃犳挙鍗曚俊鍙疯捣濮嬬偣璁板綍 - cancel_index = cls.__compute_order_cancel_begin_single(code, start_index, 3) - buy_num_for_cancel = 0 - computed_index = buy_index + cancel_index = cls.__compute_order_cancel_begin_single(code, max(start_index - 3, 0), 3) + buy_num_for_cancel = buy_num + computed_index = buy_single_index + if cancel_index is not None: + cls.debug(code, "鎵惧埌鎾ゅ崟淇″彿锛屾暟鎹鐞嗚捣濮嬬偣锛歿} 鏁版嵁锛歿}", start_index, local_today_datas[code][start_index]) if cancel_index is not None: # 鑾峰彇闃堝�� 鏈変拱鎾や俊鍙凤紝缁熻鎾や拱绾拱棰� threshold_money = cls.__get_threshmoney(code) - cls.__start_compute_cancel(code, cancel_index, computed_index, buy_num_for_cancel, threshold_money, + cls.__start_compute_cancel(code, cancel_index, max(computed_index, buy_exec_index + 1), buy_num_for_cancel, + threshold_money, capture_time) else: - # 鏃犱拱鎾や俊鍙�,缁堟鎵ц - pass + # 鏃犱拱鎾や俊鍙�,鏄惁鏈夎櫄鎷熶笅鍗� + unreal_buy_info = cls.unreal_buy_dict.get(code) + if unreal_buy_info is not None: + cls.debug(code, "鏈夎櫄鎷熶笅鍗曪紝鏃犱拱鎾や俊鍙凤紝寮�濮嬫墽琛屼拱鍏�") + # unreal_buy_info 鐨勫唴瀹规牸寮忎负锛�(瑙︽硶涔版搷浣滀笅鏍�,鎴浘鏃堕棿) + # 鐪熷疄涓嬪崟 + cls.__buy(code, unreal_buy_info[1], local_today_datas[code][unreal_buy_info[0]], + unreal_buy_info[0]) + pass # 寮�濮嬭绠楁挙鐨勪俊鍙� @classmethod @@ -474,30 +508,27 @@ origin_num, threshold_money) total_datas = local_today_datas[code] if computed_index is not None: + cls.debug(code, "鑾峰彇鍒版挙鍗曟墽琛屼俊鍙凤紝淇″彿浣嶇疆锛歿}锛宮2:{} 鏁版嵁锛歿}", computed_index, threshold_money, + total_datas[computed_index]) # 鍙戝嚭鎾や拱淇″彿锛岄渶瑕佹挙涔� if cls.unreal_buy_dict.get(code) is not None: # 鏈夎櫄鎷熶笅鍗� + cls.debug(code, "涔嬪墠鏈夎櫄鎷熶笅鍗曪紝鎵ц铏氭嫙鎾や拱") # 鍒犻櫎铏氭嫙涓嬪崟鏍囪 cls.unreal_buy_dict.pop(code) # 鍒犻櫎涓嬪崟鏍囪浣嶇疆 TradePointManager.delete_buy_point(code) else: # 鏃犺櫄鎷熶笅鍗曪紝闇�瑕佹墽琛屾挙鍗� - logger_l2_trade.info( - "鎵ц鎾ら攢锛歿} - {}".format(code, json.dumps(total_datas[computed_index]))) - try: - trade_manager.start_cancel_buy(code) - # 鍙栨秷涔板叆鏍囪瘑 - TradePointManager.delete_buy_point(code) - TradePointManager.delete_buy_cancel_point(code) - except Exception as e: - pass + cls.debug(code, "涔嬪墠鏃犺櫄鎷熶笅鍗曪紝鎵ц鐪熷疄鎾ゅ崟") + cls.__cancel_buy(code) if computed_index < len(local_today_datas[code]) - 1: # 鏁版嵁灏氭湭澶勭悊瀹�,閲嶆柊杩涘叆涓嬪崟璁$畻娴佺▼ - cls.__start_compute_buy(code, computed_index + 1, 0, threshold_money, capture_time) + cls.__start_compute_buy(code, computed_index + 1, threshold_money, capture_time) pass else: + cls.debug(code, "鏈幏鍙栧埌鎾ゅ崟鎵ц淇″彿锛岃绠楀紑濮嬩綅缃細{}锛� 绾拱棰濓細{}", compute_start_index, buy_num_for_cancel) # 鏃犻渶鎾や拱锛岃褰曟挙涔颁俊鍙� TradePointManager.set_buy_cancel_compute_start_data(code, buy_num_for_cancel, len(total_datas) - 1, cancel_index) @@ -506,6 +537,7 @@ if unreal_buy_info is not None: # unreal_buy_info 鐨勫唴瀹规牸寮忎负锛�(瑙︽硶涔版搷浣滀笅鏍�,鎴浘鏃堕棿) # 鐪熷疄涓嬪崟 + cls.debug(code, "鏃犳挙鍗曟墽琛屼俊鍙凤紝鏈夎櫄鎷熶笅鍗曪紝鎵ц鐪熷疄涓嬪崟") cls.__buy(code, unreal_buy_info[1], total_datas[unreal_buy_info[0]], unreal_buy_info[0]) pass @@ -515,66 +547,85 @@ @classmethod def __buy(cls, code, capture_timestamp, last_data, last_data_index): - logger_l2_trade.info( - "鎵ц涔板叆锛歿} ".format(code)) + cls.debug(code, "寮�濮嬫墽琛屼拱鍏�") try: trade_manager.start_buy(code, capture_timestamp, last_data, last_data_index) TradePointManager.delete_buy_cancel_point(code) + cls.debug(code, "鎵ц涔板叆鎴愬姛") except Exception as e: + cls.debug(code, "鎵ц涔板叆寮傚父:{}", str(e)) pass + + @classmethod + def __cancel_buy(cls, code): + try: + cls.debug(code, "寮�濮嬫墽琛屾挙鍗�") + trade_manager.start_cancel_buy(code) + # 鍙栨秷涔板叆鏍囪瘑 + TradePointManager.delete_buy_point(code) + TradePointManager.delete_buy_cancel_point(code) + cls.debug(code, "鎵ц鎾ゅ崟鎴愬姛") + except Exception as e: + cls.debug(code, "鎵ц鎾ゅ崟寮傚父锛歿}", str(e)) @classmethod def __start_compute_buy(cls, code, compute_start_index, threshold_money, capture_time): total_datas = local_today_datas[code] # 鑾峰彇涔板叆淇″彿璁$畻璧峰浣嶇疆 - index, num = cls.__get_order_begin_pos(code) + # index, num, finish_index = cls.__get_order_begin_pos(code) + buy_single_index, buy_exec_index, buy_compute_index, num = cls.__get_order_begin_pos(code) # 鏄惁涓烘柊鑾峰彇鍒扮殑浣嶇疆 new_get_pos = False - if index is None: + if buy_single_index is None: # 鏈変拱鍏ヤ俊鍙� - has_single, _index = cls.__compute_order_begin_pos(code, len(total_datas) - compute_start_index, 3) - index = _index + has_single, _index = cls.__compute_order_begin_pos(code, max(compute_start_index - 3, 0), 3) + buy_single_index = _index if has_single: num = 0 new_get_pos = True + cls.debug(code, "鑾峰彇鍒颁拱鍏ヤ俊鍙疯捣濮嬬偣锛歿} 鏁版嵁锛歿}", buy_single_index, total_datas[buy_single_index]) - if index is None: + if buy_single_index is None: # 鏈幏鍙栧埌涔板叆淇″彿锛岀粓姝㈢▼搴� return None # 涔板叆绾拱棰濈粺璁� - compute_index, buy_nums = cls.sum_buy_num_for_order(code, compute_start_index, num, threshold_money) + compute_index, buy_nums = cls.__sum_buy_num_for_order(code, max(buy_single_index, compute_start_index), num, + threshold_money) if compute_index is not None: + cls.debug(code, "鑾峰彇鍒颁拱鍏ユ墽琛屼綅缃細{} m鍊硷細{} 鏁版嵁锛歿}", compute_index, threshold_money, total_datas[compute_index]) # 璁板綍涔板叆淇″彿浣嶇疆 - cls.__save_order_begin_data(code, compute_index, buy_nums, index) + cls.__save_order_begin_data(code, buy_single_index, compute_index, compute_index, buy_nums) # 铏氭嫙涓嬪崟 cls.unreal_buy_dict[code] = (compute_index, capture_time) # 鍒犻櫎涔嬪墠鐨勬墍鏈夋挙鍗曚俊鍙� TradePointManager.delete_buy_cancel_point(code) # 鏁版嵁鏄惁澶勭悊瀹屾瘯 if L2DataUtil.is_index_end(code, compute_index): + cls.debug(code, "鏁版嵁澶勭悊瀹屾瘯锛屼笅鍗�, 鏁版嵁鎴浘鏃堕棿-{}", capture_time) # 鏁版嵁宸茬粡澶勭悊瀹屾瘯锛屼笅鍗� cls.__buy(code, capture_time, total_datas[compute_index], compute_index) else: # 鏁版嵁灏氭湭澶勭悊瀹屾瘯锛岃繘琛屼笅涓�姝ュ鐞� + cls.debug(code, "鏁版嵁灏氭湭澶勭悊瀹屾瘯锛岃繘琛屼笅涓�姝ュ鐞嗭紝澶勭悊杩涘害锛歿}", compute_index) cls.__process_order(code, compute_index + 1, capture_time) else: # 鏈揪鍒颁笅鍗曟潯浠讹紝淇濆瓨绾拱棰濓紝璁剧疆绾拱棰� # 璁板綍涔板叆淇″彿浣嶇疆 - cls.__save_order_begin_data(code, len(total_datas) - 1, buy_nums, index) + cls.__save_order_begin_data(code, buy_single_index, -1, len(total_datas) - 1, buy_nums) pass # 鑾峰彇涓嬪崟璧峰淇″彿 @classmethod def __get_order_begin_pos(cls, code): - index, num, compute_index = TradePointManager.get_buy_compute_start_data(code) - return index, num + buy_single_index, buy_exec_index, compute_index, num = TradePointManager.get_buy_compute_start_data(code) + return buy_single_index, buy_exec_index, compute_index, num @classmethod - def __save_order_begin_data(self, code, compute_index, num, buy_index=None): - TradePointManager.set_buy_compute_start_data(code, num, compute_index, buy_index) + def __save_order_begin_data(self, code, buy_single_index, buy_exec_index, compute_index, num): + TradePointManager.set_buy_compute_start_data(code, buy_single_index, buy_exec_index, compute_index, num) # 鑾峰彇鎾ゅ崟璧峰浣嶇疆 @classmethod @@ -587,18 +638,13 @@ # 璁$畻涓嬪崟璧峰淇″彿 # compute_data_count 鐢ㄤ簬璁$畻鐨刲2鏁版嵁鏁伴噺 - def __compute_order_begin_pos(self, code, compute_data_count, continue_count): + @classmethod + def __compute_order_begin_pos(cls, code, start_index, continue_count): # 鍊掓暟100鏉℃暟鎹煡璇� datas = local_today_datas[code] __len = len(datas) - if __len < continue_count: - return None - start_index = 0 - if compute_data_count > __len: - compute_data_count = __len - - if __len > compute_data_count: - start_index = __len - compute_data_count + if len(datas) - start_index < continue_count: + return False, None __time = None _limit_up_count_1s = 0 _limit_up_count_1s_start_index = -1 @@ -634,7 +680,7 @@ # index_3 = j if index_1 - index_0 == 1 and index_2 - index_1 == 1: # and index_3 - index_2 == 1 logger_l2_trade.info("鎵惧埌鐗╃悊杩炵画娑ㄥ仠涔� {},{},{}".format(code, i, datas[i])) - return i + return True, i # 鍚�1s鍐呮湁涓嶈繛缁殑4涓定鍋滀拱锛堝鏋滈亣涔版挙灏遍噸鏂拌绠楋紝涓棿鍙棿闅斾笉娑ㄥ仠涔帮級鏍囪璁$畻璧峰鐐� if L2DataUtil.is_limit_up_price_buy(_val): # 娑ㄥ仠涔� @@ -656,9 +702,9 @@ if _limit_up_count_1s >= 4 and _limit_up_count_1s_start_index > -1: logger_l2_trade.info("鎵惧埌鍚屼竴绉掕繛缁定鍋滀拱 {},{},{}".format(code, _limit_up_count_1s_start_index, datas[i])) - return _limit_up_count_1s_start_index + return True, _limit_up_count_1s_start_index - return None + return False, None # 鏄惁鏈夋挙閿�淇″彿 @classmethod @@ -701,8 +747,9 @@ def __unreal_order(self): pass + @classmethod def __get_threshmoney(cls, code): - l2_trade_factor.L2TradeFactorUtil.compute_m_value(code) + return l2_trade_factor.L2TradeFactorUtil.compute_m_value(code) # 鑾峰彇棰勪及鎸備拱浣� @classmethod @@ -760,6 +807,7 @@ same_time_property = cls.__get_same_time_property(code) # 鍚屼竴绉掞紝鍦ㄩ浼颁拱鍏ヤ綅涔嬪悗鐨勬暟鎹箣鍜� property_buy_num_count = 0 + cls.cancel_debug(code, "鎾ゅ崟绾拱棰濊绠椾綅缃細{}-{} 棰勪及鎸備拱浣嶏細{}", start_index, len(total_datas) - 1, sure_pos) for i in range(start_index, len(total_datas)): data = total_datas[i] _val = data["val"] @@ -774,22 +822,40 @@ elif L2DataUtil.is_limit_up_price_buy_cancel(_val): # 娑ㄥ仠鎾や拱 # 鍒ゆ柇涔板叆浣嶇疆鏄惁鍦ㄤ拱鍏ヤ俊鍙蜂箣鍓� - buy_index, buy_data = l2_data_util.get_buy_data_with_cancel_data(data, total_datas) + buy_index, buy_data = l2_data_util.get_buy_data_with_cancel_data(data, + local_today_num_operate_map.get(code)) if buy_index is not None: # 鎵惧埌涔版挙鏁版嵁鐨勪拱鍏ョ偣 if buy_index < sure_pos: buy_nums -= int(_val["num"]) * int(data["re"]) - elif sure_data["val"]["time"] == _val["time"]: - # 鍚屼竴绉�,鑰屼笖杩樺湪棰勪及涔板叆浣嶄箣鍚庢寜姒傜巼璁$畻 - property_buy_num_count -= int(_val["num"]) * int(data["re"]) + cls.cancel_debug(code, "{}鏁版嵁鍦ㄩ浼颁拱鍏ヤ綅涔嬪墠 鎾や拱绾拱棰濓細{}", i, buy_nums * limit_up_price) + else: + cls.cancel_debug(code, "{}鏁版嵁鍦ㄩ浼颁拱鍏ヤ綅涔嬪悗锛屼拱鍏ヤ綅锛歿}", i, buy_index) + if sure_data["val"]["time"] == buy_data["val"]["time"]: + # 鍚屼竴绉�,鑰屼笖杩樺湪棰勪及涔板叆浣嶄箣鍚庢寜姒傜巼璁$畻 + property_buy_num_count -= int(_val["num"]) * int(data["re"]) + cls.debug(code, "{}鏁版嵁涔板叆浣嶄笌棰勪及涔板叆浣嶅湪鍚屼竴绉�", i) else: - # TODO 鏈壘鍒颁拱鎾ゆ暟鎹殑涔板叆鐐� - pass + # 鏈壘鍒颁拱鎾ゆ暟鎹殑涔板叆鐐� + cls.cancel_debug(code, "鏈壘鍒颁拱鎾ゆ暟鎹殑涔板叆鐐�: 浣嶇疆-{} 鏁版嵁-{}", i, data) property_buy_num = round(property_buy_num_count * same_time_property) + cls.cancel_debug(code, "棰勪及涔板叆鐐逛箣鍚庡悓涓�绉掍拱鍏ユ墜鏁�-{}锛屼綅缃�-{}锛屾�绘墜鏁帮細{}", property_buy_num, i, buy_nums + property_buy_num) if buy_nums + property_buy_num <= threshold_num: return i, buy_nums + property_buy_num, sure_type return None, buy_nums + round(property_buy_num_count * same_time_property), sure_type + + @classmethod + def test(cls): + code = "002336" + cls.random_key[code] = random.randint(0, 100000) + load_l2_data(code) + try: + # cls.__sum_buy_num_for_cancel_order(code, 112, 100000, 10000000) + has_single, _index = cls.__compute_order_begin_pos(code, max(9, 0), 3) + print(has_single, _index) + except Exception as e: + logging.exception(e) def __get_time_second(time_str): @@ -1037,25 +1103,4 @@ if __name__ == "__main__": - code = "000868" - local_today_datas.setdefault(code, []) - path = "C:/Users/Administrator/Desktop/demo/000868/" - for file_name in os.listdir(path): - p = "{}{}".format(path, file_name) - f = open(p) - for line in f.readlines(): # 渚濇璇诲彇姣忚 - line = line.strip() - data = json.loads(line) - result = L2DataUtil.format_l2_data(data, code, 10.00) - add_datas = L2DataUtil.get_add_data(code, result) - print("澧炲姞鐨勬暟閲忥細", len(add_datas)) - if len(add_datas) > 0: - # 鎷兼帴鏁版嵁 - local_today_datas[code].extend(add_datas) - if code in local_latest_datas: - local_latest_datas[code] = result - else: - local_latest_datas.setdefault(code, result) - f.close() - for d in local_today_datas[code]: - print(d["val"]["time"], d["val"]["num"], d["val"]["operateType"], d["re"]) + L2TradeDataProcessor.test() -- Gitblit v1.8.0