Skip to main content

ek_data/
lib.rs

1//! # ek-data —— enkeep ek 生态的交易数据契约
2//!
3//! Python 原稿:`enkeep_trade/enkeep_trade/trader/constant.py`(枚举,207 行)
4//! 与 `enkeep_trade/enkeep_trade/trader/object.py`(数据对象,819 行)。
5//!
6//! ## 全局决定(DESIGN.md 有全文)
7//!
8//! 1. **一个结构体一个文件**:每个 struct + 它的 inherent 方法内聚单文件;
9//!    枚举不是结构体,群聚在 [`constant`] 一处。
10//! 2. **派生 ID 方法化**:Python 靠 `__post_init__` 把 `en_symbol / en_orderid /
11//!    en_positionid / available` 算成暂存字段,Rust 版一律**方法即时计算**,
12//!    不存冗余状态,不存在不同步。
13//! 3. **枚举线值用英文令牌**(`LONG / OPEN / ALLTRADED ...`),
14//!    [`FromStr`](std::str::FromStr) 额外容忍 Python 时代的中文线值(`"多" / "开" ...`),
15//!    新存档写英文、旧归档照读。例外:交易所名以 Python `.value` 为准
16//!    (`CBOT` 线值为 `CBT`,`EUREX` 线值为 `EUX`,`ETF_INDEX` 线值为 `ETF_index`)。
17//! 4. **零依赖底线**:default 路径没有任何依赖;时间用自带 civil↔epoch 换算
18//!    (不走 chrono);`serde` 为 optional feature(default off)。
19//! 5. 对象层零 IO 零锁:数据对象只做纯读写与纯函数,复杂决策归插件层。
20//!
21//! ## Python → Rust 对照总表
22//!
23//! | Python(constant.py / object.py) | Rust |
24//! | --- | --- |
25//! | `constant.py:8 Direction` | [`constant::Direction`] |
26//! | `constant.py:18 Offset` | [`constant::Offset`] |
27//! | `constant.py:30 Status` | [`constant::Status`] |
28//! | `constant.py:43 Asset` | [`constant::Asset`] |
29//! | `constant.py:69 InstrumentType` | [`constant::InstrumentType`] |
30//! | `constant.py:100 OrderType` | [`constant::OrderType`] |
31//! | `constant.py:113 OptionType` | [`constant::OptionType`] |
32//! | `constant.py:122 Exchange` | [`constant::Exchange`] |
33//! | `constant.py:184 Currency` | [`constant::Currency`] |
34//! | `constant.py:195 Interval` | [`constant::Interval`] |
35//! | `object.py:21 ACTIVE_STATUSES` | [`constant::ACTIVE_STATUSES`] |
36//! | `object.py:37 TickData` | [`tick::TickData`] |
37//! | `object.py:123 BarData` | [`bar::BarData`] |
38//! | `object.py:152 OrderData` | [`order::OrderData`] |
39//! | `object.py:199 TradeData` | [`trade::TradeData`] |
40//! | `object.py:235 PositionData` | [`position::PositionData`] |
41//! | `object.py:268 AccountData` | [`account::AccountData`] |
42//! | `object.py:286 LogData` | [`log::LogData`] |
43//! | `object.py:340 ContractData` | [`contract::ContractData`] |
44//! | `object.py:507 SubscribeRequest` | [`subscribe_request::SubscribeRequest`] |
45//! | `object.py:521 OrderRequest` | [`order_request::OrderRequest`] |
46//! | `object.py:592 CancelRequest` | [`cancel_request::CancelRequest`] |
47//! | `object.py:607 HistoryRequest` | [`history_request::HistoryRequest`] |
48//! | `object.py:25 BaseData(gateway_name 基座)` | 各对象直接携带 `gateway_name` 字段(不引入继承) |
49//! | `event.py:7-24 字面常量` | [`event`] 模块的 8 个 `EVENT_*` 常量 |
50//! | `__post_init__ 暂存 en_symbol` | `en_symbol()` 派生方法(全局决定 2) |
51//! | `utility.py extract_vt_symbol` | [`symbol::parse_vt_symbol`] |
52//!
53//! **defer 清单**(属 UI/组合/通知批次,共识另立):QuoteData / QuoteRequest /
54//! HedgeContractData / ContractData2 / ProductInfo / HedgeSetting /
55//! StockData / SectorData / KlineChartData / NotifyData / AlertData。
56//! BarData 的股票估值四件套(pe/pb/float_mv/total_mv)按共识移除,持久层立项时另设。
57
58#![deny(rustdoc::broken_intra_doc_links)]
59
60pub mod bar;
61pub mod cancel_request;
62pub mod constant;
63pub mod contract;
64pub mod event;
65pub mod history_request;
66pub mod log;
67pub mod order;
68pub mod order_request;
69pub mod position;
70pub mod subscribe_request;
71pub mod symbol;
72pub mod tick;
73pub mod time;
74pub mod trade;
75pub mod account;
76
77#[cfg(feature = "serde")]
78pub mod serde_impls;
79
80pub use account::AccountData;
81pub use bar::BarData;
82pub use event::{
83    EVENT_ACCOUNT, EVENT_BAR, EVENT_CONTRACT, EVENT_LOG, EVENT_ORDER, EVENT_POSITION, EVENT_TICK,
84    EVENT_TRADE,
85};
86pub use cancel_request::CancelRequest;
87pub use constant::{
88    Asset, Currency, Direction, EnumParseError, Exchange, InstrumentType, Interval, Offset,
89    OptionType, OrderType, Status, ACTIVE_STATUSES,
90};
91pub use contract::ContractData;
92pub use history_request::HistoryRequest;
93pub use log::{LogData, LEVEL_ERROR, LEVEL_INFO, LEVEL_WARNING};
94pub use order::OrderData;
95pub use order_request::OrderRequest;
96pub use position::PositionData;
97pub use subscribe_request::SubscribeRequest;
98pub use symbol::{parse_vt_symbol, vt_symbol, SymbolError};
99pub use tick::TickData;
100pub use time::{
101    civil_from_nanos, civil_to_nanos, format_civil, from_system_time, now_nanos, trading_day,
102    Civil, DtNs, Day,
103};
104pub use trade::TradeData;