use kucoin_api::{
client::{Kucoin, KucoinEnv},
model::websocket::{WSTopic, WSType},
};
use kucoin_arbitrage::broker::symbol::kucoin::{format_subscription_list, get_symbols};
use kucoin_arbitrage::event::{order::OrderEvent, orderchange::OrderChangeEvent};
use kucoin_arbitrage::model::counter::Counter;
use kucoin_arbitrage::{
broker::order::kucoin::task_place_order,
model::order::{LimitOrder, OrderSide, OrderType},
};
use kucoin_arbitrage::{
broker::orderchange::kucoin::task_pub_orderchange_event, strings::generate_uid,
};
use kucoin_arbitrage::{broker::symbol::filter::symbol_with_quotes, global};
use std::{sync::Arc, time::Duration};
use tokio::sync::broadcast::channel;
use tokio::sync::Mutex;
use tokio::time::sleep;
#[tokio::main]
async fn main() -> Result<(), failure::Error> {
kucoin_arbitrage::logger::log_init();
log::info!("Log setup");
let order_counter = Arc::new(Mutex::new(Counter::new("order")));
let config = kucoin_arbitrage::config::from_file("config.toml")?;
let api = Kucoin::new(KucoinEnv::Live, Some(config.kucoin_credentials()))?;
let url_private = api.clone().get_socket_endpoint(WSType::Private).await?;
log::info!("Credentials setup");
let symbol_list = get_symbols(api.clone()).await;
log::info!("Total exchange symbols: {:?}", symbol_list.len());
let symbol_infos = symbol_with_quotes(&symbol_list, "BTC", "USDT");
log::info!("Total symbols in scope: {:?}", symbol_infos.len());
let subs = format_subscription_list(&symbol_infos);
log::info!("Total orderbook WS sessions: {:?}", subs.len());
let (tx_order, rx_order) = channel::<OrderEvent>(16);
let (tx_orderchange, _rx_orderchange) = channel::<OrderChangeEvent>(128);
log::info!("Broadcast channels setup");
tokio::spawn(task_place_order(
rx_order,
api.clone(),
order_counter.clone(),
));
let mut ws_private = api.websocket();
ws_private
.subscribe(
url_private.clone(),
vec![
WSTopic::TradeOrders,
WSTopic::Balances,
WSTopic::PositionChange,
],
)
.await?;
tokio::spawn(task_pub_orderchange_event(ws_private, tx_orderchange));
log::info!("All application tasks setup");
global::timer::start("order_placement_network".to_string()).await;
global::timer::start("order_placement_broadcast".to_string()).await;
let event = OrderEvent::PostOrder(LimitOrder {
id: generate_uid(40),
order_type: OrderType::Limit,
side: OrderSide::Buy,
symbol: "BTC-USDT".to_string(),
amount: 0.001.to_string(),
price: 29947.0.to_string(),
});
if let Err(e) = tx_order.send(event) {
log::error!("{e}");
}
loop {
sleep(Duration::from_secs(60)).await;
}
}