ib_async/domain/
market_data.rs

1use std::convert::From;
2use std::fmt;
3use std::i32;
4
5#[derive(Debug, Clone)]
6pub struct MarketDataTypeMsg {
7    pub req_id: i32,
8    pub market_data_type: i32,
9}
10
11#[derive(Debug, Clone)]
12#[repr(C)]
13#[allow(non_camel_case_types)]
14pub enum MarketDataType {
15    REALTIME = 1,
16    FROZEN = 2,
17    DELAYED = 3,
18    DELAYED_FROZEN = 4,
19}
20
21impl fmt::Display for MarketDataType {
22    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
23        let s = match self {
24            MarketDataType::REALTIME => "Real-Time",
25            MarketDataType::FROZEN => "Frozen",
26            MarketDataType::DELAYED => "Delayed",
27            MarketDataType::DELAYED_FROZEN => "Delayed-Frozen",
28        };
29        write!(f, "{}", s)
30    }
31}
32
33#[derive(Debug, Clone)]
34pub struct DepthMktDataDescription {
35    pub exchange: String,
36    pub sec_type: String,
37    pub listing_exch: String,
38    pub service_data_type: String,
39    pub agg_group: i32,
40}
41
42impl DepthMktDataDescription {
43    pub fn new(
44        exchange: &str,
45        sec_type: &str,
46        listing_exch: &str,
47        service_data_type: &str,
48        agg_group: i32,
49    ) -> Self {
50        DepthMktDataDescription {
51            exchange: exchange.to_string(),
52            sec_type: sec_type.to_string(),
53            listing_exch: listing_exch.to_string(),
54            service_data_type: service_data_type.to_string(),
55            agg_group,
56        }
57    }
58}
59
60#[derive(Debug, Clone)]
61pub struct Bar {
62    pub time: String,
63    pub open: f64,
64    pub high: f64,
65    pub low: f64,
66    pub close: f64,
67    pub volume: i64,
68    pub count: i32,
69    pub wap: f64,
70}
71
72#[derive(Debug, Clone)]
73pub struct HistoricalTick {
74    pub time: i64,
75    pub price: f64,
76    pub size: i64,
77}
78
79#[derive(Debug, Clone)]
80pub struct HistoricalTickBidAsk {
81    pub time: i64,
82    pub mask: i32,
83    pub price_bid: f64,
84    pub price_ask: f64,
85    pub size_bid: i64,
86    pub size_ask: i64,
87}
88
89#[derive(Debug, Clone)]
90pub struct HistoricalTickLast {
91    pub time: i64,
92    pub mask: i32,
93    pub price: f64,
94    pub size: i64,
95    pub exchange: String,
96    pub special_conditions: String,
97}
98
99#[derive(Debug, Clone)]
100pub struct HistogramEntry {
101    pub price: f64,
102    pub size: i64,
103}
104
105#[derive(Debug, Default, Clone)]
106pub struct TickAttr {
107    pub can_auto_execute: bool,
108    pub past_limit: bool,
109    pub pre_open: bool,
110    pub unreported: bool,
111    pub bid_past_low: bool,
112    pub ask_past_high: bool,
113}
114
115#[derive(Debug, Clone)]
116pub struct TickByTick {
117    pub tick_type: TickType,
118    // 0 - None, 1 - Last, 2 - AllLast, 3 -BidAsk, 4 - MidPoint
119    pub time: i64,
120    pub price: f64,
121    pub size: i64,
122    pub attribs: TickAttr,
123    pub exchange: String,
124    pub special_conditions: String,
125    pub bid_price: f64,
126    pub bid_size: i64,
127    pub ask_price: f64,
128    pub ask_size: i64,
129    pub mid_point: f64,
130}
131
132#[derive(Debug, Clone)]
133#[repr(i32)]
134#[allow(non_camel_case_types)]
135pub enum TickType {
136    BID_SIZE = 0,
137    BID = 1,
138    ASK = 2,
139    ASK_SIZE = 3,
140    LAST = 4,
141    LAST_SIZE = 5,
142    HIGH = 6,
143    LOW = 7,
144    VOLUME = 8,
145    CLOSE = 9,
146    BID_OPTION = 10,
147    ASK_OPTION = 11,
148    LAST_OPTION = 12,
149    MODEL_OPTION = 13,
150    OPEN = 14,
151    LOW_13_WEEK = 15,
152    HIGH_13_WEEK = 16,
153    LOW_26_WEEK = 17,
154    HIGH_26_WEEK = 18,
155    LOW_52_WEEK = 19,
156    HIGH_52_WEEK = 20,
157    AVG_VOLUME = 21,
158    OPEN_INTEREST = 22,
159    OPTION_HISTORICAL_VOL = 23,
160    OPTION_IMPLIED_VOL = 24,
161    OPTION_BID_EXCH = 25,
162    OPTION_ASK_EXCH = 26,
163    OPTION_CALL_OPEN_INTEREST = 27,
164    OPTION_PUT_OPEN_INTEREST = 28,
165    OPTION_CALL_VOLUME = 29,
166    OPTION_PUT_VOLUME = 30,
167    INDEX_FUTURE_PREMIUM = 31,
168    BID_EXCH = 32,
169    ASK_EXCH = 33,
170    AUCTION_VOLUME = 34,
171    AUCTION_PRICE = 35,
172    AUCTION_IMBALANCE = 36,
173    MARK_PRICE = 37,
174    BID_EFP_COMPUTATION = 38,
175    ASK_EFP_COMPUTATION = 39,
176    LAST_EFP_COMPUTATION = 40,
177    OPEN_EFP_COMPUTATION = 41,
178    HIGH_EFP_COMPUTATION = 42,
179    LOW_EFP_COMPUTATION = 43,
180    CLOSE_EFP_COMPUTATION = 44,
181    LAST_TIMESTAMP = 45,
182    SHORTABLE = 46,
183    FUNDAMENTAL_RATIOS = 47,
184    RT_VOLUME = 48,
185    HALTED = 49,
186    BID_YIELD = 50,
187    ASK_YIELD = 51,
188    LAST_YIELD = 52,
189    CUST_OPTION_COMPUTATION = 53,
190    TRADE_COUNT = 54,
191    TRADE_RATE = 55,
192    VOLUME_RATE = 56,
193    LAST_RTH_TRADE = 57,
194    RT_HISTORICAL_VOL = 58,
195    IB_DIVIDENDS = 59,
196    BOND_FACTOR_MULTIPLIER = 60,
197    REGULATORY_IMBALANCE = 61,
198    NEWS_TICK = 62,
199    SHORT_TERM_VOLUME_3_MIN = 63,
200    SHORT_TERM_VOLUME_5_MIN = 64,
201    SHORT_TERM_VOLUME_10_MIN = 65,
202    DELAYED_BID = 66,
203    DELAYED_ASK = 67,
204    DELAYED_LAST = 68,
205    DELAYED_BID_SIZE = 69,
206    DELAYED_ASK_SIZE = 70,
207    DELAYED_LAST_SIZE = 71,
208    DELAYED_HIGH = 72,
209    DELAYED_LOW = 73,
210    DELAYED_VOLUME = 74,
211    DELAYED_CLOSE = 75,
212    DELAYED_OPEN = 76,
213    RT_TRD_VOLUME = 77,
214    CREDITMAN_MARK_PRICE = 78,
215    CREDITMAN_SLOW_MARK_PRICE = 79,
216    DELAYED_BID_OPTION = 80,
217    DELAYED_ASK_OPTION = 81,
218    DELAYED_LAST_OPTION = 82,
219    DELAYED_MODEL_OPTION = 83,
220    LAST_EXCH = 84,
221    LAST_REG_TIME = 85,
222    FUTURES_OPEN_INTEREST = 86,
223    AVG_OPT_VOLUME = 87,
224    DELAYED_LAST_TIMESTAMP = 88,
225    UNKNOWN = i32::MAX,
226}
227
228impl fmt::Display for TickType {
229    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
230        let s = match self {
231            TickType::BID_SIZE => "bidSize",
232            TickType::BID => "bidPrice",
233            TickType::ASK => "askPrice",
234            TickType::ASK_SIZE => "askSize",
235            TickType::LAST => "lastPrice",
236            TickType::LAST_SIZE => "lastSize",
237            TickType::HIGH => "high",
238            TickType::LOW => "low",
239            TickType::VOLUME => "volume",
240            TickType::CLOSE => "close",
241            TickType::BID_OPTION => "bidOptComp",
242            TickType::ASK_OPTION => "askOptComp",
243            TickType::LAST_OPTION => "lastOptComp",
244            TickType::MODEL_OPTION => "modelOptComp",
245            TickType::OPEN => "open",
246            TickType::LOW_13_WEEK => "13WeekLow",
247            TickType::HIGH_13_WEEK => "13WeekHigh",
248            TickType::LOW_26_WEEK => "26WeekLow",
249            TickType::HIGH_26_WEEK => "26WeekHigh",
250            TickType::LOW_52_WEEK => "52WeekLow",
251            TickType::HIGH_52_WEEK => "52WeekHigh",
252            TickType::AVG_VOLUME => "AvgVolume",
253            TickType::OPEN_INTEREST => "OpenInterest",
254            TickType::OPTION_HISTORICAL_VOL => "OptionHistoricalVolatility",
255            TickType::OPTION_IMPLIED_VOL => "OptionImpliedVolatility",
256            TickType::OPTION_BID_EXCH => "OptionBidExchStr",
257            TickType::OPTION_ASK_EXCH => "OptionAskExchStr",
258            TickType::OPTION_CALL_OPEN_INTEREST => "OptionCallOpenInterest",
259            TickType::OPTION_PUT_OPEN_INTEREST => "OptionPutOpenInterest",
260            TickType::OPTION_CALL_VOLUME => "OptionCallVolume",
261            TickType::OPTION_PUT_VOLUME => "OptionPutVolume",
262            TickType::INDEX_FUTURE_PREMIUM => "IndexFuturePremium",
263            TickType::BID_EXCH => "bidExch",
264            TickType::ASK_EXCH => "askExch",
265            TickType::AUCTION_VOLUME => "auctionVolume",
266            TickType::AUCTION_PRICE => "auctionPrice",
267            TickType::AUCTION_IMBALANCE => "auctionImbalance",
268            TickType::MARK_PRICE => "markPrice",
269            TickType::BID_EFP_COMPUTATION => "bidEFP",
270            TickType::ASK_EFP_COMPUTATION => "askEFP",
271            TickType::LAST_EFP_COMPUTATION => "lastEFP",
272            TickType::OPEN_EFP_COMPUTATION => "openEFP",
273            TickType::HIGH_EFP_COMPUTATION => "highEFP",
274            TickType::LOW_EFP_COMPUTATION => "lowEFP",
275            TickType::CLOSE_EFP_COMPUTATION => "closeEFP",
276            TickType::LAST_TIMESTAMP => "lastTimestamp",
277            TickType::SHORTABLE => "shortable",
278            TickType::FUNDAMENTAL_RATIOS => "fundamentals",
279            TickType::RT_VOLUME => "RTVolume",
280            TickType::HALTED => "halted",
281            TickType::BID_YIELD => "bidYield",
282            TickType::ASK_YIELD => "askYield",
283            TickType::LAST_YIELD => "lastYield",
284            TickType::CUST_OPTION_COMPUTATION => "custOptComp",
285            TickType::TRADE_COUNT => "trades",
286            TickType::TRADE_RATE => "trades/min",
287            TickType::VOLUME_RATE => "volume/min",
288            TickType::LAST_RTH_TRADE => "lastRTHTrade",
289            TickType::RT_HISTORICAL_VOL => "RTHistoricalVol",
290            TickType::IB_DIVIDENDS => "IBDividends",
291            TickType::BOND_FACTOR_MULTIPLIER => "bondFactorMultiplier",
292            TickType::REGULATORY_IMBALANCE => "regulatoryImbalance",
293            TickType::NEWS_TICK => "newsTick",
294            TickType::SHORT_TERM_VOLUME_3_MIN => "shortTermVolume3Min",
295            TickType::SHORT_TERM_VOLUME_5_MIN => "shortTermVolume5Min",
296            TickType::SHORT_TERM_VOLUME_10_MIN => "shortTermVolume10Min",
297            TickType::DELAYED_BID => "delayedBid",
298            TickType::DELAYED_ASK => "delayedAsk",
299            TickType::DELAYED_LAST => "delayedLast",
300            TickType::DELAYED_BID_SIZE => "delayedBidSize",
301            TickType::DELAYED_ASK_SIZE => "delayedAskSize",
302            TickType::DELAYED_LAST_SIZE => "delayedLastSize",
303            TickType::DELAYED_HIGH => "delayedHigh",
304            TickType::DELAYED_LOW => "delayedLow",
305            TickType::DELAYED_VOLUME => "delayedVolume",
306            TickType::DELAYED_CLOSE => "delayedClose",
307            TickType::DELAYED_OPEN => "delayedOpen",
308            TickType::RT_TRD_VOLUME => "rtTrdVolume",
309            TickType::CREDITMAN_MARK_PRICE => "creditmanMarkPrice",
310            TickType::CREDITMAN_SLOW_MARK_PRICE => "creditmanSlowMarkPrice",
311            TickType::DELAYED_BID_OPTION => "delayedBidOptComp",
312            TickType::DELAYED_ASK_OPTION => "delayedAskOptComp",
313            TickType::DELAYED_LAST_OPTION => "delayedLastOptComp",
314            TickType::DELAYED_MODEL_OPTION => "delayedModelOptComp",
315            TickType::LAST_EXCH => "lastExchange",
316            TickType::LAST_REG_TIME => "lastRegTime",
317            TickType::FUTURES_OPEN_INTEREST => "futuresOpenInterest",
318            TickType::AVG_OPT_VOLUME => "avgOptVolume",
319            TickType::DELAYED_LAST_TIMESTAMP => "delayedLastTimestamp",
320            TickType::UNKNOWN => "unknown",
321        };
322        write!(f, "{}", s)
323    }
324}
325
326impl From<i32> for TickType {
327    fn from(code: i32) -> TickType {
328        match code {
329            0 => TickType::BID_SIZE,
330            1 => TickType::BID,
331            2 => TickType::ASK,
332            3 => TickType::ASK_SIZE,
333            4 => TickType::LAST,
334            5 => TickType::LAST_SIZE,
335            6 => TickType::HIGH,
336            7 => TickType::LOW,
337            8 => TickType::VOLUME,
338            9 => TickType::CLOSE,
339            10 => TickType::BID_OPTION,
340            11 => TickType::ASK_OPTION,
341            12 => TickType::LAST_OPTION,
342            13 => TickType::MODEL_OPTION,
343            14 => TickType::OPEN,
344            15 => TickType::LOW_13_WEEK,
345            16 => TickType::HIGH_13_WEEK,
346            17 => TickType::LOW_26_WEEK,
347            18 => TickType::HIGH_26_WEEK,
348            19 => TickType::LOW_52_WEEK,
349            20 => TickType::HIGH_52_WEEK,
350            21 => TickType::AVG_VOLUME,
351            22 => TickType::OPEN_INTEREST,
352            23 => TickType::OPTION_HISTORICAL_VOL,
353            24 => TickType::OPTION_IMPLIED_VOL,
354            25 => TickType::OPTION_BID_EXCH,
355            26 => TickType::OPTION_ASK_EXCH,
356            27 => TickType::OPTION_CALL_OPEN_INTEREST,
357            28 => TickType::OPTION_PUT_OPEN_INTEREST,
358            29 => TickType::OPTION_CALL_VOLUME,
359            30 => TickType::OPTION_PUT_VOLUME,
360            31 => TickType::INDEX_FUTURE_PREMIUM,
361            32 => TickType::BID_EXCH,
362            33 => TickType::ASK_EXCH,
363            34 => TickType::AUCTION_VOLUME,
364            35 => TickType::AUCTION_PRICE,
365            36 => TickType::AUCTION_IMBALANCE,
366            37 => TickType::MARK_PRICE,
367            38 => TickType::BID_EFP_COMPUTATION,
368            39 => TickType::ASK_EFP_COMPUTATION,
369            40 => TickType::LAST_EFP_COMPUTATION,
370            41 => TickType::OPEN_EFP_COMPUTATION,
371            42 => TickType::HIGH_EFP_COMPUTATION,
372            43 => TickType::LOW_EFP_COMPUTATION,
373            44 => TickType::CLOSE_EFP_COMPUTATION,
374            45 => TickType::LAST_TIMESTAMP,
375            46 => TickType::SHORTABLE,
376            47 => TickType::FUNDAMENTAL_RATIOS,
377            48 => TickType::RT_VOLUME,
378            49 => TickType::HALTED,
379            50 => TickType::BID_YIELD,
380            51 => TickType::ASK_YIELD,
381            52 => TickType::LAST_YIELD,
382            53 => TickType::CUST_OPTION_COMPUTATION,
383            54 => TickType::TRADE_COUNT,
384            55 => TickType::TRADE_RATE,
385            56 => TickType::VOLUME_RATE,
386            57 => TickType::LAST_RTH_TRADE,
387            58 => TickType::RT_HISTORICAL_VOL,
388            59 => TickType::IB_DIVIDENDS,
389            60 => TickType::BOND_FACTOR_MULTIPLIER,
390            61 => TickType::REGULATORY_IMBALANCE,
391            62 => TickType::NEWS_TICK,
392            63 => TickType::SHORT_TERM_VOLUME_3_MIN,
393            64 => TickType::SHORT_TERM_VOLUME_5_MIN,
394            65 => TickType::SHORT_TERM_VOLUME_10_MIN,
395            66 => TickType::DELAYED_BID,
396            67 => TickType::DELAYED_ASK,
397            68 => TickType::DELAYED_LAST,
398            69 => TickType::DELAYED_BID_SIZE,
399            70 => TickType::DELAYED_ASK_SIZE,
400            71 => TickType::DELAYED_LAST_SIZE,
401            72 => TickType::DELAYED_HIGH,
402            73 => TickType::DELAYED_LOW,
403            74 => TickType::DELAYED_VOLUME,
404            75 => TickType::DELAYED_CLOSE,
405            76 => TickType::DELAYED_OPEN,
406            77 => TickType::RT_TRD_VOLUME,
407            78 => TickType::CREDITMAN_MARK_PRICE,
408            79 => TickType::CREDITMAN_SLOW_MARK_PRICE,
409            80 => TickType::DELAYED_BID_OPTION,
410            81 => TickType::DELAYED_ASK_OPTION,
411            82 => TickType::DELAYED_LAST_OPTION,
412            83 => TickType::DELAYED_MODEL_OPTION,
413            84 => TickType::LAST_EXCH,
414            85 => TickType::LAST_REG_TIME,
415            86 => TickType::FUTURES_OPEN_INTEREST,
416            87 => TickType::AVG_OPT_VOLUME,
417            88 => TickType::DELAYED_LAST_TIMESTAMP,
418            _ => TickType::UNKNOWN,
419        }
420    }
421}