From a99df93c160cd4feb4fb9ee076a49672c5ee0d02 Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期二, 14 五月 2024 00:40:55 +0800
Subject: [PATCH] 成交队列输出

---
 output/output_util.py               |    4 +
 output/l2_output_util.py            |   83 +++++++++++++++++++++++++++++++++++++++++
 trade/huaxin/huaxin_trade_server.py |   25 +++++++++++-
 3 files changed, 109 insertions(+), 3 deletions(-)

diff --git a/output/l2_output_util.py b/output/l2_output_util.py
new file mode 100644
index 0000000..20810a5
--- /dev/null
+++ b/output/l2_output_util.py
@@ -0,0 +1,83 @@
+"""
+L2鏁版嵁杈撳嚭宸ュ叿
+"""
+from l2 import l2_data_util, l2_data_source_util
+from l2.l2_data_util import L2DataUtil, local_today_canceled_buyno_map
+from l2.l2_transaction_data_manager import HuaXinBuyOrderManager
+from l2.transaction_progress import TradeBuyQueue
+
+
+def __get_trade_queue(code, start_index, end_index, real_place_order_index, max_count, step=1):
+    fresults = []
+    # 姝e湪鎴愪氦鐨勬暟鎹�
+    dealing_info = HuaXinBuyOrderManager.get_dealing_order_info(code)
+    total_datas = l2_data_util.local_today_datas.get(code)
+    for i in range(start_index, end_index, step):
+        data = total_datas[i]
+        val = data['val']
+        if not L2DataUtil.is_limit_up_price_buy(val):
+            continue
+        if val["num"] * float(val['price']) < 5000 and real_place_order_index != i:
+            continue
+        left_count = l2_data_source_util.L2DataSourceUtils.get_limit_up_buy_no_canceled_count_v2(code, i,
+                                                                                                 total_datas,
+                                                                                                 local_today_canceled_buyno_map.get(
+                                                                                                     code))
+        if left_count > 0:
+            type_ = 0
+            num = val['num']
+            if dealing_info and str(total_datas[i]["val"]["orderNo"]) == str(
+                    dealing_info[0]):
+                # 鍑忓幓褰撳墠姝e湪鎴愪氦鐨勬暟鎹腑宸茬粡鎴愪氦浜嗙殑鏁版嵁
+                num -= dealing_info[1] // 100
+            if i == real_place_order_index:
+                type_ = 1
+            elif num * float(val['price']) >= 29900:
+                type_ = 2
+
+            fresults.append((val['num'], type_))
+            if len(fresults) > max_count:
+                break
+    return fresults
+
+
+def get_trade_queue_at_near_place_order(code, real_place_order_index, max_count):
+    """
+    鑾峰彇鐪熷疄涓嬪崟浣嶉檮杩戠殑鎴愪氦闃熷垪
+    @param code:
+    @param real_place_order_index:
+    @param max_count:
+    @return:
+    """
+    total_datas = l2_data_util.local_today_datas.get(code)
+    trade_index, is_default = TradeBuyQueue().get_traded_index(code)
+    if trade_index is None:
+        trade_index = 0
+    threshold_before_count = max_count // 2
+
+    fresults = __get_trade_queue(code, real_place_order_index, trade_index - 1,real_place_order_index, threshold_before_count, -1)
+    fresults.reverse()
+    fresults.extend(__get_trade_queue(code, real_place_order_index+1,  total_datas[-1]['index'] + 1, real_place_order_index, max_count - threshold_before_count, 1))
+    return fresults
+
+
+def get_trade_queue(code, real_place_order_index, max_count):
+    """
+    鑾峰彇鐪熷疄涓嬪崟浣嶉檮杩戠殑鎴愪氦闃熷垪
+    @param code:
+    @param real_place_order_index:
+    @param max_count:
+    @return:
+    """
+    total_datas = l2_data_util.local_today_datas.get(code)
+    trade_index, is_default = TradeBuyQueue().get_traded_index(code)
+    if trade_index is None:
+        trade_index = 0
+    # 鍓嶉潰鏈�澶氬彇5鏉℃暟鎹�
+    fresults = []
+    fresults.extend(__get_trade_queue(code, trade_index,  total_datas[-1]['index'] + 1,real_place_order_index,  max_count, 1))
+    return fresults
+
+
+
+
diff --git a/output/output_util.py b/output/output_util.py
index 2cc5ce8..968c799 100644
--- a/output/output_util.py
+++ b/output/output_util.py
@@ -1,5 +1,5 @@
 import time
-
+from l2 import l2_data_util
 
 def money_desc(money):
     if abs(money) > 100000000:
@@ -12,3 +12,5 @@
     if timestamp:
         return time.strftime("%H:%M:%S", time.localtime(int(timestamp)))
     return ""
+
+
diff --git a/trade/huaxin/huaxin_trade_server.py b/trade/huaxin/huaxin_trade_server.py
index 3cf48d4..2c4f42a 100644
--- a/trade/huaxin/huaxin_trade_server.py
+++ b/trade/huaxin/huaxin_trade_server.py
@@ -47,6 +47,7 @@
     hx_logger_l2_orderdetail, hx_logger_l2_transaction, hx_logger_l2_market_data, logger_l2_g_cancel, logger_debug, \
     logger_system, logger_trade, logger_trade_position_api_request, logger_request_api, \
     logger_local_huaxin_l1_trade_info, logger_real_place_order_position, logger_l2_trade_buy
+from output import l2_output_util
 from third_data import block_info, kpl_data_manager, kpl_util
 from third_data.code_plate_key_manager import KPLCodeJXBlockManager, CodePlateKeyBuyManager
 from third_data.history_k_data_util import JueJinApi, HistoryKDatasUtils
@@ -1377,6 +1378,7 @@
                             if int(c["direction"]) != huaxin_util.TORA_TSTP_D_Buy:
                                 continue
                             code = c["securityID"]
+                            orderSysID = c.get("orderSysID")
                             code_name = gpcode_manager.get_code_name(code)
                             # 鑾峰彇涓嬪崟浣嶇疆淇℃伅
                             order_begin_pos = TradePointManager().get_buy_compute_start_data_cache(code)
@@ -1553,7 +1555,7 @@
                                             break
                             except:
                                 pass
-                            fdata = {"code_info": (code, code_name), "total_num": total_nums,
+                            fdata = {"id":orderSysID, "code_info": (code, code_name), "total_num": total_nums,
                                      "finish_num": deal_or_cancel_num,
                                      "buy1_money": output_util.money_desc(buy1_money),
                                      "big_num_count": total_big_count,
@@ -1574,13 +1576,24 @@
                                          total_left_num * float(limit_up_price) * 100 * 100 / buy1_money, 2),  # 鎴愪氦杩涘害姣斾緥
                                      "limit_up_price": float(gpcode_manager.get_limit_up_price(code)),
                                      "is_near_big_order": is_near_big_order,
-                                     "block": ''
+                                     "block": '',
+                                     "trade_queue": []
                                      }
                             # 鑾峰彇褰撳墠鏉垮潡
                             try:
                                 can_buy_result = CodePlateKeyBuyManager.can_buy(code)
                                 if can_buy_result and can_buy_result[0]:
                                     fdata['block'] = ",".join(can_buy_result[0])
+                            except:
+                                pass
+
+                            try:
+                                real_place_order_index = SCancelBigNumComputer().get_real_place_order_index_cache(code)
+                                if real_place_order_index is not None:
+                                    trade_queue = l2_output_util.get_trade_queue_at_near_place_order(code,
+                                                                                                     real_place_order_index,
+                                                                                                     11)
+                                    fdata['trade_queue'] = trade_queue
                             except:
                                 pass
                             fdatas.append(fdata)
@@ -1661,6 +1674,14 @@
                 # 淇浠诲姟
                 kpl_data_manager.PullTask.repaire_pull_task()
                 self.send_response({"code": 0, "data": {}}, client_id, request_id)
+            elif ctype == "get_trade_queue":
+                code = data["code"]
+                real_place_order_index = SCancelBigNumComputer().get_real_place_order_index_cache(code)
+                if real_place_order_index is not None:
+                    trade_queue = l2_output_util.get_trade_queue(code,real_place_order_index, 11)
+                    self.send_response({"code": 0, "data": trade_queue}, client_id, request_id)
+                else:
+                    raise Exception("娌¤幏鍙栧埌鐪熷疄涓嬪崟浣�")
         except Exception as e:
             logging.exception(e)
             self.send_response({"code": 1, "msg": f"鏁版嵁澶勭悊鍑洪敊锛歿e}"}, client_id, request_id)

--
Gitblit v1.8.0