Skip to main content

Crate ek_data

Crate ek_data 

Source
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 对齐 Python Decimal 语义。

§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 有全文)

  1. 一个结构体一个文件:每个 struct + 它的 inherent 方法内聚单文件; 枚举不是结构体,群聚在 constant 一处。
  2. 派生 ID 方法化:Python 靠 __post_init__ 把 en_symbol / en_orderid / en_positionid / available 算成暂存字段,Rust 版一律方法即时计算, 不存冗余状态,不存在不同步。
  3. 枚举线值用英文令牌(LONG / OPEN / ALLTRADED ...), 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 Directionconstant::Direction
constant.py:18 Offsetconstant::Offset
constant.py:30 Statusconstant::Status
constant.py:43 Assetconstant::Asset
constant.py:69 InstrumentTypeconstant::InstrumentType
constant.py:100 OrderTypeconstant::OrderType
constant.py:113 OptionTypeconstant::OptionType
constant.py:122 Exchangeconstant::Exchange
constant.py:184 Currencyconstant::Currency
constant.py:195 Intervalconstant::Interval
object.py:21 ACTIVE_STATUSESconstant::ACTIVE_STATUSES
object.py:37 TickDatatick::TickData
object.py:123 BarDatabar::BarData
object.py:152 OrderDataorder::OrderData
object.py:199 TradeDatatrade::TradeData
object.py:235 PositionDataposition::PositionData
object.py:268 AccountDataaccount::AccountData
object.py:286 LogDatalog::LogData
object.py:340 ContractDatacontract::ContractData
object.py:507 SubscribeRequestsubscribe_request::SubscribeRequest
object.py:521 OrderRequestorder_request::OrderRequest
object.py:592 CancelRequestcancel_request::CancelRequest
object.py:607 HistoryRequesthistory_request::HistoryRequest
object.py:25 BaseData(gateway_name 基座)各对象直接携带 gateway_name 字段(不引入继承)
event.py:7-24 字面常量event 模块的 8 个 EVENT_* 常量
__post_init__ 暂存 en_symbolen_symbol() 派生方法(全局决定 2)
utility.py extract_vt_symbolsymbol::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 cancel_request::CancelRequest;
pub use constant::ACTIVE_STATUSES;
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 contract::ContractData;
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 history_request::HistoryRequest;
pub use log::LEVEL_ERROR;
pub use log::LEVEL_INFO;
pub use log::LEVEL_WARNING;
pub use log::LogData;
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::SymbolError;
pub use symbol::parse_vt_symbol;
pub use symbol::vt_symbol;
pub use symbol::write_vt_symbol;
pub use tick::TickData;
pub use time::Civil;
pub use time::DTNS_MAX;
pub use time::DTNS_MIN;
pub use time::Day;
pub use time::DtNs;
pub use time::NANOS_PER_DAY;
pub use time::NANOS_PER_SEC;
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 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 扩展字段)。