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