apple_quant_algorithmic/volume/
aggressive.rs1use 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}