#![feature(drain_filter)] #![feature(bool_to_option)] use fern::colors::{Color, ColoredLevelConfig}; use log::LevelFilter::{Debug, Trace}; use tokio::time::Duration; use crate::bot::BfxBot; use crate::connectors::ExchangeDetails; use crate::currency::Symbol; mod bot; mod connectors; mod currency; mod events; mod managers; mod models; mod strategy; mod ticker; pub type BoxError = Box; #[tokio::main] async fn main() -> Result<(), BoxError> { setup_logger()?; // TEST let test_api_key = "P1EVE68DJByDAkGQvpIkTwfrbYXd2Vo2ZaIhTYb9vx2"; let test_api_secret = "1nicg8z0zKVEt5Rb7ZDpIYjVYVTgvCaCPMZqB0niFli"; // REAL // let orders_api_key = "hc5nDvYbFYJZMKdnzYq8P4AzCSwjxfQHnMyrg69Sf4c"; // let orders_api_secret = "53x9goIOpbOtBoPi7dmigK5Cq5e0282EUO2qRIMEXlh"; // let prices_api_key = "gTfFZUCwRBE0Z9FZjyk9HNe4lZ7XuiZY9rrW71SyUr9"; // let prices_api_secret = "zWbxvoFZad3BPIiXK4DKfEvC0YsAuaApbeAyI8OBXgN"; // let positions_api_key = "PfR7BadPZPNdVZnkHFBfAjsg7gjt8pAecMj5B8eRPFi"; // let positions_api_secret = "izzvxtE3XsBBRpVCHGJ8f60UA56SmPNbBvJGVd67aqD"; let bitfinex = ExchangeDetails::Bitfinex { prices_api_key: test_api_key.into(), prices_api_secret: test_api_secret.into(), orders_api_key: test_api_key.into(), orders_api_secret: test_api_secret.into(), positions_api_key: test_api_key.into(), positions_api_secret: test_api_secret.into(), }; let mut bot = BfxBot::new( vec![bitfinex], vec![Symbol::BTC, Symbol::ETH, Symbol::XMR], Symbol::USD, Duration::new(1, 0), ); Ok(bot.start_loop().await?) } fn setup_logger() -> Result<(), fern::InitError> { let colors = ColoredLevelConfig::new() .info(Color::Green) .error(Color::Red) .trace(Color::Blue) .debug(Color::Cyan) .warn(Color::Yellow); fern::Dispatch::new() .format(move |out, message, record| { out.finish(format_args!( "[{}][{}] {}", record.target(), colors.color(record.level()), message )) }) .level(Trace) .filter(|metadata| metadata.target().contains("rustybot")) .chain(std::io::stdout()) // .chain(fern::log_file("rustico.log")?) .apply()?; Ok(()) }