Stratégie vide
Commencez avec la plus petite surface de stratégie possible. Elle donne les hooks runtime sans introduire encore de modèles alpha ni de pipes.
use aq_engine::core::broker::data_feeds::yahoo::YahooFinanceDataFeed;use aq_engine::core::broker::paper_broker::PaperBroker;use aq_engine::core::broker::types::{AccountType, Asset, BarData};use aq_engine::core::broker::UnifiedBroker;use aq_engine::core::insight::Insight;use aq_engine::core::strategy::{ EventStreamType, Strategy, StrategyContext, StrategyMode, StrategyState,};use aq_engine::core::utils::timeframe::{TimeFrame, TimeFrameUnit};use chrono::{Duration, Utc};use std::collections::HashSet;
pub struct BlankStrategy;
impl Strategy for BlankStrategy { fn on_start(&mut self, ctx: &mut dyn StrategyContext) { // Le timeframe principal est enregistré automatiquement. // Ceci ajoute un flux de barres de contexte pour chaque symbole de l’univers. ctx.add_events( EventStreamType::Bar, Some(TimeFrame::new(15, TimeFrameUnit::Minute)), ); }
fn init(&mut self, _ctx: &mut dyn StrategyContext, _asset: &Asset) {}
fn universe(&self, _ctx: &mut dyn StrategyContext) -> HashSet<String> { HashSet::from([String::from("AAPL")]) }
fn on_bar(&mut self, _ctx: &mut dyn StrategyContext, _symbol: &str, _bar: &BarData) {}
fn generate_insights(&mut self, _ctx: &mut dyn StrategyContext, _symbol: &str) {}
fn insight_pipeline(&mut self, _ctx: &mut dyn StrategyContext, _insight: &Insight) {}
fn on_teardown(&mut self, _ctx: &mut dyn StrategyContext) {}}
let execution = PaperBroker::new(AccountType::Paper, 100_000.0, 1);let data = YahooFinanceDataFeed::new();let broker = UnifiedBroker::new_backtest(execution, data);
let timeframe = TimeFrame::new(1, TimeFrameUnit::Day);let strategy = BlankStrategy;
let mut state = StrategyState::new( "blank-strategy".to_string(), "1.0.0".to_string(), strategy, broker, StrategyMode::Backtest, timeframe.clone(),);
let start = Utc::now() - Duration::days(30);let end = Utc::now();
let results = state.run_backtest(start, end, timeframe).await?;results.print_metrics();Ce bloc montre le plus petit chemin complet : définir une stratégie, connecter un paper broker et un datafeed, exécuter le backtest et inspecter les métriques produites. L’appel add_events enregistre un timeframe de contexte supplémentaire; le timeframe principal de stratégie continue de s’exécuter automatiquement.
Générer Un Insight
Section intitulée « Générer Un Insight »Vous créez généralement un insight dans un modèle alpha ou dans generate_insights(), puis vous laissez le pipeline d’insights le dimensionner, ajouter les contrôles de risque et le soumettre.
use aq_engine::core::broker::types::OrderSide;use aq_engine::core::insight::{types::StrategyType, Insight};
fn generate_insights(&mut self, ctx: &mut dyn StrategyContext, symbol: &str) { let mut insight = Insight::new( OrderSide::Buy, symbol.to_string(), StrategyType::Testing, ctx.timeframe().clone(), 80, None, );
insight .set_limit_price(Some(200.0)) .set_take_profit_levels(Some(vec![206.0])) .set_stop_loss(Some(197.5)) .set_period_unfilled(Some(5)) .set_period_till_tp(Some(12));
ctx.add_insight(insight);}Pour le modèle complet, consultez Insights. Pour le sizing, la validation et la soumission, consultez Pipelines d’insights.
Nous utilisons des cookies et du stockage essentiels pour la connexion, la sécurité du compte, les préférences de thème, cet avis et les métriques internes PostHog nécessaires sur l’utilisation, la qualité de session et la fiabilité. Nous n’utilisons pas de cookies publicitaires.
