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