Skip to main content

ek_data/
contract.rs

1//! 合约对象(`object.py:340-368`)。
2//!
3//! 对冲组合家族(HedgeContractData / ContractData2 / ProductInfo /
4//! HedgeSetting)属组合批次,整族 defer(DESIGN.md defer 清单)。
5
6use crate::constant::{Asset, Exchange, InstrumentType};
7
8/// 合约基础数据。
9#[derive(Debug, Clone, PartialEq)]
10#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11pub struct ContractData {
12    /// 上游网关名
13    pub gateway_name: String,
14    /// 合约代码
15    pub symbol: String,
16    /// 交易所
17    pub exchange: Exchange,
18    /// 合约中文名
19    pub name: String,
20    /// 资产大类
21    pub asset: Asset,
22    /// 合约形态(缺省 None)
23    pub instrument_type: Option<InstrumentType>,
24    /// 合约乘数(Python 缺省 1)
25    pub size: f64,
26    /// 最小价格变动(Python 缺省 0.01)
27    pub price_tick: f64,
28
29    /// 品种代码(期货层级)
30    pub product_id: Option<String>,
31
32    /// 限价单最大上量
33    pub max_limit_order_volume: Option<f64>,
34    /// 限价单最小上量
35    pub min_limit_order_volume: Option<f64>,
36    /// 市价单最大上量
37    pub max_market_order_volume: Option<f64>,
38    /// 市价单最小上量
39    pub min_market_order_volume: Option<f64>,
40
41    /// 交割年
42    pub delivery_year: Option<i32>,
43    /// 交割月
44    pub delivery_month: Option<i32>,
45
46    // —— 扩展字段(object.py:360-368)——
47    /// IPO 日(股票)
48    pub open_date: Option<String>,
49    /// 前收盘价
50    pub pre_close: Option<f64>,
51    /// 当日涨停价
52    pub up_stop_price: Option<f64>,
53    /// 当日跌停价
54    pub down_stop_price: Option<f64>,
55    /// 流通股本
56    pub float_volume: Option<f64>,
57    /// 总股本
58    pub total_volume: Option<f64>,
59    /// 合约停牌状态(上游原值)
60    pub instrument_status: Option<i64>,
61    /// 是否可交易
62    pub is_trading: Option<bool>,
63}
64
65impl Default for ContractData {
66    /// Python 字段缺省:asset 缺省面 EQUITY、size=1、price_tick=0.01
67    /// (`object.py:347-348`;其余 Option 字段一律 None)。
68    fn default() -> Self {
69        Self {
70            asset: Asset::EQUITY,
71            size: 1.0,
72            price_tick: 0.01,
73            ..Self::EMPTY
74        }
75    }
76}
77
78impl ContractData {
79    /// `en_symbol`(派生方法;分配一次)。
80    pub fn en_symbol(&self) -> String {
81        let mut buf = String::with_capacity(self.exchange.as_str().len() + 1 + self.symbol.len());
82        self.en_symbol_into(&mut buf);
83        buf
84    }
85
86    /// 零分配版本:追加到复用缓冲。
87    pub fn en_symbol_into(&self, buf: &mut String) {
88        crate::symbol::write_vt_symbol(buf, &self.symbol, self.exchange);
89    }
90}
91
92/// 缺省骨架常量(供 [`Default`] 的 `..Self::EMPTY` 复合;不对外承诺)。
93impl ContractData {
94    const EMPTY: Self = Self {
95        gateway_name: String::new(),
96        symbol: String::new(),
97        exchange: crate::constant::Exchange::LOCAL,
98        name: String::new(),
99        asset: Asset::EQUITY,
100        instrument_type: None,
101        size: 0.0,
102        price_tick: 0.0,
103        product_id: None,
104        max_limit_order_volume: None,
105        min_limit_order_volume: None,
106        max_market_order_volume: None,
107        min_market_order_volume: None,
108        delivery_year: None,
109        delivery_month: None,
110        open_date: None,
111        pre_close: None,
112        up_stop_price: None,
113        down_stop_price: None,
114        float_volume: None,
115        total_volume: None,
116        instrument_status: None,
117        is_trading: None,
118    };
119}