deribit_fix/model/
types.rs

1/******************************************************************************
2   Author: Joaquín Béjar García
3   Email: jb@taunais.com
4   Date: 21/7/25
5******************************************************************************/
6use deribit_base::{impl_json_debug_pretty, impl_json_display};
7use serde::{Deserialize, Serialize};
8use std::str::FromStr;
9
10/// FIX message type identifiers
11#[derive(Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
12pub enum MsgType {
13    /// Heartbeat (0)
14    Heartbeat,
15    /// Test Request (1)
16    TestRequest,
17    /// Resend Request (2)
18    ResendRequest,
19    /// Reject (3)
20    Reject,
21    /// Sequence Reset (4)
22    SequenceReset,
23    /// Logout (5)
24    Logout,
25    /// Execution Report (8)
26    ExecutionReport,
27    /// Order Cancel Reject (9)
28    OrderCancelReject,
29    /// Logon (A)
30    Logon,
31    /// New Order Single (D)
32    NewOrderSingle,
33    /// Order Cancel Request (F)
34    OrderCancelRequest,
35    /// Order Cancel/Replace Request (G)
36    OrderCancelReplaceRequest,
37    /// Quote Request (R)
38    QuoteRequest,
39    /// Market Data Request (V)
40    MarketDataRequest,
41    /// Market Data Snapshot/Full Refresh (W)
42    MarketDataSnapshotFullRefresh,
43    /// Market Data Incremental Refresh (X)
44    MarketDataIncrementalRefresh,
45    /// Market Data Request Reject (Y)
46    MarketDataRequestReject,
47    /// Quote Cancel (Z)
48    QuoteCancel,
49    /// Mass Quote Acknowledgement (b)
50    MassQuoteAcknowledgement,
51    /// Security Definition Request (c)
52    SecurityDefinitionRequest,
53    /// Security Definition (d)
54    SecurityDefinition,
55    /// Security Status Request (e)
56    SecurityStatusRequest,
57    /// Security Status (f)
58    SecurityStatus,
59    /// Mass Quote (i)
60    MassQuote,
61    /// Order Mass Cancel Request (q)
62    OrderMassCancelRequest,
63    /// Order Mass Cancel Report (r)
64    OrderMassCancelReport,
65    /// Security List Request (x)
66    SecurityListRequest,
67    /// Security List (y)
68    SecurityList,
69    /// Quote Status Report (AI)
70    QuoteStatusReport,
71    /// RFQ Request (AH)
72    RfqRequest,
73    /// Quote Request Reject (AG)
74    QuoteRequestReject,
75    /// Trade Capture Report Request (AD)
76    TradeCaptureReportRequest,
77    /// Trade Capture Report (AE)
78    TradeCaptureReport,
79    /// Trade Capture Report Request Ack (AQ)
80    TradeCaptureReportRequestAck,
81    /// Order Mass Status Request (AF)
82    OrderMassStatusRequest,
83    /// Request For Positions (AN)
84    RequestForPositions,
85    /// Position Report (AP)
86    PositionReport,
87    /// User Request (BE)
88    UserRequest,
89    /// User Response (BF)
90    UserResponse,
91    /// MM Protection Limits (MM)
92    MmProtectionLimits,
93    /// MM Protection Limits Result/Reject (MR)
94    MmProtectionLimitsResult,
95    /// MM Protection Reset (MZ)
96    MmProtectionReset,
97}
98
99impl MsgType {
100    /// Convert to FIX message type string
101    pub fn as_str(&self) -> &'static str {
102        match self {
103            MsgType::Heartbeat => "0",
104            MsgType::TestRequest => "1",
105            MsgType::ResendRequest => "2",
106            MsgType::Reject => "3",
107            MsgType::SequenceReset => "4",
108            MsgType::Logout => "5",
109            MsgType::ExecutionReport => "8",
110            MsgType::OrderCancelReject => "9",
111            MsgType::Logon => "A",
112            MsgType::NewOrderSingle => "D",
113            MsgType::OrderCancelRequest => "F",
114            MsgType::OrderCancelReplaceRequest => "G",
115            MsgType::QuoteRequest => "R",
116            MsgType::MarketDataRequest => "V",
117            MsgType::MarketDataSnapshotFullRefresh => "W",
118            MsgType::MarketDataIncrementalRefresh => "X",
119            MsgType::MarketDataRequestReject => "Y",
120            MsgType::QuoteCancel => "Z",
121            MsgType::MassQuoteAcknowledgement => "b",
122            MsgType::SecurityDefinitionRequest => "c",
123            MsgType::SecurityDefinition => "d",
124            MsgType::SecurityStatusRequest => "e",
125            MsgType::SecurityStatus => "f",
126            MsgType::MassQuote => "i",
127            MsgType::OrderMassCancelRequest => "q",
128            MsgType::OrderMassCancelReport => "r",
129            MsgType::SecurityListRequest => "x",
130            MsgType::SecurityList => "y",
131            MsgType::QuoteStatusReport => "AI",
132            MsgType::RfqRequest => "AH",
133            MsgType::QuoteRequestReject => "AG",
134            MsgType::TradeCaptureReportRequest => "AD",
135            MsgType::TradeCaptureReport => "AE",
136            MsgType::TradeCaptureReportRequestAck => "AQ",
137            MsgType::OrderMassStatusRequest => "AF",
138            MsgType::RequestForPositions => "AN",
139            MsgType::PositionReport => "AP",
140            MsgType::UserRequest => "BE",
141            MsgType::UserResponse => "BF",
142            MsgType::MmProtectionLimits => "MM",
143            MsgType::MmProtectionLimitsResult => "MR",
144            MsgType::MmProtectionReset => "MZ",
145        }
146    }
147}
148
149/// Error type for parsing MsgType from string
150#[derive(Debug, Clone, PartialEq, Eq)]
151pub struct ParseMsgTypeError(pub String);
152
153impl std::fmt::Display for ParseMsgTypeError {
154    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
155        write!(f, "Unknown message type: {}", self.0)
156    }
157}
158
159impl std::error::Error for ParseMsgTypeError {}
160
161impl FromStr for MsgType {
162    type Err = ParseMsgTypeError;
163
164    fn from_str(s: &str) -> Result<Self, Self::Err> {
165        match s {
166            "0" => Ok(MsgType::Heartbeat),
167            "1" => Ok(MsgType::TestRequest),
168            "2" => Ok(MsgType::ResendRequest),
169            "3" => Ok(MsgType::Reject),
170            "4" => Ok(MsgType::SequenceReset),
171            "5" => Ok(MsgType::Logout),
172            "8" => Ok(MsgType::ExecutionReport),
173            "9" => Ok(MsgType::OrderCancelReject),
174            "A" => Ok(MsgType::Logon),
175            "D" => Ok(MsgType::NewOrderSingle),
176            "F" => Ok(MsgType::OrderCancelRequest),
177            "G" => Ok(MsgType::OrderCancelReplaceRequest),
178            "R" => Ok(MsgType::QuoteRequest),
179            "V" => Ok(MsgType::MarketDataRequest),
180            "W" => Ok(MsgType::MarketDataSnapshotFullRefresh),
181            "X" => Ok(MsgType::MarketDataIncrementalRefresh),
182            "Y" => Ok(MsgType::MarketDataRequestReject),
183            "Z" => Ok(MsgType::QuoteCancel),
184            "b" => Ok(MsgType::MassQuoteAcknowledgement),
185            "c" => Ok(MsgType::SecurityDefinitionRequest),
186            "d" => Ok(MsgType::SecurityDefinition),
187            "e" => Ok(MsgType::SecurityStatusRequest),
188            "f" => Ok(MsgType::SecurityStatus),
189            "i" => Ok(MsgType::MassQuote),
190            "q" => Ok(MsgType::OrderMassCancelRequest),
191            "r" => Ok(MsgType::OrderMassCancelReport),
192            "x" => Ok(MsgType::SecurityListRequest),
193            "y" => Ok(MsgType::SecurityList),
194            "AI" => Ok(MsgType::QuoteStatusReport),
195            "AH" => Ok(MsgType::RfqRequest),
196            "AG" => Ok(MsgType::QuoteRequestReject),
197            "AD" => Ok(MsgType::TradeCaptureReportRequest),
198            "AE" => Ok(MsgType::TradeCaptureReport),
199            "AQ" => Ok(MsgType::TradeCaptureReportRequestAck),
200            "AF" => Ok(MsgType::OrderMassStatusRequest),
201            "AN" => Ok(MsgType::RequestForPositions),
202            "AP" => Ok(MsgType::PositionReport),
203            "BE" => Ok(MsgType::UserRequest),
204            "BF" => Ok(MsgType::UserResponse),
205            "MM" => Ok(MsgType::MmProtectionLimits),
206            "MR" => Ok(MsgType::MmProtectionLimitsResult),
207            "MZ" => Ok(MsgType::MmProtectionReset),
208            _ => Err(ParseMsgTypeError(s.to_string())),
209        }
210    }
211}
212
213/// Execution type enumeration
214#[derive(Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
215pub enum ExecType {
216    /// New order
217    New,
218    /// Order done for day
219    DoneForDay,
220    /// Order canceled
221    Canceled,
222    /// Order replaced
223    Replaced,
224    /// Pending cancel
225    PendingCancel,
226    /// Order stopped
227    Stopped,
228    /// Order rejected
229    Rejected,
230    /// Order suspended
231    Suspended,
232    /// Pending new order
233    PendingNew,
234    /// Calculated
235    Calculated,
236    /// Order expired
237    Expired,
238    /// Order restated
239    Restated,
240    /// Pending replace
241    PendingReplace,
242    /// Trade execution
243    Trade,
244    /// Trade correction
245    TradeCorrect,
246    /// Trade cancellation
247    TradeCancel,
248    /// Order status update
249    OrderStatus,
250}
251
252/// Market data entry type
253#[derive(Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
254pub enum MDEntryType {
255    /// Bid price
256    Bid,
257    /// Offer/ask price
258    Offer,
259    /// Trade price
260    Trade,
261    /// Index value
262    IndexValue,
263    /// Opening price
264    OpeningPrice,
265    /// Closing price
266    ClosingPrice,
267    /// Settlement price
268    SettlementPrice,
269    /// Trading session high price
270    TradingSessionHighPrice,
271    /// Trading session low price
272    TradingSessionLowPrice,
273    /// Trading session VWAP price
274    TradingSessionVWAPPrice,
275    /// Order imbalance
276    Imbalance,
277    /// Trade volume
278    TradeVolume,
279    /// Open interest
280    OpenInterest,
281}
282
283/// Security type enumeration
284#[derive(Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
285pub enum SecurityType {
286    /// Future contract
287    Future,
288    /// Option contract
289    Option,
290    /// Spot trading
291    Spot,
292    /// Index instrument
293    Index,
294}
295
296impl_json_debug_pretty!(MsgType, ExecType, MDEntryType, SecurityType);
297impl_json_display!(MsgType, ExecType, MDEntryType, SecurityType);