跳转到内容

添加事件

add_events 让 AQE 策略在主周期之外,订阅额外的市场数据事件流。首个受支持的事件流是 EventStreamType::Bar。

策略主周期始终根据传给 run_backtest(...) 的周期,或实时运行时配置的周期自动注册。只有在需要 1m、15m 或 1h 等额外特征周期时,才调用 add_events。

在 on_start 中注册特征流:

use aq_engine::core::strategy::{EventStreamType, StrategyContext};
use aq_engine::core::utils::timeframe::{TimeFrame, TimeFrameUnit};
fn on_start(&mut self, ctx: &mut dyn StrategyContext) {
ctx.add_events(
EventStreamType::Bar,
Some(TimeFrame::new(15, TimeFrameUnit::Minute)),
);
}

AQE 会为已加载标的池中的每个资产注册该事件流。如果策略交易 BTC 和 ETH,两个品种都会注册 15m 特征 K 线流。

调用 ctx.add_events(EventStreamType::Bar, None) 指定的是主周期,会与自动注册的主周期事件流去重。

需要设置选项时,使用 EventStreamRequest:

use aq_engine::core::strategy::{EventStreamRequest, EventStreamType, StrategyContext};
use aq_engine::core::utils::timeframe::{TimeFrame, TimeFrameUnit};
fn on_start(&mut self, ctx: &mut dyn StrategyContext) {
ctx.add_events_with_options(
EventStreamRequest::bar(Some(TimeFrame::new(1, TimeFrameUnit::Hour)))
.allow_trading(true),
);
}

allow_trading 控制该事件流是否触发策略和 Alpha 模型生成交易信号:

  • false 是特征流的默认值。AQE 会更新历史数据并调用 on_bar,但不会为该特征事件调用 Alpha 模型的 generate_insights 或策略的 generate_insights。
  • true 允许为该特征事件运行 Alpha 模型的 generate_insights 和策略的 generate_insights。

经纪商执行仍遵循正常路径。特征 K 线用于补充策略上下文、辅助生成信号,不应将其当作独立的经纪商成交流。

主周期保留基础品种代码作为历史数据键:

let main_history = ctx.history().get(symbol);

特征周期使用 {symbol}:{timeframe}:

let feature_history = ctx.history().get("BTC:15m");
let faster_history = ctx.history().get("BTC:1m");
let hourly_history = ctx.history().get("ETH:1h");

这样可将特征数据与策略主历史数据分开。指标和自定义状态应从与其使用的事件或信号匹配的键读取数据。

在 on_bar、Alpha 模型或 generate_insights 中使用 ctx.current_event(),检查 AQE 当前正在处理的事件:

fn on_bar(&mut self, ctx: &mut dyn StrategyContext, symbol: &str, _bar: &BarData) {
let Some(event) = ctx.current_event() else {
return;
};
let history = ctx.history().get(&event.history_key);
if event.is_feature {
println!(
"feature bar: {} {} history={} allow_trading={}",
event.symbol,
event.timeframe,
event.history_key,
event.allow_trading,
);
} else {
println!("main bar: {symbol}");
}
}

StrategyEventContext 包含:

  • event_type
  • symbol
  • timeframe
  • history_key
  • is_feature
  • allow_trading
  • timestamp

该上下文在当前事件的整个 K 线处理过程中保持有效,包括更新历史数据、更新指标、调用 on_bar、由 Alpha 模型生成信号,以及在该事件允许生成交易信号时调用策略的信号生成逻辑。

策略需要同时使用多个市场数据周期时,可使用特征流:

  • 日线策略在生成信号前读取 15m 结构;
  • 1h 策略使用 1m 波动率或流动性筛选条件;
  • 主执行周期需要更高周期的确认。

将主周期保持为主要执行时钟。除非明确允许特征流生成交易信号,否则仅将其用于提供上下文。