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 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}