diff --git a/py-client/config/__pycache__/__init__.cpython-311.pyc b/py-client/config/__pycache__/__init__.cpython-311.pyc index 2238bba..a2f2a65 100644 Binary files a/py-client/config/__pycache__/__init__.cpython-311.pyc and b/py-client/config/__pycache__/__init__.cpython-311.pyc differ diff --git a/py-client/libs/__pycache__/__init__.cpython-311.pyc b/py-client/libs/__pycache__/__init__.cpython-311.pyc index 4cc46b6..d082834 100644 Binary files a/py-client/libs/__pycache__/__init__.cpython-311.pyc and b/py-client/libs/__pycache__/__init__.cpython-311.pyc differ diff --git a/py-client/libs/__pycache__/lockfile.cpython-311.pyc b/py-client/libs/__pycache__/lockfile.cpython-311.pyc new file mode 100644 index 0000000..bc8afe9 Binary files /dev/null and b/py-client/libs/__pycache__/lockfile.cpython-311.pyc differ diff --git a/py-client/main.py b/py-client/main.py index b45f3f9..907aba0 100644 --- a/py-client/main.py +++ b/py-client/main.py @@ -1,11 +1,11 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -import logging as log +import logging from logging.handlers import TimedRotatingFileHandler import os import sys -import time +import schedule import config from dataclasses import dataclass import yaml @@ -16,6 +16,12 @@ GLOBAL_CONFIG_PATH = os.path.join(PROJECT_ROOT, "etc", "_global.yaml") if PROJECT_ROOT not in sys.path: sys.path.insert(0, PROJECT_ROOT) +logging.basicConfig( + level=logging.INFO, + format='[%(levelname)s] %(asctime)s %(message)s', + datefmt='%Y-%m-%d %H:%M:%S' +) + from sdk import APIError, Client from strategy.trend.boot import StartTrend from strategy.ipo import AutoBuyIpo @@ -45,16 +51,16 @@ def check_single_instance(project_root: str) -> bool: kernel32 = ctypes.WinDLL("kernel32", use_last_error=True) handle = kernel32.CreateMutexW(None, True, mutex_name) if not handle or handle == invalid_handle_value: - log.error(f"无法创建互斥锁,错误代码:{ctypes.get_last_error()}") + logging.error(f"无法创建互斥锁,错误代码:{ctypes.get_last_error()}") return False if ctypes.get_last_error() == error_already_exists: - log.error("程序已在运行中,无法启动多个实例") + logging.error("程序已在运行中,无法启动多个实例") kernel32.CloseHandle(handle) return False - log.info(f"成功获取互斥锁:{mutex_name}") + logging.info(f"成功获取互斥锁:{mutex_name}") return True except Exception as exc: - log.error(f"单实例检测失败:{exc}", exc_info=True) + logging.error(f"单实例检测失败:{exc}", exc_info=True) return False @@ -66,11 +72,11 @@ def wait_for_qmt_api(retry_interval: float = 5.0) -> None: while not retry_event.is_set(): try: client.assets() - log.info(f"API 服务已连通:{config.global_config.qmt_base_url}") + logging.info(f"API 服务已连通:{config.global_config.qmt_base_url}") client.close() return except (APIError, httpx.RequestError) as exc: - log.warning( + logging.warning( "API 服务未就绪:%s,%g 秒后重试:%s", config.global_config.qmt_base_url, retry_interval, @@ -78,27 +84,6 @@ def wait_for_qmt_api(retry_interval: float = 5.0) -> None: ) retry_event.wait(retry_interval) - -def configure_logging(data_dir: str) -> None: - """同时输出控制台日志和按天轮转的文本日志。""" - log_dir = os.path.join(data_dir, "logs") - os.makedirs(log_dir, exist_ok=True) - root = log.getLogger() - root.setLevel(log.INFO) - formatter = log.Formatter("%(asctime)s [%(levelname)s] %(message)s") - if not root.handlers: - console = log.StreamHandler() - console.setFormatter(formatter) - root.addHandler(console) - file_handler = TimedRotatingFileHandler( - os.path.join(log_dir, "py-client.log"), - when="midnight", - interval=1, - backupCount=30, - encoding="utf-8", - ) - file_handler.setFormatter(formatter) - root.addHandler(file_handler) def wait_for_any_key() -> None: print("按任意键退出...", flush=True) @@ -121,13 +106,15 @@ def main() -> int: config.load() if config.global_config is None or config.account_config is None: raise RuntimeError("配置尚未加载,请先调用 config.load()") - configure_logging(config.global_config.qmt_data_dir) wait_for_qmt_api() # 自动打新与主策略隔离;申购服务失败不能阻止趋势策略启动。 - AutoBuyIpo() + schedule.every().day.at("10:00").do(AutoBuyIpo) + schedule.run_pending() + logging.info("IPO 自动打新启动成功") STRATEGIES[config.account_config.strategy].start_strategy() + logging.info("%s 策略启动成功",config.account_config.strateg) return 0 except (OSError, yaml.YAMLError, ValueError, RuntimeError, KeyError) as exc: print(f"启动失败: {exc}", file=sys.stderr, flush=True) diff --git a/py-client/sdk/__pycache__/client.cpython-311.pyc b/py-client/sdk/__pycache__/client.cpython-311.pyc index dc358af..34ba3db 100644 Binary files a/py-client/sdk/__pycache__/client.cpython-311.pyc and b/py-client/sdk/__pycache__/client.cpython-311.pyc differ diff --git a/py-client/sdk/__pycache__/trade.cpython-311.pyc b/py-client/sdk/__pycache__/trade.cpython-311.pyc index e521143..3907e5a 100644 Binary files a/py-client/sdk/__pycache__/trade.cpython-311.pyc and b/py-client/sdk/__pycache__/trade.cpython-311.pyc differ diff --git a/py-client/sdk/client.py b/py-client/sdk/client.py index c37bcd5..72188d9 100644 --- a/py-client/sdk/client.py +++ b/py-client/sdk/client.py @@ -19,7 +19,7 @@ class Client: self.base_url = base_url.rstrip("/") self.token = token self.timeout = timeout if timeout > 0 else 15.0 - self.account_type = "stock" + self.account_type = "STOCK" self.http = httpx.Client( base_url=self.base_url, headers={"X-Token": token, "Accept": "application/json"}, diff --git a/py-client/strategy/ipo/__pycache__/__init__.cpython-311.pyc b/py-client/strategy/ipo/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..6864222 Binary files /dev/null and b/py-client/strategy/ipo/__pycache__/__init__.cpython-311.pyc differ diff --git a/py-client/strategy/ipo/__pycache__/boot.cpython-311.pyc b/py-client/strategy/ipo/__pycache__/boot.cpython-311.pyc index 2a702f8..e500050 100644 Binary files a/py-client/strategy/ipo/__pycache__/boot.cpython-311.pyc and b/py-client/strategy/ipo/__pycache__/boot.cpython-311.pyc differ diff --git a/py-client/strategy/trend/__pycache__/boot.cpython-311.pyc b/py-client/strategy/trend/__pycache__/boot.cpython-311.pyc index 940009a..6192430 100644 Binary files a/py-client/strategy/trend/__pycache__/boot.cpython-311.pyc and b/py-client/strategy/trend/__pycache__/boot.cpython-311.pyc differ diff --git a/py-client/strategy/trend/boot.py b/py-client/strategy/trend/boot.py index feed013..515c7ca 100644 --- a/py-client/strategy/trend/boot.py +++ b/py-client/strategy/trend/boot.py @@ -99,12 +99,6 @@ def StartTrend() -> None: profit_tracker=GridTrailingTracker(config.account_config.grid_step_pct), ) - logging.info( - "趋势策略启动:总资产=%.2f,持仓=%d,信号=%d", - assets.total, - len(positions), - len(signals), - ) Overview(assets, positions, config.account_config) while True: