外汇引擎

📎 引用文件

本文引用的文件 - forex.py - _market_hooks.py - base.py - models.py - mt5_loader.py - README.md - constraints.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录:配置与示例

简介

本文件面向外汇回测引擎,系统性说明外汇市场交易特性(货币对报价、点差、隔夜利息 Swap、杠杆、最小交易单位)、主要货币对与交叉汇率处理、交易时间与时区差异、策略回测配置、风险与资金管理、与经纪商 API 的集成方式及数据源选择建议。重点覆盖外汇 24×5 交易特性、高杠杆风险管理以及跨时区数据处理挑战。

项目结构

外汇回测能力由“引擎层 + 市场钩子 + 数据加载器”构成: - 引擎层:ForexEngine 实现外汇特有的滑点、点差、Swap、手数等规则;BaseEngine 提供统一的回测执行框架。 - 市场钩子:_market_hooks.py 集中了符号归一化、点值计算、Swap 表与计算逻辑。 - 数据加载器:mt5_loader.py 对接本地 MT5 终端,获取外汇/贵金属 OHLCV 数据,支持多周期与自动符号解析。

graph TB A["策略信号"] --> B["BaseEngine.run_backtest()"] B --> C["DataLoader.fetch()"] C --> D["MT5 加载器 (mt5_loader.py)"] B --> E["ForexEngine.on_bar()"] E --> F["_market_hooks.calc_forex_swap()"] B --> G["指标与产出"]

图表来源 - base.py:647-718 - mt5_loader.py:170-251 - forex.py:124-132 - _market_hooks.py:332-373

章节来源 - forex.py:1-137 - base.py:377-800 - mt5_loader.py:1-251 - _market_hooks.py:1-374

核心组件

章节来源 - forex.py:56-137 - base.py:377-644 - _market_hooks.py:23-115 - mt5_loader.py:170-251 - models.py:13-118

架构总览

外汇回测的核心流程如下: - 数据加载:通过 DataLoader 接口获取 OHLCV,优先使用 mt5_loader(若可用),否则走其他数据源。 - 信号生成与对齐:BaseEngine 将信号按各自交易日历对齐,构建统一日期索引与价格矩阵。 - 逐根 K 线执行:调用 ForexEngine 的 can_execute、apply_slippage、round_size、calc_commission、on_bar 等钩子。 - 指标与产出:统计收益、回撤、换手率、按标的统计等,并输出可复现实验产物。

sequenceDiagram participant S as "策略" participant BE as "BaseEngine" participant DL as "DataLoader" participant FE as "ForexEngine" participant MH as "_market_hooks" S->>BE : run_backtest(config, loader, signal_engine) BE->>DL : fetch(codes, start, end, interval) DL-->>BE : data_map BE->>S : generate(data_map) S-->>BE : signal_map BE->>BE : _align(日期对齐/权重) loop 每根K线 BE->>FE : can_execute(symbol, direction, bar) alt 允许交易 BE->>FE : apply_slippage(price, direction) BE->>FE : round_size(raw_size, price) BE->>FE : calc_commission(size, price, direction, is_open) BE->>FE : on_bar(symbol, bar, timestamp) FE->>MH : calc_forex_swap(...) MH-->>FE : swap金额 FE-->>BE : 更新资金/持仓 end end BE-->>S : 指标与产物

图表来源 - base.py:647-718 - forex.py:76-132 - _market_hooks.py:332-373

详细组件分析

外汇交易特性与引擎实现

flowchart TD Start(["进入 on_bar"]) --> CheckSwap{"是否启用 Swap?"} CheckSwap --> |否| End(["结束"]) CheckSwap --> |是| CalcSwap["计算 Swap<br/>lots = size / lot_size<br/>swap_per_lot = 查表(方向)"] CalcSwap --> Wed{"是否为周三?"} Wed --> |是| Triple["乘以 3 倍"] Wed --> |否| Normal["正常倍数"] Triple --> Apply["资本 += swap"] Normal --> Apply Apply --> End

图表来源 - forex.py:124-132 - _market_hooks.py:332-373

章节来源 - forex.py:23-137 - _market_hooks.py:310-373

主要货币对与点差/点值

章节来源 - forex.py:23-54 - _market_hooks.py:322-329

交叉汇率与定价

章节来源 - _market_hooks.py:322-329 - forex.py:98-122

交易时间与跨时区处理

章节来源 - mt5_loader.py:239-246 - forex.py:76-78

与经纪商 API 集成(MT5)

章节来源 - mt5_loader.py:1-19 - mt5_loader.py:121-147 - mt5_loader.py:170-251

数据源选择建议

章节来源 - mt5_loader.py:1-19 - README.md:338-359

依赖关系分析

classDiagram class BaseEngine { +run_backtest() +can_execute() +apply_slippage() +round_size() +calc_commission() +on_bar() } class ForexEngine { +spread_override +lot_size +swap_enabled +slippage_pips +apply_slippage_for_symbol() +on_bar() } class MarketHooks { +_normalize_symbol() +calc_forex_swap() +_pip_value() } class MT5Loader { +fetch() +is_available() } class Models { +Position +FillRecord +TradeRecord +EquitySnapshot } ForexEngine --|> BaseEngine : "继承" ForexEngine --> MarketHooks : "调用" BaseEngine --> Models : "使用" BaseEngine --> MT5Loader : "数据加载"

图表来源 - base.py:377-644 - forex.py:56-137 - _market_hooks.py:310-373 - mt5_loader.py:170-251 - models.py:13-118

章节来源 - base.py:377-800 - forex.py:56-137 - _market_hooks.py:310-373 - mt5_loader.py:170-251 - models.py:13-118

性能考量

章节来源 - base.py:149-249 - forex.py:98-122 - _market_hooks.py:332-373 - mt5_loader.py:53-58

故障排查指南

章节来源 - mt5_loader.py:61-108 - mt5_loader.py:121-147 - forex.py:124-132 - mt5_loader.py:239-246

结论

该外汇回测引擎以 BaseEngine 为核心,结合 ForexEngine 的外汇专属规则与 _market_hooks 的工具函数,实现了点差/滑点、Swap、杠杆与保证金、手数粒度等关键特性。通过 mt5_loader 接入本地 MT5 终端,可获得贴近真实市场的历史数据与交易时间。配合约束与优化器,可实现稳健的风险管理与资金管理。建议在实盘前充分验证点差、Swap 与滑点参数,并结合多数据源回退策略保障鲁棒性。

附录:配置与示例

章节来源 - forex.py:59-74 - README.md:338-359 - constraints.py:1-200