Skip to main content

engine/strategies/
constant_symmetric.rs

1use super::Strategy;
2use crate::types::{Observation, Order, OrderRequest, Side};
3
4pub struct ConstantSymmetricStrategy {
5    half_spread: f64,
6    order_counter: u64,
7}
8
9impl ConstantSymmetricStrategy {
10    pub fn new(half_spread: f64) -> Self {
11        Self {
12            half_spread,
13            order_counter: 0,
14        }
15    }
16}
17
18impl Strategy for ConstantSymmetricStrategy {
19    fn on_tick(&mut self, obs: &Observation, requests: &mut Vec<OrderRequest>) {
20        let mid = (obs.best_bid + obs.best_ask) / 2.0;
21        let bid = (mid - self.half_spread) * 1.0;
22        let ask = (mid + self.half_spread) * 1.0;
23
24        requests.push(OrderRequest::CancelAll);
25
26        self.order_counter += 1;
27        requests.push(OrderRequest::New(Order::new(
28            self.order_counter,
29            Side::Buy,
30            bid,
31            1.0,
32        )));
33
34        self.order_counter += 1;
35        requests.push(OrderRequest::New(Order::new(
36            self.order_counter,
37            Side::Sell,
38            ask,
39            1.0,
40        )));
41    }
42
43    fn as_any(&self) -> &dyn std::any::Any {
44        self
45    }
46    fn as_any_mut(&mut self) -> &mut dyn std::any::Any {
47        self
48    }
49}