交易信号生命周期
AQE 使用状态机跟踪交易信号,包含以下状态:
NewExecutedFilledClosedCancelledRejected
典型路径如下:
New -> Executed -> Filled -> ClosedNew -> RejectedExecuted -> CancelledFilled -> Closed
到期、处理器失败、经纪商拒绝和交易更新都会引发这些状态转换。
修改尚未成交的入场订单
Section titled “修改尚未成交的入场订单”处于 Executed 状态的交易信号已提交,但其入场订单可能仍在等待成交。在尚未成交时,持有 &mut Insight 的处理器或其他运行时代码路径可以修改入场价格:
| 方法 | 修改内容 | 适用的挂单类型 |
|---|---|---|
insight.update_limit(ctx, price) | 入场限价 | Limit 或 StopLimit |
insight.update_stop_limit(ctx, price) | 入场触发价 | Stop 或 StopLimit |
对于 StopLimit 入场,这两者是独立的价格组成部分。update_stop_limit 不会修改保护性止损;应使用 update_stop_loss。同样,update_limit 不会修改止盈。
InsightPipeResult::from_mutation(insight.update_limit(ctx, 101.0), self.name())这是用于 InsightState::Executed 状态的 InsightPipe::run 方法中的返回表达式。修改入场触发价时,将 update_limit 替换为 update_stop_limit。使用 from_mutation 可让处理器等待经纪商命令完成,避免把仅已排队的修改视为已完成。
提交前,这两个方法只会在本地设置 New 交易信号的对应价格。修改已提交的入场订单时,价格必须是有限正数,订单类型必须匹配,且必须已知经纪商订单 ID。经纪商还须分别声明支持 AmendLimitPrice 或 AmendStopPrice。修改获确认后,才会记录新价格。如果入场订单已有成交(包括部分成交),或已不再活跃,方法会保留原入场价格,并写入一条状态历史消息。如果订单仍是活跃挂单,但经纪商不支持修改入场价格,则会返回错误。
有关对应的经纪商适配器操作,请参阅经纪商与数据源。
AQE 支持两项重要的生命周期控制:
period_unfilled在交易信号仍为New或Executed时生效。到期后,会根据当前状态拒绝交易信号或请求取消。period_till_tp在交易信号进入Filled状态后生效。到期可触发平仓请求。
这些检查由运行时执行,而不是由 UI 执行。
每项重要变更都可以记录到 state_history 中,包括:
- 状态转换
- 提交
- 经纪商接受
- 成交
- 部分平仓
- 取消请求
- 拒绝
- 到期处理
AQS 和 Backtest Results 共用的检查器正是通过这些历史记录,帮助你复核执行过程。
添加自定义历史消息
Section titled “添加自定义历史消息”如需给交易信号添加复核备注,而不改变其生命周期状态,请使用 state_log(...)。策略钩子接收的是交易信号的共享引用,因此应在持有 &mut Insight 的处理器或其他运行时代码路径中添加备注。
use aq_engine::core::insight::{types::InsightState, Insight};use aq_engine::core::pipeline::{InsightPipe, InsightPipeBuilder, InsightPipeResult};use aq_engine::core::strategy::StrategyContext;
pub struct ReviewNotePipe;
impl InsightPipe for ReviewNotePipe { fn version(&self) -> &str { "1.0" }
fn run(&mut self, _ctx: &mut dyn StrategyContext, insight: &mut Insight) -> InsightPipeResult { insight.state_log(Some("Risk check passed".to_string()));
InsightPipeResult::new( true, true, Some("Review note added to insight history".to_string()), self.name().to_string(), ) }}将处理器注册到希望添加备注的状态:
ctx.add_pipe( InsightPipeBuilder::new(Box::new(ReviewNotePipe)) .target_state(InsightState::Filled) .build(),);state_log(...) 会保留当前状态、更新 updated_at,并将传入的消息追加到 state_history。如果传入 None,AQE 会记录 "State log entry"。
交易信号快照包含 filled_price、close_price、broker_realized_pnl、commission 和 swap 等执行字段。实时运行会将这些快照同步到 AQS Cloud,回测则将其持久化到本地结果数据库。
