Skip to main content

engine/strategies/
mod.rs

1pub mod avellaneda_stoikov;
2pub mod avellaneda_stoikov_bilateral_hawkes;
3pub mod avellaneda_stoikov_bilateral_hawkes_order_flow_imbalance;
4pub mod avellaneda_stoikov_exact;
5pub mod avellaneda_stoikov_hawkes;
6pub mod avellaneda_stoikov_heston;
7pub mod constant_symmetric;
8pub mod external;
9pub mod kelly;
10pub mod kelly_rigorous;
11pub mod random;
12pub mod signal_strategy;
13pub mod zi;
14
15pub use avellaneda_stoikov::{AvellanedaStoikovParameters, AvellanedaStoikovStrategy};
16pub use avellaneda_stoikov_bilateral_hawkes::{
17    AvellanedaStoikovBilateralHawkesParameters, AvellanedaStoikovBilateralHawkesStrategy,
18};
19pub use avellaneda_stoikov_bilateral_hawkes_order_flow_imbalance::{
20    AvellanedaStoikovBilateralHawkesOrderFlowImbalanceParameters,
21    AvellanedaStoikovBilateralHawkesOrderFlowImbalanceStrategy,
22};
23pub use avellaneda_stoikov_exact::{
24    AvellanedaStoikovExactParameters, AvellanedaStoikovExactStrategy,
25};
26pub use avellaneda_stoikov_hawkes::{
27    AvellanedaStoikovHawkesParameters, AvellanedaStoikovHawkesStrategy,
28};
29pub use avellaneda_stoikov_heston::{
30    AvellanedaStoikovHestonParameters, AvellanedaStoikovHestonStrategy,
31};
32pub use constant_symmetric::ConstantSymmetricStrategy;
33pub use external::ExternalStrategy;
34pub use kelly::{KellyParameters, KellyStrategy};
35pub use kelly_rigorous::{KellyRigorousParameters, KellyRigorousStrategy};
36pub use random::RandomStrategy;
37pub use signal_strategy::{PositionSizing, SignalCombinator, SignalEngineStrategy};
38pub use zi::ZeroIntelligenceStrategy;
39
40use crate::types::{Observation, OrderRequest};
41use std::any::Any;
42
43/// Strategy trait for market-making agents.
44///
45/// Every implementor must provide `as_any` and `as_any_mut` for downcasting.
46/// These are always identical:
47/// ```ignore
48/// fn as_any(&self) -> &dyn Any { self }
49/// fn as_any_mut(&mut self) -> &mut dyn Any { self }
50/// ```
51pub trait Strategy: Any {
52    /// Called each tick with the agent's filtered observation.
53    /// Appends order requests (New, Cancel, CancelAll) to the provided buffer.
54    fn on_tick(&mut self, obs: &Observation, requests: &mut Vec<OrderRequest>);
55
56    /// Downcast helper — returns `self` as `&dyn Any`.
57    fn as_any(&self) -> &dyn Any;
58
59    /// Downcast helper — returns `self` as `&mut dyn Any`.
60    fn as_any_mut(&mut self) -> &mut dyn Any;
61}
62
63/// A dummy strategy that does nothing. Useful as a placeholder agent.
64pub struct NoOpStrategy;
65
66impl Strategy for NoOpStrategy {
67    fn on_tick(&mut self, _obs: &Observation, _requests: &mut Vec<OrderRequest>) {}
68    fn as_any(&self) -> &dyn Any {
69        self
70    }
71    fn as_any_mut(&mut self) -> &mut dyn Any {
72        self
73    }
74}