guaiwoluo2020 ef15b92342 feat: 优化市场视图和新闻存储功能
- Market.vue 新增 K 线图表和技术指标显示
- News.vue 优化新闻列表展示
- news_store.py 增强新闻存储和查询功能
- routes_ea.py 修复路由问题
- wangxxGold.mq5 EA 策略优化
2026-03-17 20:54:45 +08:00

高性能行情分析交易服务

功能介绍

这是一个为MT5 EA提供支持的高性能交易服务,采用FastAPI框架,支持以下功能:

核心功能

1. EA接口 - MT5 EA与服务通信

  • GET /get_trades - EA获取待执行的交易指令(按SYMBOL分类)
  • POST /send_statistics - EA发送每分钟的统计数据
  • POST /ea/kline/{period} - EA推送K线数据 (H4/H1/M15/M5/M1)
  • POST /ea/kline_batch - EA批量推送多个周期的K线数据

2. 行情分析接口

  • GET /market/kline/{symbol} - 查询K线数据
  • GET /market/pivots/{symbol} - 查询转折点数据
  • GET /market/status - 获取行情存储状态
  • GET /market/thresholds - 获取各周期接近阈值
  • WebSocket /ws/market - 实时转折点提醒推送

3. 交易员接口 - 交易员下发指令和查询数据

  • POST /send_trade_instructions - 下发交易指令
  • GET /query_pending_trades - 查询所有待执行指令
  • DELETE /clear_trades - 清空交易指令
  • GET /query_statistics - 查询统计数据(保留最新10条)

4. 系统接口 - 服务监控和健康检查

  • GET /health - 健康检查
  • GET /status - 服务状态

新增功能:转折点检测与提醒

K线数据接收

EA启动后会推送各周期K线数据:

周期 历史数据要求
H4 (4小时) 最近6个月
H1 (1小时) 最近1个月
M15 (15分钟) 最近3天
M5 (5分钟) 最近24小时
M1 (1分钟) 最近1小时

转折点检测

服务自动检测K线的转折点(高点/低点):

  • 使用分型识别算法(顶分型/底分型)
  • 默认左右各3根K线确认转折

接近阈值

各周期距离转折点的提醒阈值:

周期 阈值 说明
H4 千分之6 如GOLD高点5000,当前4980提醒
H1 千分之3 如GOLD高点5000,当前4985提醒
M15 千分之1.5 -
M5 千分之0.5 -
M1 千分之0.2 -

实时提醒

EA调用 /get_trades 时携带价格参数,服务自动检查是否接近转折点,返回提醒信息。

同时支持WebSocket推送实时提醒到前端页面。

安装和运行

环境要求

  • Python 3.7+
  • 依赖包:
    pip install fastapi uvicorn uvloop pydantic requests
    

启动服务

python trading_server.py

输出示例:

============================================================
启动行情分析交易服务
============================================================
[INFO] 服务将运行在 http://localhost:5858
[INFO] API文档: http://localhost:5858/docs
[INFO] 备用文档: http://localhost:5858/redoc
============================================================

运行测试

python test_trading_service.py

API 详细说明

1. EA - 获取交易指令

端点: GET /get_trades?symbol=gold&price=2035.50

描述: EA调用此接口获取待执行的交易指令。支持基于当前价格的条件过滤。

请求参数:

参数 类型 必需 说明
symbol string 交易品种,如 "gold", "eurusd"
price float 当前市场价格,用于执行条件过滤

价格条件过滤逻辑:

  • 买入指令 (action='b'):若指令的执行价格 price > 当前价格,则指令被缓存,暂不下发(等待价格跌到指令价格)
  • 卖出指令 (action='s'):若指令的执行价格 price < 当前价格,则指令被缓存,暂不下发(等待价格涨到指令价格)
  • 满足条件的指令会被推送给EA并删除
  • 不满足条件的指令保留在内存中,等待下次价格更新时重新评估

返回值 (JSON数组):

[
    {
        "symbol": "gold",
        "action": "b",           // b=买入, s=卖出
        "mount": 0.01,           // 手数
        "price": 2030.00,        // 指令的执行价格
        "sl": 5000,              // 止损点
        "tp": 5100               // 止盈点
    },
    {
        "symbol": "gold",
        "action": "s",
        "mount": 0.02,
        "price": 2035.00,
        "sl": 2035,
        "tp": 2025
    }
]

流程:

  1. EA每100毫秒调用此接口,携带当前SYMBOL和市场价格
  2. 服务基于价格条件过滤该SYMBOL的所有待执行指令
  3. 返回满足条件的指令列表
  4. 已推送的指令会被删除,未满足条件的指令保留在内存中
  5. 如果没有符合条件的指令,返回空数组 []

2. EA - 发送统计数据

端点: POST /send_statistics

描述: EA每分钟调用此接口发送统计数据。服务自动保留最新10条数据。

请求体 (JSON):

{
    "timestamp": "2026-03-04 14:30:00",
    "tickCount": 1234,           // 该分钟内TICK总数
    "bidPrice": 2035.50,         // 买价
    "askPrice": 2035.60,         // 卖价
    "balance": 50000.00,         // 账户余额
    "equity": 51234.56,          // 账户权益
    "marginLevel": 98.50,        // 预付款比例(%
    "positions": [               // 持仓信息
        {
            "ticket": 123456,
            "volume": 0.01,
            "priceOpen": 2030.00,
            "type": "BUY",
            "profit": 55.60,
            "distanceSL": 30.50,  // 距离止损的点数
            "distanceTP": 35.40   // 距离止盈的点数
        }
    ],
    "trades": [                  // 该分钟的交易记录
        {
            "time": "2026-03-04 14:30:00",
            "action": "BUY",
            "symbol": "GOLD",
            "volume": 0.01,
            "price": 2030.00,
            "sl": 2000,
            "tp": 2100
        }
    ]
}

响应:

{
    "status": "success",
    "message": "统计数据已记录"
}

3. 交易员 - 下发交易指令

端点: POST /send_trade_instructions

描述: 交易员通过此接口下发交易指令。指令保存在内存中,等待EA获取。

注意: 如果交易指令中未提供 tp 或者 tp<=0 服务端会自动将tp设为 0.005sl 缺失保持为 0.0EA端还有后续处理)。

请求体 (JSON数组):

[
    {
        "symbol": "gold",
        "action": "b",
        "mount": 0.01,
        "price": 2030.00,       // 指令的买入价格(用于价格过滤)
        "sl": 5000,
        "tp": 5100
    },
    {
        "symbol": "eurusd",
        "action": "s",
        "mount": 0.02,
        "price": 1.0900,        // 指令的卖出价格(用于价格过滤)
        "sl": 1.0950,
        "tp": 1.0850
    }
]

新规则:若同时指定 sltp

  • 买入指令要求 sl < price < tp
  • 卖出指令要求 tp < price < sl。 不满足规则的指令将被服务器拒绝并忽略。

响应:

{
    "status": "success",
    "count": 2,
    "message": "已添加 2 条交易指令"
}

使用示例 (curl):

curl -X POST "http://localhost:5858/send_trade_instructions" \
     -H "Content-Type: application/json" \
     -d '[
       {"symbol":"gold","action":"b","mount":0.01,"sl":5000,"tp":5100},
       {"symbol":"eurusd","action":"s","mount":0.02,"sl":1.0950,"tp":1.0850}
     ]'

4. 交易员 - 查询待执行指令

端点: GET /query_pending_trades

描述: 查询所有待执行的交易指令(不删除)。

请求参数: 无

响应:

{
    "status": "success",
    "total": 5,
    "data": {
        "GOLD": [
            {
                "symbol": "gold",
                "action": "b",
                "mount": 0.01,
                "sl": 5000,
                "tp": 5100
            },
            {
                "symbol": "gold",
                "action": "s",
                "mount": 0.02,
                "sl": 2035,
                "tp": 2025
            }
        ],
        "EURUSD": [
            {
                "symbol": "eurusd",
                "action": "s",
                "mount": 0.02,
                "sl": 1.0950,
                "tp": 1.0850
            }
        ]
    }
}

5. 交易员 - 查询统计数据

端点: GET /query_statistics?count=10

描述: 查询最新的统计数据。服务自动保留最新10条,可指定返回数量。

请求参数:

参数 类型 必需 默认值 说明
count int 10 返回最新N条数据(最多100条)

响应:

{
    "status": "success",
    "count": 3,
    "data": [
        {
            "timestamp": "2026-03-04 14:30",
            "tickCount": 1234,
            "bidPrice": 2035.50,
            "askPrice": 2035.60,
            "balance": 50000.00,
            "equity": 51234.56,
            "marginLevel": 98.50,
            "positions": [...],
            "trades": [...]
        },
        {...},
        {...}
    ]
}

6. 交易员 - 清空交易指令

端点: DELETE /clear_trades?symbol=gold

描述: 清空指定SYMBOL的待执行指令,或清空所有指令。

请求参数:

参数 类型 必需 说明
symbol string 指定品种。不指定则清空所有

响应:

{
    "status": "success",
    "cleared": 3,
    "message": "已清空 3 条交易指令"
}

7. 系统 - 健康检查

端点: GET /health

描述: 检查服务是否正常运行。

响应:

{
    "status": "healthy",
    "service": "Trading Analysis Server",
    "timestamp": "2026-03-04T14:30:45.123456"
}

8. 系统 - 服务状态

端点: GET /status

描述: 获取实时的服务状态信息。

响应:

{
    "status": "running",
    "pending_trades": {
        "GOLD": 2,
        "EURUSD": 1
    },
    "total_pending": 3,
    "statistics_records": 5,
    "timestamp": "2026-03-04T14:30:45.123456"
}

工作流程

┌─────────────────────────────────────────────────────────────┐
│                    交易员/分析系统                           │
└──────────────────────────┬──────────────────────────────────┘
                          │
        ┌─────────────────┼─────────────────┐
        │                 │                 │
        ▼                 ▼                 ▼
  下发指令         查询待执行           查询统计数据
  (POST)            (GET)                (GET)
        │                 │                 │
        └─────────────────┼─────────────────┘
                          │
                 ┌────────▼────────┐
                 │  Python服务     │
                 │  (internal)     │
                 └────────┬────────┘
                          │
        ┌─────────────────┼─────────────────┐
        │                 │                 │
        ▼                 ▼                 ▼
  GET /get_trades  POST /send_statistics  健康检查
  (每100毫秒)        (每分钟)              (GET)
        │                 │                 │
        └─────────────────┼─────────────────┘
                          │
┌─────────────────────────▼──────────────────────────────────┐
│                      MT5 EA                                 │
│  - 接收交易指令                                             │
│  - 执行买卖操作                                             │
│  - 监控持仓风险                                             │
│  - 统计TICK数据                                             │
└─────────────────────────────────────────────────────────────┘

性能特性

高性能设计

  • FastAPI框架: 基于Starlette和Pydantic,性能优异
  • 异步处理: 完全异步,支持高并发请求
  • 多Worker进程: 默认4个worker,可根据CPU核心数调整
  • UVloop: 使用高性能事件循环
  • 线程安全: 内存数据使用线程锁保护

并发能力

  • 支持数千并发连接
  • 平均响应时间 < 10ms
  • 内存指令队列,无数据库I/O

数据持久化说明

当前特性

  • ✓ 交易指令保存在内存中(推送后删除)
  • ✓ 统计数据保量最新10条
  • ✗ 无数据持久化到磁盘

如需持久化

可选方案:

  1. 添加SQLite数据库支持
  2. 添加CSV日志输出
  3. 集成Redis缓存

常见问题

Q: 指令为什么被删除了?

A: 设计就是这样的。EA获取指令后,立即删除,确保不会重复执行。如果需要保留历史,服务已在统计数据的trades字段中记录。

Q: 指令丢失怎么办?

A:

  1. 所有指令都在/query_pending_trades可见
  2. 已推送指令会记录在统计数据中
  3. 可以查看服务日志追踪

Q: 如何处理超过10条的统计数据?

A: 服务自动删除最早的数据,保留最新10条。可在代码中修改maxlen=10来改变保留数量。

Q: 支持多SYMBOL吗?

A: 完全支持。指令按SYMBOL分类,EA可以只获取自己需要的品种。

扩展建议

短期改进

  1. 添加数据持久化(SQLite/PostgreSQL
  2. 添加WebSocket支持(实时推送)
  3. 添加认证和日志审计

长期规划

  1. 集成实时行情数据
  2. 添加风险分析引擎
  3. 支持历史数据分析
  4. 添加监控和告警系统

维护和监控

查看日志

# 服务会输出所有操作日志
# [信息] 已添加 XXX 条交易指令
# [信息] 推送了 XXX 条 SYMBOL 指令给EA

检查服务状态

curl http://localhost:5858/status

性能监控

  • 监控total_pending数量,不应该持续增加
  • 监控statistics_records数量,应该≤10

许可证

MIT License

S
Description
No description provided
Readme 358 KiB
Languages
Python 64.9%
Vue 23.4%
MQL5 8.7%
JavaScript 1.6%
Shell 0.8%
Other 0.5%