Expand description
§ek-data —— enkeep ek 生态的交易数据契约
快速开始与示例见下(即仓库 README,示例由 doctest 验证,不会腐烂):
§ek-data
enkeep ek 生态的交易数据契约 crate:交易所/方向/状态等类型枚举、
零依赖纪元纳秒时间面、十进制精确的价格取整、vt_symbol 标识约定、
总线事件字典,以及 tick/bar/order/trade/position/account/contract
与四个请求对象。
由 Python 原稿 enkeep_trade/trader/constant.py + trader/object.py
逐字段逐方法移植(对照表见 DESIGN.md 与 crate 文档)。
§快速开始
[dependencies]
ek-data = "0.2"
# 需要 JSON 收发时:
# ek-data = { version = "0.2", features = ["serde"] }use ek_data::{floor_to, round_to, vt_symbol, Exchange, OrderData, Status, TickData};
// 标识约定:CFFEX.IF2506(交易所线值沿 Python .value,CBOT→CBT/EUREX→EUX)
assert_eq!(vt_symbol("IF2506", Exchange::CFFEX), "CFFEX.IF2506");
// 价格对齐最小变动价位:十进制精确(朴素 f64 会把 floor(0.3/0.1) 算成 0.2)
assert_eq!(floor_to(0.3, 0.1), 0.3);
assert_eq!(round_to(2.5, 1.0), 2.0); // half-even,同 Python round(Decimal)
// 订单与派生态
let mut order = OrderData { gateway_name: "xt".into(), orderid: "1".into(), ..Default::default() };
assert_eq!(order.en_orderid(), "xt.1");
assert!(order.is_active()); // SUBMITTING/NOTTRADED/PARTTRADED
order.status = Status::ALLTRADED;
assert!(!order.is_active());
// 时间:零依赖,i64 纪元纳秒(可表达 1677-09-21 .. 2262-04-11)
let t = ek_data::parse_civil("2024-12-25 09:30:01.5").unwrap();
assert_eq!(ek_data::format_civil(t), "2024-12-25 09:30:01.500000000");
// 逐 tick 热路径:复用缓冲,零分配拼 en_symbol
let tick = TickData { symbol: "IF2506".into(), exchange: Exchange::CFFEX, ..Default::default() };
let mut buf = String::with_capacity(32);
tick.en_symbol_into(&mut buf);
assert_eq!(buf, "CFFEX.IF2506");§设计要点
- 零依赖底线:default 路径无任何依赖;
serde是 optional feature(default off)。 - 一个结构体一个文件:改一个字段只动一个文件。
- 派生 ID 方法化:
en_symbol/en_orderid/en_positionid/available即时计算,不存冗余状态。 - 枚举线值:英文令牌为标准线值,
FromStr额外容忍 Python 时代中文旧值(「多」「开」…)。 - 价格工具是十进制精确的:
round_to/floor_to/ceil_to/get_digits对齐 PythonDecimal语义。
§Feature
| feature | 作用 |
|---|---|
| (默认) | 纯 std,无依赖 |
serde | 结构体/枚举 JSON 序列化(字段名即 Python 字段名) |
§许可
MIT
Python 原稿:enkeep_trade/enkeep_trade/trader/constant.py(枚举,207 行)
与 enkeep_trade/enkeep_trade/trader/object.py(数据对象,819 行)。
§全局决定(DESIGN.md 有全文)
- 一个结构体一个文件:每个 struct + 它的 inherent 方法内聚单文件;
枚举不是结构体,群聚在
constant一处。 - 派生 ID 方法化:Python 靠
__post_init__把en_symbol / en_orderid / en_positionid / available算成暂存字段,Rust 版一律方法即时计算, 不存冗余状态,不存在不同步。 - 枚举线值用英文令牌(
LONG / OPEN / ALLTRADED ...),FromStr额外容忍 Python 时代的中文线值("多" / "开" ...), 新存档写英文、旧归档照读。例外:交易所名以 Python.value为准 (CBOT线值为CBT,EUREX线值为EUX,ETF_INDEX线值为ETF_index)。 - 零依赖底线:default 路径没有任何依赖;时间用自带 civil↔epoch 换算
(不走 chrono);
serde为 optional feature(default off)。 - 对象层零 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)按共识移除,持久层立项时另设。
Re-exports§
pub use account::AccountData;pub use bar::BarData;pub use event::EVENT_ACCOUNT;pub use event::EVENT_BAR;pub use event::EVENT_CONTRACT;pub use event::EVENT_LOG;pub use event::EVENT_ORDER;pub use event::EVENT_POSITION;pub use event::EVENT_TICK;pub use event::EVENT_TRADE;pub use cancel_request::CancelRequest;pub use constant::Asset;pub use constant::Currency;pub use constant::Direction;pub use constant::EnumParseError;pub use constant::Exchange;pub use constant::InstrumentType;pub use constant::Interval;pub use constant::Offset;pub use constant::OptionType;pub use constant::OrderType;pub use constant::Status;pub use constant::ACTIVE_STATUSES;pub use contract::ContractData;pub use history_request::HistoryRequest;pub use log::LogData;pub use log::LEVEL_ERROR;pub use log::LEVEL_INFO;pub use log::LEVEL_WARNING;pub use order::OrderData;pub use order_request::OrderRequest;pub use position::PositionData;pub use price::ceil_to;pub use price::floor_to;pub use price::get_digits;pub use price::round_to;pub use price::try_ceil_to;pub use price::try_floor_to;pub use price::try_round_to;pub use subscribe_request::SubscribeRequest;pub use symbol::parse_vt_symbol;pub use symbol::vt_symbol;pub use symbol::write_vt_symbol;pub use symbol::SymbolError;pub use tick::TickData;pub use time::civil_from_days;pub use time::civil_from_nanos;pub use time::civil_to_nanos;pub use time::days_from_civil;pub use time::days_in_month;pub use time::format_civil;pub use time::from_system_time;pub use time::is_leap_year;pub use time::is_valid_civil;pub use time::now_nanos;pub use time::parse_civil;pub use time::trading_day;pub use time::try_civil_to_nanos;pub use time::Civil;pub use time::DtNs;pub use time::Day;pub use time::DTNS_MAX;pub use time::DTNS_MIN;pub use time::NANOS_PER_DAY;pub use time::NANOS_PER_SEC;pub use trade::TradeData;
Modules§
- account
- 账户对象(
object.py:268-282)。 - bar
- K 线对象(
object.py:123-148;公共字段版——股票估值四件套 pe/pb/float_mv/total_mv 按共识移除,持久层批次另立)。 - cancel_
request - 撤单请求(
object.py:592-604;通常由crate::order::OrderData::create_cancel_request生成)。 - constant
- 一般交易常量枚举。
- contract
- 合约对象(
object.py:340-368)。 - event
- 总线事件字典:enkeep 原稿
trader/event.py的字面常量移植。 - history_
request - 历史数据查询请求(
object.py:607-621)。 - log
- 日志对象(
object.py:286-296)。 - order
- 委托对象(
object.py:152-196;含迅投 XtOrder 扩展字段)。 - order_
request - 下单请求(
object.py:521-588+ 方法四件套)。 - position
- 持仓对象(
object.py:235-264;含迅投 XtPosition 扩展字段)。 - price
- 价格与小数工具(
utility.py:275-318的忠实移植)。 - subscribe_
request - 订阅请求(
object.py:507-518)。 - symbol
- vt_symbol 约定:
"<exchange>.<symbol>"(如CFFEX.IF2506)。 - tick
- 行情逐笔快照(
object.py:37-119,字段逐值复刻 + 方法三层)。 - time
- 零依赖时间面:纪元纳秒 ↔ civil(年月日时分秒)双向换算。
- trade
- 成交对象(
object.py:199-232;含迅投 XtTrade 扩展字段)。