pub struct Checkpoint {
pub version: u32,
pub symbol: String,
pub threshold_decimal_bps: u32,
pub incomplete_bar: Option<OpenDeviationBar>,
pub thresholds: Option<(FixedPoint, FixedPoint)>,
pub last_timestamp_us: i64,
pub last_trade_id: Option<i64>,
pub price_hash: u64,
pub anomaly_summary: AnomalySummary,
pub prevent_same_timestamp_close: bool,
pub defer_open: bool,
}Expand description
Checkpoint for cross-file open deviation bar continuation
Enables seamless processing across any file boundaries (Binance daily, Exness monthly). Captures minimal state needed to continue building an incomplete bar.
§Example
// Process first file
let bars_1 = processor.process_agg_trade_records(&file1_trades)?;
let checkpoint = processor.create_checkpoint("BTCUSDT");
// Serialize and save checkpoint
let json = serde_json::to_string(&checkpoint)?;
std::fs::write("checkpoint.json", json)?;
// ... later, load checkpoint and continue processing ...
let json = std::fs::read_to_string("checkpoint.json")?;
let checkpoint: Checkpoint = serde_json::from_str(&json)?;
let mut processor = OpenDeviationBarProcessor::from_checkpoint(checkpoint)?;
let bars_2 = processor.process_agg_trade_records(&file2_trades)?;Fields§
§version: u32Schema version for checkpoint format (Issue #85: Phase 2) v1: Original format (default for old checkpoints) v2: Field-reordered OpenDeviationBar (no behavioral changes, safe for deserialization)
symbol: StringSymbol being processed (e.g., “BTCUSDT”, “EURUSD”)
threshold_decimal_bps: u32Threshold in decimal basis points (v3.0.0+: 0.1bps units) Example: 250 = 25bps = 0.25%
incomplete_bar: Option<OpenDeviationBar>Incomplete bar at file boundary (None = last bar completed cleanly) REUSES existing OpenDeviationBar type - no separate BarState needed!
thresholds: Option<(FixedPoint, FixedPoint)>Fixed thresholds for incomplete bar (computed from bar.open, IMMUTABLE) Stored as (upper_threshold, lower_threshold)
last_timestamp_us: i64Last processed timestamp in microseconds (universal, works for all sources)
last_trade_id: Option<i64>Last trade ID (Some for Binance, None for Exness) Binance: agg_trade_id is strictly sequential, never resets
price_hash: u64Price window hash (ahash of last 8 prices for position verification) Used to verify we’re resuming at the correct position in data stream
anomaly_summary: AnomalySummaryAnomaly summary counts for debugging
prevent_same_timestamp_close: boolPrevent bars from closing on same timestamp as they opened (Issue #36)
When true (default): A bar cannot close until a trade arrives with a different timestamp than the bar’s open_time. This prevents flash crash scenarios from creating thousands of bars at identical timestamps.
When false: Legacy v8 behavior - bars can close immediately on breach.
defer_open: boolDeferred bar open flag (Issue #46)
When true: The last trade before checkpoint triggered a threshold breach.
On resume, the next trade should open a new bar instead of continuing.
This matches the batch path’s defer_open semantics.
Implementations§
Source§impl Checkpoint
impl Checkpoint
Sourcepub fn new(
symbol: String,
threshold_decimal_bps: u32,
incomplete_bar: Option<OpenDeviationBar>,
thresholds: Option<(FixedPoint, FixedPoint)>,
last_timestamp_us: i64,
last_trade_id: Option<i64>,
price_hash: u64,
prevent_same_timestamp_close: bool,
) -> Checkpoint
pub fn new( symbol: String, threshold_decimal_bps: u32, incomplete_bar: Option<OpenDeviationBar>, thresholds: Option<(FixedPoint, FixedPoint)>, last_timestamp_us: i64, last_trade_id: Option<i64>, price_hash: u64, prevent_same_timestamp_close: bool, ) -> Checkpoint
Create a new checkpoint with the given parameters
Sourcepub fn has_incomplete_bar(&self) -> bool
pub fn has_incomplete_bar(&self) -> bool
Check if there’s an incomplete bar that needs to continue
Sourcepub fn library_version() -> &'static str
pub fn library_version() -> &'static str
Get the library version that created this checkpoint
Trait Implementations§
Source§impl Clone for Checkpoint
impl Clone for Checkpoint
Source§fn clone(&self) -> Checkpoint
fn clone(&self) -> Checkpoint
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for Checkpoint
impl Debug for Checkpoint
Source§impl<'de> Deserialize<'de> for Checkpoint
impl<'de> Deserialize<'de> for Checkpoint
Source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<Checkpoint, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<Checkpoint, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
Source§impl Serialize for Checkpoint
impl Serialize for Checkpoint
Source§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
Auto Trait Implementations§
impl Freeze for Checkpoint
impl RefUnwindSafe for Checkpoint
impl Send for Checkpoint
impl Sync for Checkpoint
impl Unpin for Checkpoint
impl UnsafeUnpin for Checkpoint
impl UnwindSafe for Checkpoint
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more