use redfolder::config::RedFolderConfig;
use redfolder::events::RedFolderEvent;
use redfolder::service::RedFolderService;
use std::time::Duration;
use tokio::time::sleep;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== RedFolder Event-Driven Trading Bot Example ===");
let service = RedFolderService::new(None);
let config = RedFolderConfig::builder()
.currencies(vec!["USD", "EUR"])
.impacts(vec!["High"])
.buffer_minutes(15, 15)
.warning_minutes(5)
.build();
let mut event_rx = service
.register_worker_events("eurusd_scalper", config)
.await?;
let mut global_bus = service.subscribe();
tokio::spawn(async move {
while let Ok(event) = global_bus.recv().await {
match &event {
RedFolderEvent::CalendarUpdated {
total_events,
total_windows,
} => {
println!(
"[Audit Log] Economic calendar refreshed: {} events, {} active windows.",
total_events, total_windows
);
}
RedFolderEvent::CalendarSyncFailed { error } => {
println!("[Audit Log] Economic calendar sync failed: {error}");
}
RedFolderEvent::BlackoutWarning {
window,
minutes_until_start,
worker_id,
} => {
println!(
"[Risk Alert] Worker {:?}: Window '{}' begins in {} minutes!",
worker_id,
window.summary_title(),
minutes_until_start
);
}
RedFolderEvent::BlackoutStarted { window, worker_id } => {
println!(
"[Risk Alert] Worker {:?}: ENTERED blackout '{}'.",
worker_id,
window.summary_title()
);
}
RedFolderEvent::BlackoutEnded { window, worker_id } => {
println!(
"[Risk Alert] Worker {:?}: EXITED blackout '{}'.",
worker_id,
window.summary_title()
);
}
}
}
});
println!("Bot registered. Listening for real-time blackout events...");
tokio::spawn(async move {
while let Some(event) = event_rx.recv().await {
match event {
RedFolderEvent::BlackoutWarning {
window,
minutes_until_start,
..
} => {
println!(
"\n⚠️ [BOT ACTION] ADVANCE WARNING: Blackout starts in {} minutes!",
minutes_until_start
);
println!(" Window: {}", window.summary_title());
println!(" -> Action: Cancelling pending limit orders...");
println!(" -> Action: Tightening stop-loss on open positions...");
}
RedFolderEvent::BlackoutStarted { window, .. } => {
println!(
"\n🚨 [BOT ACTION] HARD BLACKOUT ACTIVE: {}",
window.summary_title()
);
println!(" Remaining: {} minutes", window.remaining_minutes());
println!(" -> Action: HALTING strategy execution.");
println!(" -> Action: Rejecting all new buy/sell signals.");
}
RedFolderEvent::BlackoutEnded { .. } => {
println!("\n🟢 [BOT ACTION] BLACKOUT CLEARED.");
println!(" -> Action: Resuming normal automated execution.");
}
_ => {}
}
}
});
service.start().await?;
sleep(Duration::from_secs(2)).await;
service.stop().await;
println!("\nService stopped gracefully.");
Ok(())
}