Aller au contenu

Add Events

add_events permet à une stratégie AQE de s’abonner à des flux de données de marché supplémentaires en plus du timeframe principal de la stratégie. Le premier type pris en charge est EventStreamType::Bar.

Le timeframe principal est toujours enregistré automatiquement depuis le timeframe passé à run_backtest(...) ou configuré pour le runtime live. Utilisez add_events uniquement pour ajouter des timeframes de contexte comme 1m, 15m ou 1h.

Enregistrez les flux dans 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 applique ce flux à chaque actif de l’univers chargé. Si la stratégie suit BTC et ETH, un flux feature 15m est enregistré pour les deux symboles.

Utilisez EventStreamRequest pour définir des options :

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 contrôle la génération côté stratégie et modèles alpha :

  • false est le défaut pour les flux feature. AQE met l’historique à jour et appelle on_bar, mais n’appelle pas generate_insights pour cet événement feature.
  • true autorise les modèles alpha et la stratégie à générer des insights pour cet événement feature.

L’exécution broker suit toujours le chemin d’exécution normal. Les barres feature servent surtout à enrichir le contexte et la génération de signaux.

Le timeframe principal conserve la clé symbole :

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

Les timeframes feature utilisent {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");

Utilisez ctx.current_event() dans on_bar, les modèles alpha ou generate_insights :

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: {} {}", event.symbol, event.timeframe);
} else {
println!("main bar: {symbol}");
}
}

StrategyEventContext expose event_type, symbol, timeframe, history_key, is_feature, allow_trading et timestamp.