ek-data 0.2.5

Trading data contracts for the enkeep ek ecosystem: venue enums, zero-dep epoch-nanosecond time, decimal-exact price rounding, vt-symbol convention, bus event dictionary, tick/bar/order/trade/position/account/contract objects and request objects (Python enkeep_trade trader/object.py + constant.py, faithfully ported).
Documentation
//! # ek-data —— enkeep ek 生态的交易数据契约
//!
//! 快速开始与示例见下(即仓库 README,示例由 doctest 验证,不会腐烂):
//!
//! ---
//!
#![doc = include_str!("../README.md")]
//!
//! ---
//!
//! Python 原稿:`enkeep_trade/enkeep_trade/trader/constant.py`(枚举,207 行)
//! 与 `enkeep_trade/enkeep_trade/trader/object.py`(数据对象,819 行)。
//!
//! ## 全局决定(DESIGN.md 有全文)
//!
//! 1. **一个结构体一个文件**:每个 struct + 它的 inherent 方法内聚单文件;
//!    枚举不是结构体,群聚在 [`constant`] 一处。
//! 2. **派生 ID 方法化**:Python 靠 `__post_init__` 把 `en_symbol / en_orderid /
//!    en_positionid / available` 算成暂存字段,Rust 版一律**方法即时计算**,
//!    不存冗余状态,不存在不同步。
//! 3. **枚举线值用英文令牌**(`LONG / OPEN / ALLTRADED ...`),
//!    [`FromStr`](std::str::FromStr) 额外容忍 Python 时代的中文线值(`"多" / "开" ...`),
//!    新存档写英文、旧归档照读。例外:交易所名以 Python `.value` 为准
//!    (`CBOT` 线值为 `CBT`,`EUREX` 线值为 `EUX`,`ETF_INDEX` 线值为 `ETF_index`)。
//! 4. **零依赖底线**:default 路径没有任何依赖;时间用自带 civil↔epoch 换算
//!    (不走 chrono);`serde` 为 optional feature(default off)。
//! 5. 对象层零 IO 零锁:数据对象只做纯读写与纯函数,复杂决策归插件层。
//!
//! ## Python → Rust 对照总表
//!
//! | Python(constant.py / object.py) | Rust |
//! | --- | --- |
//! | `constant.py:8 Direction` | [`constant::Direction`] |
//! | `constant.py:18 Offset` | [`constant::Offset`] |
//! | `constant.py:30 Status` | [`constant::Status`] |
//! | `constant.py:43 Asset` | [`constant::Asset`] |
//! | `constant.py:69 InstrumentType` | [`constant::InstrumentType`] |
//! | `constant.py:100 OrderType` | [`constant::OrderType`] |
//! | `constant.py:113 OptionType` | [`constant::OptionType`] |
//! | `constant.py:122 Exchange` | [`constant::Exchange`] |
//! | `constant.py:184 Currency` | [`constant::Currency`] |
//! | `constant.py:195 Interval` | [`constant::Interval`] |
//! | `object.py:21 ACTIVE_STATUSES` | [`constant::ACTIVE_STATUSES`] |
//! | `object.py:37 TickData` | [`tick::TickData`] |
//! | `object.py:123 BarData` | [`bar::BarData`] |
//! | `object.py:152 OrderData` | [`order::OrderData`] |
//! | `object.py:199 TradeData` | [`trade::TradeData`] |
//! | `object.py:235 PositionData` | [`position::PositionData`] |
//! | `object.py:268 AccountData` | [`account::AccountData`] |
//! | `object.py:286 LogData` | [`log::LogData`] |
//! | `object.py:340 ContractData` | [`contract::ContractData`] |
//! | `object.py:507 SubscribeRequest` | [`subscribe_request::SubscribeRequest`] |
//! | `object.py:521 OrderRequest` | [`order_request::OrderRequest`] |
//! | `object.py:592 CancelRequest` | [`cancel_request::CancelRequest`] |
//! | `object.py:607 HistoryRequest` | [`history_request::HistoryRequest`] |
//! | `object.py:25 BaseData(gateway_name 基座)` | 各对象直接携带 `gateway_name` 字段(不引入继承) |
//! | `event.py:7-24 字面常量` | [`event`] 模块的 8 个 `EVENT_*` 常量 |
//! | `__post_init__ 暂存 en_symbol` | `en_symbol()` 派生方法(全局决定 2) |
//! | `utility.py extract_vt_symbol` | [`symbol::parse_vt_symbol`] |
//!
//! **defer 清单**(属 UI/组合/通知批次,共识另立):QuoteData / QuoteRequest /
//! HedgeContractData / ContractData2 / ProductInfo / HedgeSetting /
//! StockData / SectorData / KlineChartData / NotifyData / AlertData。
//! BarData 的股票估值四件套(pe/pb/float_mv/total_mv)按共识移除,持久层立项时另设。

#![deny(rustdoc::broken_intra_doc_links)]

pub mod account;
pub mod bar;
pub mod cancel_request;
pub mod constant;
pub mod contract;
pub mod event;
pub mod history_request;
pub mod log;
pub mod order;
pub mod order_request;
pub mod position;
pub mod price;
pub mod subscribe_request;
pub mod symbol;
pub mod tick;
pub mod time;
pub mod trade;

#[cfg(feature = "serde")]
pub mod serde_impls;

pub use account::AccountData;
pub use bar::BarData;
pub use cancel_request::CancelRequest;
pub use constant::{
    ACTIVE_STATUSES, Asset, Currency, Direction, EnumParseError, Exchange, InstrumentType,
    Interval, Offset, OptionType, OrderType, Status,
};
pub use contract::ContractData;
pub use event::{
    EVENT_ACCOUNT, EVENT_BAR, EVENT_CONTRACT, EVENT_LOG, EVENT_ORDER, EVENT_POSITION, EVENT_TICK,
    EVENT_TRADE,
};
pub use history_request::HistoryRequest;
pub use log::{LEVEL_ERROR, LEVEL_INFO, LEVEL_WARNING, LogData};
pub use order::OrderData;
pub use order_request::OrderRequest;
pub use position::PositionData;
pub use price::{ceil_to, floor_to, get_digits, round_to, try_ceil_to, try_floor_to, try_round_to};
pub use subscribe_request::SubscribeRequest;
pub use symbol::{SymbolError, parse_vt_symbol, vt_symbol, write_vt_symbol};
pub use tick::TickData;
pub use time::{
    Civil, DTNS_MAX, DTNS_MIN, Day, DtNs, NANOS_PER_DAY, NANOS_PER_SEC, civil_from_days,
    civil_from_nanos, civil_to_nanos, days_from_civil, days_in_month, format_civil,
    from_system_time, is_leap_year, is_valid_civil, now_nanos, parse_civil, trading_day,
    try_civil_to_nanos,
};
pub use trade::TradeData;