| |
| |
| |
| |
| |
| |
| |
|
|
| mod binance_client; |
| mod lob; |
| mod publisher; |
|
|
| use clap::Parser; |
| use tracing::{info, Level}; |
|
|
| #[derive(Parser, Debug)] |
| #[command(name = "flash-crash-proxy", version, about)] |
| struct Args { |
| |
| #[arg(long, default_value = "BTCUSDT")] |
| symbol: String, |
|
|
| |
| #[arg(long, default_value_t = 20)] |
| depth: usize, |
|
|
| |
| #[arg(long, default_value = "tcp://127.0.0.1:5555")] |
| out: String, |
|
|
| |
| #[arg(short, long)] |
| verbose: bool, |
| } |
|
|
| #[tokio::main] |
| async fn main() -> Result<(), Box<dyn std::error::Error>> { |
| let args = Args::parse(); |
|
|
| |
| let level = if args.verbose { Level::DEBUG } else { Level::INFO }; |
| tracing_subscriber::fmt().with_max_level(level).init(); |
|
|
| info!("Flash Crash Proxy starting"); |
| info!(" Symbol: {}", args.symbol); |
| info!(" Depth: {} levels", args.depth); |
| info!(" Output: {}", args.out); |
|
|
| |
| let publisher = publisher::Publisher::new(&args.out)?; |
| let publisher_task = tokio::spawn(async move { |
| if let Err(e) = publisher.run().await { |
| tracing::error!("Publisher error: {}", e); |
| } |
| }); |
|
|
| |
| let client = binance_client::BinanceClient::new( |
| args.symbol.clone(), |
| args.depth, |
| ); |
| client.run().await?; |
|
|
| publisher_task.await?; |
| Ok(()) |
| } |
|
|