经纪商与数据源
AQE 将市场数据与交易执行分离。数据源提供历史数据和价格,执行适配器管理订单和账户状态。UnifiedBroker 将两者组合,让策略在历史测试和实时运行中使用相同的结构。
| 用途 | 实现 |
|---|---|
| 模拟执行 | PaperBroker |
| MetaTrader 5 执行 | Mt5Broker |
| 市场数据 | YahooFinanceDataFeed、Mt5DataFeed |
有关模拟执行和费用假设,请参阅 PaperBroker 指南。有关 Expert Advisor 和桥接配置,请参阅 MT5 指南。
let execution = PaperBroker::new(AccountType::Paper, 100_000.0, 1);let data = YahooFinanceDataFeed::new();let broker = UnifiedBroker::new_backtest(execution, data);当前执行 API
Section titled “当前执行 API”0.2.0 API 提交的是 BrokerOrderRequest,而不是将整个交易信号传给经纪商适配器。该请求包含执行所需的入场参数、保护设置和标识信息。
let request = aq_engine::core::broker::BrokerOrderRequest::from(&insight);let order = broker.submit_order(request).await?;此代码片段假设你已创建经纪商适配器和交易信号,并导入 OrderManagementProvider。策略中的处理器通常应通过策略上下文请求变更,并保留尚未完成的结果;请参阅信号处理器。
自定义适配器的经纪商状态变更方法必须返回满足 Send 的 future。替换入场挂单时使用 replace_order;修改保护设置时使用 update_take_profit 或 update_stop_loss。不要再使用已移除且含义模糊的 update_order 接口。
对于已提交但尚未成交的 Executed 交易信号,update_limit(ctx, price) 修改入场限价,update_stop_limit(ctx, price) 修改入场触发价。后者并非修改保护性止损。执行适配器通过 amend_entry_prices(order_id, limit_price, stop_price) 处理这些操作,并通过 AmendLimitPrice 或 AmendStopPrice 声明所支持的能力。这类价格修改不会改变订单数量;replace_order 则是独立操作。有关状态和确认规则,请参阅交易信号生命周期。
创建自己的数据源
Section titled “创建自己的数据源”通过实现 DataFeed 和 DataProvider,连接自己的市场数据服务、交易所 API 或历史数据集。这些 trait 涵盖连接管理、资产元数据、历史 K 线、当前价格和订阅。可以将其与 PaperBroker 配合,在不依赖实时执行的情况下测试数据。
有关必需方法、K 线和报价格式、能力标志及验证清单,请阅读创建自定义数据源。
创建自定义经纪商适配器
Section titled “创建自定义经纪商适配器”通过实现 Broker 和 OrderManagementProvider,接入交易执行场所。适配器负责将 AQE 订单请求转换为该场所的 API 调用,返回账户和持仓状态,并报告订单生命周期事件。UnifiedBroker 可以将其与现有数据源或自定义数据源组合使用。
有关执行接口约定、有界事件队列、保护设置管理和恢复要求,请阅读创建自定义经纪商适配器。
这些是编译到策略中的 Rust 集成。实现 trait 并不会自动将提供商添加到 AQS 连接选择器。
报价与 K 线数据
Section titled “报价与 K 线数据”| 来源 | 报价行为 |
|---|---|
| MT5 实时连接 | 对原生买卖报价采样,不依赖 K 线周期 |
| Yahoo 实时运行或模拟交易 | 轮询分钟 K 线,以收盘价构造买价等于卖价的合成报价 |
| 回测回放 | 根据已处理的历史 K 线生成合成报价 |
合成报价不提供真实点差或可执行价格。回测不会获取当前市场报价。报价订阅不会引入策略 on_quote 回调,也不会使回测由逐笔行情驱动。
编写自定义数据消费端时,请检查 DataFeedFeature::QuoteStream 以及原生报价或合成报价的能力标志。使用唯一的订阅 ID,并且只释放自己的订阅。回调应简短且非阻塞。
容量与仓位计算
Section titled “容量与仓位计算”当前引擎区分三项限制:
| 字段 | 含义 |
|---|---|
Account.max_total_orders | 最大挂单数量 |
Asset.max_order_size | 单个入场订单的最大数量 |
Asset.max_total_size | 单个品种的总数量上限 |
仓位计算会在拆分订单前计入活跃订单和已预留的数量。MT5 通过更新后的 Expert Advisor 报告容量。模拟执行不会从数据源继承实时交易账户的所有限制。
预留仅在策略内部生效。其他策略或手动订单可能占用账户容量;即使通过本地验证,经纪商仍可能拒绝订单。重试前请检查拒绝原因。
AQS 显示已送达的账户数据、净值、事件和交易信号。命令获确认不等于订单已成交;数据缺失或未及时更新,也不能证明订单已取消。结果不确定时,请检查经纪商记录和交易信号历史。
