Skip to main content

apple_quant_algorithmic/volume/
aggressive.rs

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