#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 交易服务主文件 """ import sys import os import asyncio import uvloop import uvicorn from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware # 使用 uvloop 加速 asyncio_policy = uvloop.EventLoopPolicy() asyncio.set_event_loop_policy(asyncio_policy) from server import TradingServer from routes_ea import create_ea_routes from routes_trader import create_trader_routes from routes_system import create_system_routes from routes_market import create_market_routes from routes_position import create_position_routes from routes_news import create_news_routes def create_app(): """创建并配置 FastAPI 应用""" # 初始化服务 server = TradingServer() # 创建 FastAPI 应用 app = FastAPI( title="高频交易服务 (HFT Trading Service)", description=""" 连接 MT5 EA 和交易指令源的高性能交易中心 ## 功能模块 ### 交易指令 - EA获取交易指令 - 交易员下发交易指令 - 查询待执行指令 ### 行情分析 - K线数据接收与存储 (H4/H1/M15/M5/M1) - 转折点自动检测 - 实时转折点提醒 (WebSocket) ### 系统监控 - 健康检查 - 服务状态查询 """, version="2.0.0" ) # 添加 CORS 中间件 app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 注册路由 app.include_router(create_ea_routes(server)) app.include_router(create_trader_routes(server)) app.include_router(create_system_routes(server)) app.include_router(create_market_routes( server.kline_store, server.kline_service, server.pivot_service, server.tech_service, server.pending_order_service, trading_server=server )) app.include_router(create_position_routes(trading_server=server)) app.include_router(create_news_routes()) # 启动时设置事件循环 @app.on_event("startup") async def startup_event(): loop = asyncio.get_running_loop() server.set_event_loop(loop) # 设置系统日志的事件循环 from market.system_log import get_system_log system_log = get_system_log() system_log.set_event_loop(loop) # 记录系统启动日志 system_log.add_log("system_startup", message="服务已启动") # 启动市场事件监控后台任务 from market.market_event_monitor import get_market_event_monitor monitor = get_market_event_monitor() monitor.set_event_loop(loop) asyncio.create_task(monitor.run()) print("[Startup] 事件循环已设置") print("[Startup] 市场事件监控已启动") return app app = create_app() def main(): """启动服务""" print("=" * 60) print("高频交易服务启动中...") print("=" * 60) print() # 启动参数 host = "0.0.0.0" port = 8000 workers = 1 # FastAPI + uvloop 场景下通常只需要单个 worker print(f"[启动信息] 服务地址: http://{host}:{port}") print(f"[启动信息] Worker 数量: {workers}") print(f"[启动信息] 事件循环: uvloop") print(f"[启动信息] API 文档: http://localhost:{port}/docs") print() print("=" * 60) try: uvicorn.run( "main:app", host=host, port=port, workers=workers, # 启用 uvloop loop="uvloop", # 日志配置 log_level="info", access_log=True, ) except KeyboardInterrupt: print("\n[信息] 服务已停止") except Exception as e: print(f"\n[错误] 启动失败: {e}") sys.exit(1) if __name__ == "__main__": main()