From f8aa6f5fab0b354a06029237e325cda7dbd88a53 Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期二, 21 五月 2024 01:08:14 +0800
Subject: [PATCH] bug修复

---
 main.py |  125 +++++++++++++++++++++++++++++++++++++----
 1 files changed, 113 insertions(+), 12 deletions(-)

diff --git a/main.py b/main.py
index e9e1d95..fb74471 100644
--- a/main.py
+++ b/main.py
@@ -1,18 +1,58 @@
 """
 鍙浆鍊哄叆鍙e嚱鏁�
 """
+import json
+import logging
 import multiprocessing
 import threading
 import time
 
-from code_attribute import target_codes_manager
+from code_attribute import target_codes_manager, gpcode_manager
 from huaxin_client import l2_client_for_cb, trade_client_for_cb
+from huaxin_client.client_network import SendResponseSkManager
 from log_module import async_log_util
-from trade import huaxin_trade_api, huaxin_trade_data_update
-from utils import middle_api_protocol, outside_api_command_manager, constant
+from records import huaxin_trade_record_manager
+from trade import huaxin_trade_api, huaxin_trade_data_update, huaxin_sell_util
+from utils import middle_api_protocol, outside_api_command_manager, constant, tool, huaxin_util, socket_util, sell_util
 
 constant.LOG_DIR = "logs_cb"
-from log_module.log import logger_debug, logger_trade
+from log_module.log import logger_debug, logger_trade, printlog
+import concurrent.futures
+
+__cancel_sell_thread_pool = concurrent.futures.ThreadPoolExecutor(max_workers=8)
+
+
+def __send_response(data_bytes):
+    sk = SendResponseSkManager.create_send_response_sk(addr=middle_api_protocol.SERVER_HOST,
+                                                       port=middle_api_protocol.SERVER_PORT)
+    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, _client_id, _request_id):
+    data_bytes = json.dumps({"type": "response", "data": data, "client_id": _client_id,
+                             "request_id": _request_id}).encode('utf-8')
+    for i in range(3):
+        try:
+            __send_response(data_bytes)
+            printlog("鍙戦�佹暟鎹垚鍔�")
+            break
+        except Exception as e1:
+            logging.exception(e1)
+
+
+# 鎾ら暱鏈熸病鏈夋垚浜ょ殑鍗�
+def __cancel_not_deal_order(code, order_ref, timeout=3):
+    time.sleep(timeout)
+    # 鎾や拱鍗�
+    huaxin_trade_api.cancel_order(1, code, "", orderRef=order_ref)
 
 
 def command_callback(client_id, request_id, data):
@@ -25,20 +65,81 @@
     """
     type_ = data.get('type')
     if type_ == outside_api_command_manager.API_TYPE_TRADE:
-        # 浜ゆ槗
-        pass
+        try:
+            trade_type = data["trade_type"]
+            if trade_type == outside_api_command_manager.TRADE_TYPE_ORDER:
+                code = data["code"]
+                direction = data["direction"]
+                volume = data["volume"]
+                price_type = data["price_type"]
+                price = data["price"]
+                sinfo = data["sinfo"]
+                if direction == 2:
+                    # price_type: 0-浠锋牸绗煎瓙 1-璺屽仠浠�  2-娑ㄥ仠浠� 3-鐜颁环 4-涔�5浠�
+                    async_log_util.info(logger_trade, f"API鍗�: 鎺ユ敹鏁版嵁-{data}")
+                    current_price = None  # L1DataProcessor.get_l1_current_price(code)
+                    limit_down_price = target_codes_manager.get_limit_down_price(code)
+                    limit_up_price = target_codes_manager.get_limit_up_price(code)
+                    order_ref = huaxin_util.create_order_ref()
+                    try:
+                        result = huaxin_sell_util.start_sell(code, volume, price_type, limit_up_price,
+                                                             limit_down_price,
+                                                             current_price, blocking=True, request_id=request_id,
+                                                             order_ref=order_ref)
+                        async_log_util.info(logger_trade, f"API鍗栫粨鏋�: {result}")
+                        send_response(result, client_id, request_id)
+                    except Exception as e:
+                        if str(e).find("瓒呮椂") >= 0:
+                            send_response({"code": 0, "data": {"orderRef": order_ref}}, client_id, request_id)
+                        else:
+                            raise e
+                else:
+                    if not price:
+                        limit_down_price = target_codes_manager.get_limit_down_price(code)
+                        limit_up_price = target_codes_manager.get_limit_up_price(code)
+                        price = sell_util.get_sell_price(price_type, limit_up_price, limit_down_price, None)
+                        if not price:
+                            raise Exception("灏氭湭鑾峰彇鍒颁拱鍏ヤ环鏍�")
+                        # 鑾峰彇涔�1閲戦
+                        price = round(float(price), 3)
+                        order_ref = huaxin_util.create_order_ref()
+                        result = huaxin_trade_api.order(direction, code, volume, price,
+                                                        sinfo=sinfo, order_ref=order_ref,
+                                                        blocking=True, request_id=request_id)
+                        # 2s鍐呮病鎴愪氦灏辨挙鍗�
+                        __cancel_sell_thread_pool.submit(__cancel_not_deal_order, code, order_ref)
+                    else:
+                        result = huaxin_trade_api.order(direction, code, volume, price,
+                                                        sinfo=sinfo,
+                                                        blocking=True, request_id=request_id)
+                    send_response({"code": 0, "data": result}, client_id, request_id)
+        except Exception as e:
+            logger_debug.exception(e)
+            send_response({"code": 1, "msg": str(e)}, client_id, request_id)
     elif type_ == "get_code_position_info":
         # 鏌ヨ姝や粨
-        pass
-    elif type_ == "get_code_position_info":
-        # 鏌ヨ姝や粨
-        pass
+        code = data.get("code")
+        results = huaxin_trade_record_manager.PositionManager().list_by_day(tool.get_now_date_str("%Y%m%d"), code)
+        send_response({"code": 0, "data": results}, client_id, request_id)
+    elif type_ == "refresh_trade_data":
+        # 鍒锋柊浜ゆ槗鏁版嵁
+        ctype = data.get("ctype")
+        if ctype == "money":
+            huaxin_trade_data_update.add_money_list()
+        elif ctype == "position_list":
+            huaxin_trade_data_update.add_position_list()
+        elif ctype == "deal_list":
+            huaxin_trade_data_update.add_deal_list()
+        elif ctype == "position_list":
+            huaxin_trade_data_update.add_delegate_list("鎵嬪姩鍒锋柊")
+        send_response({"code": 0, "data": {}}, client_id, request_id)
     elif type_ == outside_api_command_manager.API_TYPE_COMMON_REQUEST:
         # 甯歌鎺ュ彛
         ctype = data['ctype']
         if ctype == 'get_account_money':
             # 鑾峰彇璐︽埛璧勯噾
-            pass
+            result = huaxin_trade_record_manager.MoneyManager.get_data()
+            send_response({"code": 0, "data": result}, client_id, request_id)
     logger_debug.info(f"鎺ユ敹鍒板懡浠わ細{request_id} - f{client_id} - {data}")
 
 
@@ -110,4 +211,4 @@
     # ===========寮傛鏃ュ織鎸佷箙鍖�==========
     threading.Thread(target=async_log_util.run_sync, daemon=True).start()
     # 杩愯L2鏁版嵁鐩戝惉闃熷垪
-    l2_client_for_cb.run(trade_call_back_queue)
\ No newline at end of file
+    l2_client_for_cb.run(trade_call_back_queue)

--
Gitblit v1.8.0