use super::footprint::{ClusterKind, KlineTrades};
use super::poc::NPoc;
use crate::aggr::time::DataPoint;
use exchange::{
Kline, Trade, UnixMs,
unit::price::{Price, PriceStep},
unit::qty::Qty,
};
#[derive(Clone)]
pub struct KlineDataPoint {
pub kline: Kline,
pub footprint: KlineTrades,
}
impl KlineDataPoint {
pub fn max_cluster_qty(&self, cluster_kind: ClusterKind, highest: Price, lowest: Price) -> Qty {
self.footprint
.max_cluster_qty(cluster_kind, highest, lowest)
}
pub fn add_trade(&mut self, trade: &Trade, step: PriceStep) {
self.footprint.add_trade_to_nearest_bin(trade, step);
}
pub fn poc_price(&self) -> Option<Price> {
self.footprint.poc_price()
}
pub fn set_poc_status(&mut self, status: NPoc) {
self.footprint.set_poc_status(status);
}
pub fn clear_trades(&mut self) {
self.footprint.clear();
}
pub fn calculate_poc(&mut self) {
self.footprint.calculate_poc();
}
pub fn last_trade_time(&self) -> Option<UnixMs> {
self.footprint.last_trade_t()
}
pub fn first_trade_time(&self) -> Option<UnixMs> {
self.footprint.first_trade_t()
}
pub fn is_directional(&self) -> bool {
!self.footprint.trades.is_empty() || self.kline.volume.is_directional()
}
}
impl DataPoint for KlineDataPoint {
fn add_trade(&mut self, trade: &Trade, step: PriceStep) {
self.add_trade(trade, step);
}
fn clear_trades(&mut self) {
self.clear_trades();
}
}