From ca310f014336d93eba73ed5010c1c5645424a1e0 Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期五, 04 八月 2023 16:06:28 +0800
Subject: [PATCH] 交易优化

---
 trade_client.py |   99 +++++++++++++++++++++++++++++--------------------
 1 files changed, 58 insertions(+), 41 deletions(-)

diff --git a/trade_client.py b/trade_client.py
index 4ed8a27..3aa188e 100644
--- a/trade_client.py
+++ b/trade_client.py
@@ -548,7 +548,7 @@
                         % (nRequestID, pRspInfoField.ErrorID, pRspInfoField.ErrorMsg))
 
     def OnRtnOrder(self, pOrderField: "CTORATstpOrderField") -> "void":
-        logger.info(
+        logger_trade_debug.info(
             '[%d] OnRtnOrder: SInfo[%s] InvestorID[%s] SecurityID[%s] OrderRef[%d] OrderLocalID[%s] LimitPrice[%.2f] VolumeTotalOriginal[%d] OrderSysID[%s] OrderStatus[%s]'
             % (round(time.time() * 1000), pOrderField.SInfo, pOrderField.InvestorID, pOrderField.SecurityID,
                pOrderField.OrderRef, pOrderField.OrderLocalID,
@@ -563,7 +563,7 @@
                                                  "accountID": pOrderField.AccountID})
 
     def OnRtnTrade(self, pTradeField: "CTORATstpTradeField") -> "void":
-        logger.info(
+        logger_trade_debug.info(
             'OnRtnTrade: TradeID[%s] InvestorID[%s] SecurityID[%s] OrderRef[%d] OrderLocalID[%s] Price[%.2f] Volume[%d]'
             % (pTradeField.TradeID, pTradeField.InvestorID, pTradeField.SecurityID,
                pTradeField.OrderRef, pTradeField.OrderLocalID, pTradeField.Price, pTradeField.Volume))
@@ -724,7 +724,7 @@
 
     def OnTrade(self, client_id, request_id, type_, data):
         if type_ == 1:
-            logger_trade_debug.info(f"璇锋眰涓嬪崟锛歝lient_id-{client_id} request_id-{request_id} data-{data}")
+            logger_trade_debug.info(f"---------------------\n璇锋眰涓嬪崟锛歝lient_id-{client_id} request_id-{request_id}")
             # 涓嬪崟
             # 1-涔� 2-鍗�
             direction = data["direction"]
@@ -738,8 +738,8 @@
                     req_rid_dict[sinfo] = (client_id, request_id)
                     self.__tradeSimpleApi.buy(code, volume, price, sinfo)
                 except Exception as e:
-                    SendResponseSkManager.get_send_response_sk(TYPE_ORDER).sendall(
-                        json.dumps({"code": 1, "msg": str(e)}).encode("utf-8"))
+                    send_response(json.dumps({"code": 1, "msg": str(e)}).encode("utf-8"), TYPE_ORDER, client_id,
+                                  request_id)
 
             elif direction == 2:
                 try:
@@ -749,11 +749,12 @@
                     print("sell", req_rid_dict)
                 except Exception as e:
                     logging.exception(e)
-                    SendResponseSkManager.get_send_response_sk(TYPE_ORDER).sendall(
-                        json.dumps({"code": 1, "msg": str(e)}).encode("utf-8"))
+                    send_response(json.dumps({"code": 1, "msg": str(e)}).encode("utf-8"), TYPE_ORDER, client_id,
+                                  request_id)
 
         elif type_ == 2:
-            logger_trade_debug.info(f"璇锋眰鎾ゅ崟锛歝lient_id-{client_id} request_id-{request_id} data-{data}")
+            logger_trade_debug.info(
+                f"---------------------\n璇锋眰鎾ゅ崟锛歝lient_id-{client_id} request_id-{request_id} data-{data}")
             # 鎾ゅ崟
             direction = data["direction"]
             code = data["code"]
@@ -765,8 +766,8 @@
                     req_rid_dict[sinfo] = (client_id, request_id)
                     self.__tradeSimpleApi.cancel_buy(code, orderSysID, sinfo)
                 except Exception as e:
-                    SendResponseSkManager.get_send_response_sk(TYPE_CANCEL_ORDER).sendall(
-                        json.dumps({"code": 1, "msg": str(e)}).encode("utf-8"))
+                    send_response(json.dumps({"code": 1, "msg": str(e)}).encode("utf-8"), TYPE_CANCEL_ORDER, client_id,
+                                  request_id)
 
             elif direction == 2:
                 # 鎾ゅ崠
@@ -774,8 +775,8 @@
                     req_rid_dict[sinfo] = (client_id, request_id)
                     self.__tradeSimpleApi.cancel_sell(code, orderSysID, sinfo)
                 except Exception as e:
-                    SendResponseSkManager.get_send_response_sk(TYPE_CANCEL_ORDER).sendall(
-                        json.dumps({"code": 1, "msg": str(e)}).encode("utf-8"))
+                    send_response(json.dumps({"code": 1, "msg": str(e)}).encode("utf-8"), TYPE_CANCEL_ORDER, client_id,
+                                  request_id)
 
     def OnDealList(self, client_id, request_id):
         logger_trade_debug.info(f"璇锋眰鎴愪氦鍒楄〃锛歝lient_id-{client_id} request_id-{request_id}")
@@ -793,7 +794,8 @@
             req_id = self.__tradeSimpleApi.list_delegate_orders(is_cancel)
             req_rid_dict[req_id] = (client_id, request_id)
         except Exception as e:
-            SendResponseSkManager.send_error_response("common", request_id, client_id, str(e))
+            send_response(json.dumps({"code": 1, "msg": str(e)}).encode("utf-8"), "common", client_id,
+                          request_id)
 
     def OnMoney(self, client_id, request_id):
         logger_trade_debug.info(f"璇锋眰璐︽埛锛歝lient_id-{client_id} request_id-{request_id}")
@@ -801,7 +803,8 @@
             req_id = self.__tradeSimpleApi.get_money_account()
             req_rid_dict[req_id] = (client_id, request_id)
         except Exception as e:
-            SendResponseSkManager.send_error_response("common", request_id, client_id, str(e))
+            send_response(json.dumps({"code": 1, "msg": str(e)}).encode("utf-8"), "common", client_id,
+                          request_id)
 
     def OnPositionList(self, client_id, request_id):
         logger_trade_debug.info(f"璇锋眰鎸佷粨锛歝lient_id-{client_id} request_id-{request_id}")
@@ -809,7 +812,8 @@
             req_id = self.__tradeSimpleApi.list_positions()
             req_rid_dict[req_id] = (client_id, request_id)
         except Exception as e:
-            SendResponseSkManager.send_error_response("common", request_id, client_id, str(e))
+            send_response(json.dumps({"code": 1, "msg": str(e)}).encode("utf-8"), "common", client_id,
+                          request_id)
 
 
 def __init_trade_data_server():
@@ -866,35 +870,44 @@
 
 
 def __send_response(type, data_bytes):
-    sk = SendResponseSkManager.get_send_response_sk(type)
-    data_bytes = socket_util.load_header(data_bytes)
-    sk.sendall(data_bytes)
-    result, header_str = socket_util.recv_data(sk)
-    result = json.loads(result)
-    if result["code"] != 0:
-        raise Exception(result['msg'])
+    sk = SendResponseSkManager.create_send_response_sk()
+    try:
+        data_bytes = socket_util.load_header(data_bytes)
+        sk.sendall(data_bytes)
+        result, header_str = socket_util.recv_data(sk)
+        result = json.loads(result)
+        if result["code"] != 0:
+            raise Exception(result['msg'])
+    finally:
+        sk.close()
+
+
+def send_response(data_bytes, type, _client_id, _request_id):
+    for i in range(3):
+        response_client_type = f"{type}#{_client_id}"
+        try:
+            __send_response(response_client_type, data_bytes)
+            print("鍙戦�佹暟鎹垚鍔�")
+            logger_trade_debug.info(f"绗瑊i}娆″彂閫佹暟鎹垚鍔燂細type-{type},request_id-{_request_id}")
+            break
+        except ConnectionResetError:
+            logger_trade_debug.error(f"绗瑊i}娆″彂閫佹暟鎹け璐ワ細type-{type},request_id-{_request_id} 鍘熷洜锛欳onnectionResetError")
+            SendResponseSkManager.del_send_response_sk(response_client_type)
+        except BrokenPipeError:
+            logger_trade_debug.error(f"绗瑊i}娆″彂閫佹暟鎹け璐ワ細type-{type},request_id-{_request_id} 鍘熷洜锛欱rokenPipeError")
+            SendResponseSkManager.del_send_response_sk(response_client_type)
+        except TimeoutError:
+            logger_trade_debug.error(f"绗瑊i}娆″彂閫佹暟鎹け璐ワ細type-{type},request_id-{_request_id} 鍘熷洜锛歍imeoutError")
+            SendResponseSkManager.del_send_response_sk(response_client_type)
+        except Exception as e1:
+            logger_trade_debug.error(f"绗瑊i}娆″彂閫佹暟鎹け璐ワ細type-{type},request_id-{_request_id} 鍘熷洜锛歿str(e1)}")
+            logger_trade_debug.exception(e1)
+            pass
 
 
 # 浜ゆ槗鍙嶉鍥炶皟
 def __traderapi_callback(type, req_id, data):
-    def send_response(data_str, _client_id, _request_id):
-        for i in range(3):
-            try:
-                __send_response(f"{type}#{_client_id}", data_str)
-                print("鍙戦�佹暟鎹垚鍔�")
-                logger_trade_debug.info(f"绗瑊i}娆″彂閫佹暟鎹垚鍔燂細type-{type},request_id-{_request_id}")
-                break
-            except ConnectionResetError as e:
-                SendResponseSkManager.del_send_response_sk(type)
-            except BrokenPipeError as e:
-                SendResponseSkManager.del_send_response_sk(type)
-            except Exception as e:
-                logger_trade_debug.info(f"绗瑊i}娆″彂閫佹暟鎹け璐ワ細type-{type},request_id-{_request_id}")
-                logger_trade_debug.exception(e)
-                pass
-
-    print("鍥炶皟", type, req_id, data)
-    print("杩涚▼ID", os.getpid())
+    logger_trade_debug.info("鍥炶皟:type-{} req_id-{}", type, req_id)
     key = req_id
     if type == TYPE_ORDER or type == TYPE_CANCEL_ORDER:
         key = data["sinfo"]
@@ -903,16 +916,20 @@
         if req_rid_dict and key in req_rid_dict:
             print("API鍥炶皟")
             client_id, request_id = req_rid_dict.pop(key)
+            logger_trade_debug.info("API鍥炶皟 request_id-{}", request_id)
             # 娴嬭瘯
             send_response(
                 json.dumps({"type": "response", "data": {"code": 0, "data": data}, "client_id": client_id,
-                            "request_id": request_id}).encode('utf-8'), client_id, request_id)
+                            "request_id": request_id}).encode('utf-8'), type, client_id, request_id)
+            logger_trade_debug.info("API鍥炶皟缁撴潫 req_id-{} request_id-{}", req_id, request_id)
             print("API鍥炶皟缁撴潫")
         else:
+            logger_trade_debug.info("闈濧PI鍥炶皟 req_id-{}", req_id)
             print("闈濧PI鍥炶皟")
             # 闈濧PI鍥炶皟
             send_response(
                 json.dumps({"type": "trade_callback", "data": {"code": 0, "data": data, "type": type}}).encode('utf-8'),
+                type,
                 None,
                 req_id)
             print("闈濧PI缁撴潫")

--
Gitblit v1.8.0