Files

152 lines
3.8 KiB
Python

#!/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()