diff --git a/rustybot/src/managers.rs b/rustybot/src/managers.rs index e8d01a2..a848599 100644 --- a/rustybot/src/managers.rs +++ b/rustybot/src/managers.rs @@ -293,8 +293,41 @@ impl PositionManager { pub type TrackedPositionsMap = HashMap; +pub struct OrderManagerHandle { + sender: Sender, +} + +impl OrderManagerHandle { + async fn run_order_manager(mut manager: OrderManager) { + while let Some(msg) = manager.receiver.recv().await { + manager.handle_message(msg).await.unwrap(); + } + } + + pub fn new(pair: SymbolPair, client: Client, strategy: Box) -> Self { + let (sender, receiver) = channel(8); + + let manager = OrderManager::new(receiver, pair, client, strategy); + + tokio::spawn(OrderManagerHandle::run_order_manager(manager)); + + Self { sender } + } + + pub async fn update(&mut self, tick: u64) { + self.sender.send(SignalKind::Update(tick)).await.unwrap(); + } + + pub async fn close_position(&mut self, position: Position) { + self.sender + .send(SignalKind::ClosePosition(position)) + .await + .unwrap(); + } +} + pub struct OrderManager { - // receiver: Receiver, + receiver: Receiver, tracked_positions: TrackedPositionsMap, pair: SymbolPair, open_orders: Vec, @@ -306,13 +339,13 @@ impl OrderManager { const UNDERCUT_PERC: f64 = 0.005; pub fn new( - // receiver: Receiver, + receiver: Receiver, pair: SymbolPair, client: Client, strategy: Box, ) -> Self { OrderManager { - // receiver, + receiver, pair, open_orders: Vec::new(), client, @@ -321,6 +354,18 @@ impl OrderManager { } } + pub async fn handle_message(&mut self, msg: SignalKind) -> Result<(), BoxError> { + match msg { + SignalKind::Update(_) => { + self.update(); + } + SignalKind::ClosePosition(position) => self.close_position(&position).await?, + _ => {} + }; + + Ok(()) + } + pub async fn close_position(&mut self, position: &Position) -> Result<(), BoxError> { let open_order = self.tracked_positions.get(&position.id()); @@ -381,7 +426,7 @@ impl OrderManager { pub struct ExchangeManager { kind: ExchangeKind, price_managers: Vec, - order_managers: Vec, + order_managers: Vec, position_managers: Vec, dispatcher: Dispatcher, client: Client, @@ -401,7 +446,7 @@ impl ExchangeManager { client.clone(), Box::new(TrailingStop::new()), )); - order_managers.push(OrderManager::new( + order_managers.push(OrderManagerHandle::new( p.clone(), client.clone(), Box::new(FastOrderStrategy {}),