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