From 59fba698b03a51a8da5b56a919ebbf94d4784f74 Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期五, 06 一月 2023 15:06:27 +0800
Subject: [PATCH] 买入策略修改

---
 l2_code_operate.py     |    6 +
 l2_data_manager_new.py |   85 +++++++++++++++-------------
 log.py                 |   43 +++++++------
 trade_manager.py       |    3 
 data_export_util.py    |   12 ++--
 l2_trade_test.py       |    8 +-
 server.py              |   10 +++
 7 files changed, 95 insertions(+), 72 deletions(-)

diff --git a/data_export_util.py b/data_export_util.py
index f5341ff..585c851 100644
--- a/data_export_util.py
+++ b/data_export_util.py
@@ -13,13 +13,13 @@
 import l2_data_manager
 
 
-def export_l2_excel(code,date=None):
+def export_l2_excel(code, date=None):
     # 鑾峰彇L2鐨勬暟鎹�
-    local_today_datas=log.load_l2_from_log(date)
+    local_today_datas = log.load_l2_from_log(date)
     datas = local_today_datas[code]
     # 鑾峰彇L2澶勭悊浣嶇疆淇℃伅
-    process_indexs = log.get_l2_process_position(code,date)
-    trade_indexs = log.get_l2_trade_position(code,date)
+    process_indexs = log.get_l2_process_position(code, date)
+    trade_indexs = log.get_l2_trade_position(code, date)
     export_l2_data(code, datas, process_indexs, trade_indexs)
 
 
@@ -193,6 +193,6 @@
 
 
 if __name__ == "__main__":
-    codes = ["000610"]
+    codes = ["002441"]
     for code in codes:
-        export_l2_excel(code,"2022-12-27")
+        export_l2_excel(code)
diff --git a/l2_code_operate.py b/l2_code_operate.py
index 60254ab..d278294 100644
--- a/l2_code_operate.py
+++ b/l2_code_operate.py
@@ -80,12 +80,16 @@
                 for item in codes_info:
                     gpcode_manager.set_listen_code_by_pos(client_id, item[0], item[1])
                     L2CodeOperate.set_operate_code_state(client_id, item[0], 1)
+                return True
+            else:
+                return False
 
         except Exception as e:
             logging.exception(e)
             logger_code_operate.error("setGPCode鍑洪敊锛歿}", str(e))
         finally:
             gpcode_manager.rm_operates(codes)
+        return False
 
     @classmethod
     def run(cls):
@@ -301,7 +305,7 @@
 # 鎵归噺璁剧疆浠g爜
 def betch_set_client_codes(client_id,codes_info):
     # 鑾峰彇娑ㄥ箙鍓�16浣嶄唬鐮�
-    L2CodeOperate.betchSetGPCode(client_id, codes_info)
+    return L2CodeOperate.betchSetGPCode(client_id, codes_info)
 
 
 if __name__ == "__main__":
diff --git a/l2_data_manager_new.py b/l2_data_manager_new.py
index 5740086..acf94b3 100644
--- a/l2_data_manager_new.py
+++ b/l2_data_manager_new.py
@@ -464,12 +464,12 @@
                         buy_nums += int(_val["num"]) * int(total_datas[i]["re"])
                     elif L2DataUtil.is_limit_up_price_buy_cancel(_val):
                         buy_nums -= int(_val["num"]) * int(total_datas[i]["re"])
-                if buy_nums < sell1_volumn:
-                    return False, "绾拱閲�({})灏忎簬鍗�1閲弡} 鍗�1鏃堕棿锛歿}".format(buy_nums, sell1_volumn, sell1_time)
+                if buy_nums < sell1_volumn * 0.49:
+                    return False, "绾拱閲�({})灏忎簬鍗�1閲忕殑49%{} 鍗�1鏃堕棿锛歿}".format(buy_nums, sell1_volumn, sell1_time)
         except Exception as e:
             logging.exception(e)
 
-        # 閲忔瘮瓒呰繃1.1鐨勪笉鑳戒拱
+        # 閲忔瘮瓒呰繃1.3鐨勪笉鑳戒拱
         volumn_rate = l2_trade_factor.L2TradeFactorUtil.get_volumn_rate_by_code(code)
         if volumn_rate >= 1.3:
             return False, "鏈�澶ч噺姣旇秴杩�1.3涓嶈兘涔�"
@@ -512,12 +512,12 @@
             for key in codes_index:
                 if codes_index.get(key) == 0:
                     first_codes.append(key)
-
-            for key in first_codes:
-                state = trade_manager.get_trade_state(key)
-                if state == trade_manager.TRADE_STATE_BUY_SUCCESS:
-                    # 鑰佸ぇ宸茬粡涔版垚鍔熶簡
-                    return False, "鑰佸ぇ{}宸茬粡涔版垚鍔燂紝鑰佷簩鏃犻渶璐拱".format(key)
+            # 鏆傛椂娉ㄩ噴鎺�
+            # for key in first_codes:
+            #     state = trade_manager.get_trade_state(key)
+            #     if state == trade_manager.TRADE_STATE_BUY_SUCCESS:
+            #         # 鑰佸ぇ宸茬粡涔版垚鍔熶簡
+            #         return False, "鑰佸ぇ{}宸茬粡涔版垚鍔燂紝鑰佷簩鏃犻渶璐拱".format(key)
             #
             # # 鏈�9鐐瑰崐娑ㄥ仠鐨勮�佸ぇ鎵嶈兘涔拌�佷簩锛屼笉鐒朵笉鑳戒拱
             # # 鑾峰彇鑰佸ぇ鐨勬定鍋滄椂闂�
@@ -607,9 +607,14 @@
 
         # 鏄惁涓烘柊鑾峰彇鍒扮殑浣嶇疆
         if buy_single_index is None:
+            place_order_count = trade_data_manager.placeordercountmanager.get_place_order_count(code)
+            continue_count = 3
+            # 鍓�2娆$殑淇″彿杩炵画绗旀暟涓�3锛屽悗闈负2
+            if place_order_count > 2:
+                continue_count = 2
             # 鏈変拱鍏ヤ俊鍙�
             has_single, _index = cls.__compute_order_begin_pos(code, max(
-                compute_start_index - 2 if new_add else compute_start_index, 0), 3, compute_end_index)
+                compute_start_index - 2 if new_add else compute_start_index, 0), continue_count, compute_end_index)
             buy_single_index = _index
             if has_single:
                 num = 0
@@ -679,7 +684,7 @@
                 cls.debug(code, "鏁版嵁澶勭悊瀹屾瘯锛屼笅鍗�, 鏁版嵁鎴浘鏃堕棿-{}", capture_time)
                 # 鏁版嵁宸茬粡澶勭悊瀹屾瘯锛屽鏋滆繕娌℃挙鍗曞氨瀹為檯涓嬪崟
                 if need_cancel:
-                    if cls.cancel_buy(code, "鍒嗛挓绾уぇ鍗曟挙閿�"):
+                    if cls.cancel_buy(code, "S绾уぇ鍗曟挙閿�"):
                         # 鎵ц鎾ゅ崟鎴愬姛
                         pass
                 else:
@@ -829,17 +834,13 @@
 
         buy_single_time_seconds = L2DataUtil.get_time_as_second(total_datas[buy_single_index]["val"]["time"])
 
-        # 鍙互瑙﹀彂涔�
+        # 鍙互瑙﹀彂涔帮紝褰撴湁娑ㄥ仠涔颁俊鍙锋椂鎵嶄細瑙﹀彂涔�
         trigger_buy = True
         place_order_count = trade_data_manager.placeordercountmanager.get_place_order_count(code)
-        max_space_time = 2
-        if place_order_count <= 0:
-            max_space_time = 2
-        elif place_order_count <= 1:
-            max_space_time = 6 - 1
-        else:
-            max_space_time = 9 - 1
-
+        if place_order_count>3:
+            place_order_count = 3
+        # 闂撮殧鏈�澶ф椂闂翠緷娆′负锛�3,9,27,81
+        max_space_time = pow(3,place_order_count + 1) - 1
         for i in range(compute_start_index, compute_end_index + 1):
             data = total_datas[i]
             _val = total_datas[i]["val"]
@@ -1572,7 +1573,7 @@
                     num += int(val["num"])
 
         average_num = num // count
-        average_num = round(5900/ gpcode_manager.get_limit_up_price(code))
+        average_num = round(5900 / gpcode_manager.get_limit_up_price(code))
         average_up_count = 0
         for i in range(start_index, end_index + 1):
             data = total_data[i]
@@ -1590,6 +1591,7 @@
     @classmethod
     def need_cancel(cls, code, buy_single_index, buy_exec_index, start_index, end_index, need_cancel=True):
         average_num, average_up_count, a_start_index, a_end_index = cls.__get_average_data(code)
+        L2TradeDataProcessor.cancel_debug(code,"s绾ф槸鍚﹂渶瑕佹挙鍗曪紝鏁版嵁鑼冨洿锛歿}-{}  骞冲潎澶у崟淇℃伅-({},{},{},{})",start_index,end_index,average_num, average_up_count, a_start_index, a_end_index)
         if average_num is None:
             return False, None
         total_data = local_today_datas[code]
@@ -1626,16 +1628,16 @@
         if need_cancel:
             # 璁$畻涔版挙澶у崟鏆傛瘮
             cancel_datas = cls.__get_cancel_datas(code)
-
             if cancel_datas is not None and len(cancel_datas) > 0:
+                L2TradeDataProcessor.cancel_debug(code, "s绾уぇ鍗� 鍙栨秷鏁伴噺:{}", len(cancel_datas))
                 cancel_rate_threshold = 0.49
                 place_order_count = trade_data_manager.placeordercountmanager.get_place_order_count(code)
                 if place_order_count <= 1:
                     cancel_rate_threshold = 0.49
                 elif place_order_count <= 2:
-                    ancel_rate_threshold = 0.549
+                    cancel_rate_threshold = 0.549
                 else:
-                    ancel_rate_threshold = 0.59
+                    cancel_rate_threshold = 0.59
                 cancel_indexs = []
                 for index in cancel_datas:
                     cancel_indexs.append(int(index))
@@ -1703,15 +1705,19 @@
         cls.place_order_success(code, buy_single_index, buy_exec_index)
         # 鎵ц鏄惁闇�瑕佽绠梐verage
         cls.compute_average_big_num(code, buy_single_index, buy_single_index, datas[3])
-        for i in range(buy_single_index, datas[4]):
-            cancel, cancel_data = cls.need_cancel(code, i, i)
+
+        cancel, cancel_data = cls.need_cancel(code, buy_single_index, buy_exec_index, buy_single_index, buy_exec_index,
+                                              False)
+
+        for i in range(buy_exec_index + 1, datas[4]):
+            cancel, cancel_data = cls.need_cancel(code, buy_single_index, buy_exec_index, i, i)
             if cancel:
                 print("闇�瑕佹挙鍗�", cancel, cancel_data["index"])
                 break
 
     @classmethod
     def test(cls):
-        cls.__test(("000716", 410, 420, 461, 536))
+        cls.__test(("000909", 607, 646, 646, 694))
         # 浠g爜 涔板叆淇″彿璧峰鐐�  涔板叆淇℃伅鎵ц浣嶇疆  璁$畻鏈綅 鏈�杩滆绠椾綅缃�
         # cls.__test(("002793", 292, 308, 314, 410))
 
@@ -1803,7 +1809,7 @@
                     num += int(val["num"])
 
         average_num = num // count
-        #average_num = 0
+        # average_num = 0
         average_num = round(5900 / gpcode_manager.get_limit_up_price(code))
         average_up_count = 0
         for i in range(start_index, end_index + 1):
@@ -1860,12 +1866,12 @@
             if cancel_datas is not None and len(cancel_datas) > 0:
                 cancel_rate_threshold = 0.49
                 place_order_count = trade_data_manager.placeordercountmanager.get_place_order_count(code)
-                if place_order_count <=1:
-                    cancel_rate_threshold=0.49
-                elif place_order_count <=2:
-                    ancel_rate_threshold = 0.549
+                if place_order_count <= 1:
+                    cancel_rate_threshold = 0.49
+                elif place_order_count <= 2:
+                    cancel_rate_threshold = 0.549
                 else:
-                    ancel_rate_threshold = 0.59
+                    cancel_rate_threshold = 0.59
                 cancel_indexs = []
                 for index in cancel_datas:
                     cancel_indexs.append(int(index))
@@ -2091,9 +2097,10 @@
     # AverageBigNumComputer.test()
     # LongAverageBigNumComputer.test()
     # L2TradeDataProcessor.test()
-    load_l2_data("600213")
-
-    buy_index, buy_data = l2_data_util.get_buy_data_with_cancel_data(local_today_datas["600213"][84],
-                                                                     local_today_num_operate_map.get(
-                                                                         "600213"))
-    print(buy_index, buy_data)
+    SecondAverageBigNumComputer.test()
+    # load_l2_data("600213")
+    #
+    # buy_index, buy_data = l2_data_util.get_buy_data_with_cancel_data(local_today_datas["600213"][84],
+    #                                                                  local_today_num_operate_map.get(
+    #                                                                      "600213"))
+    # print(buy_index, buy_data)
diff --git a/l2_trade_test.py b/l2_trade_test.py
index 99150f2..9df414e 100644
--- a/l2_trade_test.py
+++ b/l2_trade_test.py
@@ -38,9 +38,9 @@
 
         redis_info.delete(k)
 
-#
+
 # class VirtualTrade(unittest.TestCase):
-#     code = "002419"
+#     code = "002093"
 #     clear_trade_data(code)
 #     l2_data_manager.load_l2_data(code)
 #     total_datas = l2_data_manager.local_today_datas[code]
@@ -59,7 +59,7 @@
 #     if pos_list[-1][1] < total_datas[-1]["index"]:
 #         pos_list.append((pos_list[-1][1] + 1, total_datas[-1]["index"]))
 #     l2_data_manager_new.local_today_datas = {code: []}
-#     l2_trade_factor.L2TradeFactorUtil.get_safe_buy_count = mock.Mock(return_value=30)
+#     l2_trade_factor.L2TradeFactorUtil.get_safe_buy_count = mock.Mock(return_value=10)
 #     for indexs in pos_list:
 #         L2TradeDataProcessor.random_key[code] = mock.Mock(return_value=random.randint(0, 100000))
 #         # 璁剧疆灏佸崟棰濓紝鑾峰彇涔�1閲�
@@ -74,7 +74,7 @@
 #
 #         print("----------------澶勭悊浣嶇疆", indexs)
 #         L2TradeDataProcessor.process_add_datas(code, total_datas[indexs[0]:indexs[1] + 1], 0, 0)
-
+#
 
 # class TestTrade(unittest.TestCase):
 #     processor = L2TradeDataProcessor()
diff --git a/log.py b/log.py
index 1d4c035..6f18ccf 100644
--- a/log.py
+++ b/log.py
@@ -195,25 +195,28 @@
     today_data = {}
     if  date is None:
         date = datetime.datetime.now().strftime("%Y-%m-%d")
-    with open("D:/logs/gp/l2/l2_data.{}.log".format(date), mode='r') as f:
-        while True:
-            data = f.readline()
-            if not data:
-                break
-            index = data.find('save_l2_data:')
-            index = data.find('-', index)
-            data = data[index + 1:].strip()
-            code = data[0:6]
-            data = data[7:]
-            dict_ = eval(data)
-            if code not in today_data:
-                today_data[code] = dict_
-            else:
-                today_data[code].extend(dict_)
-    for key in today_data:
-        news = sorted(today_data[key], key=lambda x: x["index"])
-        today_data[key] = news
-        print(key, len(today_data[key]) - 1, today_data[key][-1]["index"])
+    try:
+        with open("D:/logs/gp/l2/l2_data.{}.log".format(date), mode='r') as f:
+            while True:
+                data = f.readline()
+                if not data:
+                    break
+                index = data.find('save_l2_data:')
+                index = data.find('-', index)
+                data = data[index + 1:].strip()
+                code = data[0:6]
+                data = data[7:]
+                dict_ = eval(data)
+                if code not in today_data:
+                    today_data[code] = dict_
+                else:
+                    today_data[code].extend(dict_)
+        for key in today_data:
+            news = sorted(today_data[key], key=lambda x: x["index"])
+            today_data[key] = news
+            print(key, len(today_data[key]) - 1, today_data[key][-1]["index"])
+    except:
+        pass
     return today_data
 
 
@@ -287,7 +290,7 @@
 
 if __name__ == '__main__':
     # logger_l2_process_time.info("test123")
-    codes = ["603255", "600853", "000620", "002044", "001256"]
+    codes = ["000909"]
     for code in codes:
         export_logs(code)
 
diff --git a/server.py b/server.py
index daa7031..0ce1175 100644
--- a/server.py
+++ b/server.py
@@ -375,7 +375,15 @@
                             if i >= len(codes):
                                 break
                             codes_datas.append((i, codes[i]))
-                        l2_code_operate.betch_set_client_codes(client_id, codes_datas)
+                        # 濡傛灉璁剧疆澶辫触闇�瑕侀噸璇�2娆�
+                        for i in range(0, 3):
+                            set_success = l2_code_operate.betch_set_client_codes(client_id, codes_datas)
+                            if set_success:
+                                break
+                            else:
+                                time.sleep(3)
+
+
                     else:
                         return_json = {"code": 0, "msg": "寮�鍚湪绾跨姸鎬�"}
                         return_str = json.dumps(return_json)
diff --git a/trade_manager.py b/trade_manager.py
index 1f054a6..cddd75f 100644
--- a/trade_manager.py
+++ b/trade_manager.py
@@ -47,6 +47,7 @@
 
 # 璁剧疆浜ゆ槗鐘舵��
 def set_trade_state(code, state):
+    logger_trade.info("set_trade_state {}-{}".format(code, state))
     redis = __redis_manager.getRedis()
     redis.setex("trade-state-{}".format(code), tool.get_expire(), state)
 
@@ -96,7 +97,7 @@
             dict_[trade_num]["money"] = round(float(dict_[trade_num]["money"]) + float(data["money"]), 3)
 
     for key in dict_:
-        data= dict_[key]
+        data = dict_[key]
         _time = data["time"]
         # 杩囨护閿欒鏁版嵁
         if _time == "00:00:00":

--
Gitblit v1.8.0