Skip to main content

apple_quant_algorithmic/volume/
aggressive.rs

1use std::fmt::{Debug, Display};
2
3use num_traits::Zero;
4
5use crate::instrument::{AsDecimal, InstrumentSpec};
6
7use super::{AggressorSide, DirectionalIntentVolume, DirectionlessVolume, VolumeDelta};
8
9#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
10pub struct AggressiveVolume<IS: InstrumentSpec> {
11	pub directionless_volume: DirectionlessVolume<IS>,
12	pub aggressor_side: AggressorSide,
13}
14
15impl<IS: InstrumentSpec> AggressiveVolume<IS> {
16	pub fn new(
17		directionless_volume: DirectionlessVolume<IS>,
18		aggressor_side: AggressorSide,
19	) -> Self {
20		Self {
21			directionless_volume,
22			aggressor_side,
23		}
24	}
25
26	pub fn flip(self) -> Self {
27		Self {
28			directionless_volume: self.directionless_volume,
29			aggressor_side: self.aggressor_side.flip(),
30		}
31	}
32
33	pub fn as_directional_intent_volume(&self) -> DirectionalIntentVolume<IS> {
34		self.into()
35	}
36
37	pub fn as_directionless_volume(&self) -> &DirectionlessVolume<IS> {
38		&self.directionless_volume
39	}
40
41	pub fn aggressor_side(&self) -> AggressorSide {
42		self.aggressor_side
43	}
44
45	pub fn as_volume_delta(&self) -> VolumeDelta<IS> {
46		if self
47			.directionless_volume
48			.is_zero()
49		{
50			return VolumeDelta::Zero;
51		}
52
53		VolumeDelta::AggressiveDelta {
54			directionless_volume: self.directionless_volume,
55			aggressor_side: self.aggressor_side,
56		}
57	}
58}
59
60impl<IS: InstrumentSpec> Display for AggressiveVolume<IS> {
61	fn fmt(
62		&self,
63		f: &mut std::fmt::Formatter<'_>,
64	) -> std::fmt::Result {
65		let volume = self
66			.as_volume_delta()
67			.as_decimal();
68
69		write!(f, "{}", volume)
70	}
71}
72
73impl<IS: InstrumentSpec> Debug for AggressiveVolume<IS> {
74	fn fmt(
75		&self,
76		f: &mut std::fmt::Formatter<'_>,
77	) -> std::fmt::Result {
78		<Self as Display>::fmt(&self, f)
79	}
80}