ek-data 0.2.8

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
//! K 线对象(`object.py:123-148`;公共字段版——股票估值四件套
//! pe/pb/float_mv/total_mv 按共识移除,持久层批次另立)。

use crate::constant::{Exchange, Interval};
use crate::time::DtNs;

/// 一段周期内的蜡烛数据。
#[derive(Debug, Clone, PartialEq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct BarData {
    /// 上游网关名
    pub gateway_name: String,
    /// 合约代码
    pub symbol: String,
    /// 交易所
    pub exchange: Exchange,
    /// 时间戳(UTC 纪元纳秒;Python 为本地 naive datetime)
    pub datetime: DtNs,

    /// K 线间隔(缺省 None;Python 缺省 None)
    pub interval: Option<Interval>,
    /// 周期成交量
    pub volume: f64,
    /// 周期成交额
    pub turnover: f64,
    /// 持仓量/流通量
    pub open_interest: f64,
    /// 开盘价
    pub open_price: f64,
    /// 最高价
    pub high_price: f64,
    /// 最低价
    pub low_price: f64,
    /// 收盘价
    pub close_price: f64,
    /// 涨跌幅(%)
    pub pct_change: f64,
}

impl BarData {
    /// `en_symbol`(派生方法;分配一次)。
    pub fn en_symbol(&self) -> String {
        let mut buf = String::with_capacity(self.exchange.as_str().len() + 1 + self.symbol.len());
        self.en_symbol_into(&mut buf);
        buf
    }

    /// 零分配版本:追加到复用缓冲。
    pub fn en_symbol_into(&self, buf: &mut String) {
        crate::symbol::write_vt_symbol(buf, &self.symbol, self.exchange);
    }
}