添加事件
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");这样可将特征数据与策略主历史数据分开。指标和自定义状态应从与其使用的事件或信号匹配的键读取数据。
读取当前事件
Section titled “读取当前事件”在 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_typesymboltimeframehistory_keyis_featureallow_tradingtimestamp
该上下文在当前事件的整个 K 线处理过程中保持有效,包括更新历史数据、更新指标、调用 on_bar、由 Alpha 模型生成信号,以及在该事件允许生成交易信号时调用策略的信号生成逻辑。
何时使用特征流
Section titled “何时使用特征流”策略需要同时使用多个市场数据周期时,可使用特征流:
- 日线策略在生成信号前读取
15m结构; 1h策略使用1m波动率或流动性筛选条件;- 主执行周期需要更高周期的确认。
将主周期保持为主要执行时钟。除非明确允许特征流生成交易信号,否则仅将其用于提供上下文。
