跳转到内容

交易信号生命周期

AQE 使用状态机跟踪交易信号,包含以下状态:

  • New
  • Executed
  • Filled
  • Closed
  • Cancelled
  • Rejected

典型路径如下:

  • New -> Executed -> Filled -> Closed
  • New -> Rejected
  • Executed -> Cancelled
  • Filled -> Closed

到期、处理器失败、经纪商拒绝和交易更新都会引发这些状态转换。

处于 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 共用的检查器正是通过这些历史记录,帮助你复核执行过程。

如需给交易信号添加复核备注,而不改变其生命周期状态,请使用 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,回测则将其持久化到本地结果数据库。