Skip to main content

ek_data/
lib.rs

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