1use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
8pub enum MsgType {
9 Heartbeat,
11 TestRequest,
13 ResendRequest,
15 Reject,
17 SequenceReset,
19 Logout,
21 ExecutionReport,
23 OrderCancelReject,
25 Logon,
27 NewOrderSingle,
29 OrderCancelRequest,
31 OrderCancelReplaceRequest,
33 QuoteRequest,
35 MarketDataRequest,
37 MarketDataSnapshotFullRefresh,
39 MarketDataIncrementalRefresh,
41 MarketDataRequestReject,
43 QuoteCancel,
45 MassQuoteAcknowledgement,
47 SecurityDefinitionRequest,
49 SecurityDefinition,
51 SecurityStatusRequest,
53 SecurityStatus,
55 MassQuote,
57 OrderMassCancelRequest,
59 OrderMassCancelReport,
61 SecurityListRequest,
63 SecurityList,
65 QuoteStatusReport,
67 RfqRequest,
69 QuoteRequestReject,
71 TradeCaptureReportRequest,
73 TradeCaptureReport,
75 TradeCaptureReportRequestAck,
77 OrderMassStatusRequest,
79 RequestForPositions,
81 PositionReport,
83 UserRequest,
85 UserResponse,
87 MmProtectionLimits,
89 MmProtectionLimitsResult,
91 MmProtectionReset,
93}
94
95impl MsgType {
96 pub fn as_str(&self) -> &'static str {
98 match self {
99 MsgType::Heartbeat => "0",
100 MsgType::TestRequest => "1",
101 MsgType::ResendRequest => "2",
102 MsgType::Reject => "3",
103 MsgType::SequenceReset => "4",
104 MsgType::Logout => "5",
105 MsgType::ExecutionReport => "8",
106 MsgType::OrderCancelReject => "9",
107 MsgType::Logon => "A",
108 MsgType::NewOrderSingle => "D",
109 MsgType::OrderCancelRequest => "F",
110 MsgType::OrderCancelReplaceRequest => "G",
111 MsgType::QuoteRequest => "R",
112 MsgType::MarketDataRequest => "V",
113 MsgType::MarketDataSnapshotFullRefresh => "W",
114 MsgType::MarketDataIncrementalRefresh => "X",
115 MsgType::MarketDataRequestReject => "Y",
116 MsgType::QuoteCancel => "Z",
117 MsgType::MassQuoteAcknowledgement => "b",
118 MsgType::SecurityDefinitionRequest => "c",
119 MsgType::SecurityDefinition => "d",
120 MsgType::SecurityStatusRequest => "e",
121 MsgType::SecurityStatus => "f",
122 MsgType::MassQuote => "i",
123 MsgType::OrderMassCancelRequest => "q",
124 MsgType::OrderMassCancelReport => "r",
125 MsgType::SecurityListRequest => "x",
126 MsgType::SecurityList => "y",
127 MsgType::QuoteStatusReport => "AI",
128 MsgType::RfqRequest => "AH",
129 MsgType::QuoteRequestReject => "AG",
130 MsgType::TradeCaptureReportRequest => "AD",
131 MsgType::TradeCaptureReport => "AE",
132 MsgType::TradeCaptureReportRequestAck => "AQ",
133 MsgType::OrderMassStatusRequest => "AF",
134 MsgType::RequestForPositions => "AN",
135 MsgType::PositionReport => "AP",
136 MsgType::UserRequest => "BE",
137 MsgType::UserResponse => "BF",
138 MsgType::MmProtectionLimits => "MM",
139 MsgType::MmProtectionLimitsResult => "MR",
140 MsgType::MmProtectionReset => "MZ",
141 }
142 }
143
144 pub fn from_str(s: &str) -> Option<Self> {
146 match s {
147 "0" => Some(MsgType::Heartbeat),
148 "1" => Some(MsgType::TestRequest),
149 "2" => Some(MsgType::ResendRequest),
150 "3" => Some(MsgType::Reject),
151 "4" => Some(MsgType::SequenceReset),
152 "5" => Some(MsgType::Logout),
153 "8" => Some(MsgType::ExecutionReport),
154 "9" => Some(MsgType::OrderCancelReject),
155 "A" => Some(MsgType::Logon),
156 "D" => Some(MsgType::NewOrderSingle),
157 "F" => Some(MsgType::OrderCancelRequest),
158 "G" => Some(MsgType::OrderCancelReplaceRequest),
159 "R" => Some(MsgType::QuoteRequest),
160 "V" => Some(MsgType::MarketDataRequest),
161 "W" => Some(MsgType::MarketDataSnapshotFullRefresh),
162 "X" => Some(MsgType::MarketDataIncrementalRefresh),
163 "Y" => Some(MsgType::MarketDataRequestReject),
164 "Z" => Some(MsgType::QuoteCancel),
165 "b" => Some(MsgType::MassQuoteAcknowledgement),
166 "c" => Some(MsgType::SecurityDefinitionRequest),
167 "d" => Some(MsgType::SecurityDefinition),
168 "e" => Some(MsgType::SecurityStatusRequest),
169 "f" => Some(MsgType::SecurityStatus),
170 "i" => Some(MsgType::MassQuote),
171 "q" => Some(MsgType::OrderMassCancelRequest),
172 "r" => Some(MsgType::OrderMassCancelReport),
173 "x" => Some(MsgType::SecurityListRequest),
174 "y" => Some(MsgType::SecurityList),
175 "AI" => Some(MsgType::QuoteStatusReport),
176 "AH" => Some(MsgType::RfqRequest),
177 "AG" => Some(MsgType::QuoteRequestReject),
178 "AD" => Some(MsgType::TradeCaptureReportRequest),
179 "AE" => Some(MsgType::TradeCaptureReport),
180 "AQ" => Some(MsgType::TradeCaptureReportRequestAck),
181 "AF" => Some(MsgType::OrderMassStatusRequest),
182 "AN" => Some(MsgType::RequestForPositions),
183 "AP" => Some(MsgType::PositionReport),
184 "BE" => Some(MsgType::UserRequest),
185 "BF" => Some(MsgType::UserResponse),
186 "MM" => Some(MsgType::MmProtectionLimits),
187 "MR" => Some(MsgType::MmProtectionLimitsResult),
188 "MZ" => Some(MsgType::MmProtectionReset),
189 _ => None,
190 }
191 }
192}
193
194pub mod tags {
196 pub const BEGIN_STRING: u32 = 8;
198 pub const BODY_LENGTH: u32 = 9;
200 pub const CHECKSUM: u32 = 10;
202 pub const CL_ORD_ID: u32 = 11;
204 pub const MSG_SEQ_NUM: u32 = 34;
206 pub const MSG_TYPE: u32 = 35;
208 pub const ORDER_QTY: u32 = 38;
210 pub const ORD_TYPE: u32 = 40;
212 pub const ORIG_CL_ORD_ID: u32 = 41;
214 pub const PRICE: u32 = 44;
216 pub const SENDER_COMP_ID: u32 = 49;
218 pub const SENDING_TIME: u32 = 52;
220 pub const SIDE: u32 = 54;
222 pub const SYMBOL: u32 = 55;
224 pub const TARGET_COMP_ID: u32 = 56;
226 pub const TIME_IN_FORCE: u32 = 59;
228 pub const RAW_DATA_LENGTH: u32 = 95;
230 pub const RAW_DATA: u32 = 96;
232 pub const HEART_BT_INT: u32 = 108;
234 pub const TEST_REQ_ID: u32 = 112;
236 pub const NO_RELATED_SYM: u32 = 146;
238 pub const MD_REQ_ID: u32 = 262;
240 pub const SUBSCRIPTION_REQUEST_TYPE: u32 = 263;
242 pub const MARKET_DEPTH: u32 = 264;
244 pub const USERNAME: u32 = 553;
246 pub const PASSWORD: u32 = 554;
248 pub const POS_REQ_ID: u32 = 710;
250 pub const POS_REQ_TYPE: u32 = 724;
252
253 pub const CANCEL_ON_DISCONNECT: u32 = 9001;
256 pub const DERIBIT_APP_ID: u32 = 9004;
258 pub const DERIBIT_APP_SIG: u32 = 9005;
260}
261
262#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
264pub enum OrderStatus {
265 New,
266 PartiallyFilled,
267 Filled,
268 DoneForDay,
269 Canceled,
270 Replaced,
271 PendingCancel,
272 Stopped,
273 Rejected,
274 Suspended,
275 PendingNew,
276 Calculated,
277 Expired,
278 AcceptedForBidding,
279 PendingReplace,
280}
281
282#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
284pub enum ExecType {
285 New,
286 DoneForDay,
287 Canceled,
288 Replaced,
289 PendingCancel,
290 Stopped,
291 Rejected,
292 Suspended,
293 PendingNew,
294 Calculated,
295 Expired,
296 Restated,
297 PendingReplace,
298 Trade,
299 TradeCorrect,
300 TradeCancel,
301 OrderStatus,
302}
303
304#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
306pub enum MDEntryType {
307 Bid,
308 Offer,
309 Trade,
310 IndexValue,
311 OpeningPrice,
312 ClosingPrice,
313 SettlementPrice,
314 TradingSessionHighPrice,
315 TradingSessionLowPrice,
316 TradingSessionVWAPPrice,
317 Imbalance,
318 TradeVolume,
319 OpenInterest,
320}
321
322#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
324pub enum SecurityType {
325 Future,
326 Option,
327 Spot,
328 Index,
329}
330
331#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
333pub enum Currency {
334 BTC,
335 ETH,
336 USD,
337 USDC,
338}
339
340impl Currency {
341 pub fn as_str(&self) -> &'static str {
342 match self {
343 Currency::BTC => "BTC",
344 Currency::ETH => "ETH",
345 Currency::USD => "USD",
346 Currency::USDC => "USDC",
347 }
348 }
349}
350
351#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
353pub enum InstrumentKind {
354 Future,
355 Option,
356 Spot,
357 FutureCombo,
358 OptionCombo,
359}
360
361impl InstrumentKind {
362 pub fn as_str(&self) -> &'static str {
363 match self {
364 InstrumentKind::Future => "future",
365 InstrumentKind::Option => "option",
366 InstrumentKind::Spot => "spot",
367 InstrumentKind::FutureCombo => "future_combo",
368 InstrumentKind::OptionCombo => "option_combo",
369 }
370 }
371}