deribit_fix/types/
mod.rs

1//! Type definitions for the Deribit FIX framework
2
3
4use serde::{Deserialize, Serialize};
5
6/// FIX message type identifiers
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
8pub enum MsgType {
9    /// Heartbeat (0)
10    Heartbeat,
11    /// Test Request (1)
12    TestRequest,
13    /// Resend Request (2)
14    ResendRequest,
15    /// Reject (3)
16    Reject,
17    /// Sequence Reset (4)
18    SequenceReset,
19    /// Logout (5)
20    Logout,
21    /// Execution Report (8)
22    ExecutionReport,
23    /// Order Cancel Reject (9)
24    OrderCancelReject,
25    /// Logon (A)
26    Logon,
27    /// New Order Single (D)
28    NewOrderSingle,
29    /// Order Cancel Request (F)
30    OrderCancelRequest,
31    /// Order Cancel/Replace Request (G)
32    OrderCancelReplaceRequest,
33    /// Quote Request (R)
34    QuoteRequest,
35    /// Market Data Request (V)
36    MarketDataRequest,
37    /// Market Data Snapshot/Full Refresh (W)
38    MarketDataSnapshotFullRefresh,
39    /// Market Data Incremental Refresh (X)
40    MarketDataIncrementalRefresh,
41    /// Market Data Request Reject (Y)
42    MarketDataRequestReject,
43    /// Quote Cancel (Z)
44    QuoteCancel,
45    /// Mass Quote Acknowledgement (b)
46    MassQuoteAcknowledgement,
47    /// Security Definition Request (c)
48    SecurityDefinitionRequest,
49    /// Security Definition (d)
50    SecurityDefinition,
51    /// Security Status Request (e)
52    SecurityStatusRequest,
53    /// Security Status (f)
54    SecurityStatus,
55    /// Mass Quote (i)
56    MassQuote,
57    /// Order Mass Cancel Request (q)
58    OrderMassCancelRequest,
59    /// Order Mass Cancel Report (r)
60    OrderMassCancelReport,
61    /// Security List Request (x)
62    SecurityListRequest,
63    /// Security List (y)
64    SecurityList,
65    /// Quote Status Report (AI)
66    QuoteStatusReport,
67    /// RFQ Request (AH)
68    RfqRequest,
69    /// Quote Request Reject (AG)
70    QuoteRequestReject,
71    /// Trade Capture Report Request (AD)
72    TradeCaptureReportRequest,
73    /// Trade Capture Report (AE)
74    TradeCaptureReport,
75    /// Trade Capture Report Request Ack (AQ)
76    TradeCaptureReportRequestAck,
77    /// Order Mass Status Request (AF)
78    OrderMassStatusRequest,
79    /// Request For Positions (AN)
80    RequestForPositions,
81    /// Position Report (AP)
82    PositionReport,
83    /// User Request (BE)
84    UserRequest,
85    /// User Response (BF)
86    UserResponse,
87    /// MM Protection Limits (MM)
88    MmProtectionLimits,
89    /// MM Protection Limits Result/Reject (MR)
90    MmProtectionLimitsResult,
91    /// MM Protection Reset (MZ)
92    MmProtectionReset,
93}
94
95impl MsgType {
96    /// Convert to FIX message type string
97    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    /// Parse from FIX message type string
145    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
194/// FIX field tags commonly used in Deribit
195pub mod tags {
196    /// BeginString (8)
197    pub const BEGIN_STRING: u32 = 8;
198    /// BodyLength (9)
199    pub const BODY_LENGTH: u32 = 9;
200    /// CheckSum (10)
201    pub const CHECKSUM: u32 = 10;
202    /// ClOrdID (11)
203    pub const CL_ORD_ID: u32 = 11;
204    /// MsgSeqNum (34)
205    pub const MSG_SEQ_NUM: u32 = 34;
206    /// MsgType (35)
207    pub const MSG_TYPE: u32 = 35;
208    /// OrderQty (38)
209    pub const ORDER_QTY: u32 = 38;
210    /// OrdType (40)
211    pub const ORD_TYPE: u32 = 40;
212    /// OrigClOrdID (41)
213    pub const ORIG_CL_ORD_ID: u32 = 41;
214    /// Price (44)
215    pub const PRICE: u32 = 44;
216    /// SenderCompID (49)
217    pub const SENDER_COMP_ID: u32 = 49;
218    /// SendingTime (52)
219    pub const SENDING_TIME: u32 = 52;
220    /// Side (54)
221    pub const SIDE: u32 = 54;
222    /// Symbol (55)
223    pub const SYMBOL: u32 = 55;
224    /// TargetCompID (56)
225    pub const TARGET_COMP_ID: u32 = 56;
226    /// TimeInForce (59)
227    pub const TIME_IN_FORCE: u32 = 59;
228    /// RawDataLength (95)
229    pub const RAW_DATA_LENGTH: u32 = 95;
230    /// RawData (96)
231    pub const RAW_DATA: u32 = 96;
232    /// HeartBtInt (108)
233    pub const HEART_BT_INT: u32 = 108;
234    /// TestReqID (112)
235    pub const TEST_REQ_ID: u32 = 112;
236    /// NoRelatedSym (146)
237    pub const NO_RELATED_SYM: u32 = 146;
238    /// MDReqID (262)
239    pub const MD_REQ_ID: u32 = 262;
240    /// SubscriptionRequestType (263)
241    pub const SUBSCRIPTION_REQUEST_TYPE: u32 = 263;
242    /// MarketDepth (264)
243    pub const MARKET_DEPTH: u32 = 264;
244    /// Username (553)
245    pub const USERNAME: u32 = 553;
246    /// Password (554)
247    pub const PASSWORD: u32 = 554;
248    /// PosReqID (710)
249    pub const POS_REQ_ID: u32 = 710;
250    /// PosReqType (724)
251    pub const POS_REQ_TYPE: u32 = 724;
252    
253    // Deribit custom tags
254    /// CancelOnDisconnect (9001)
255    pub const CANCEL_ON_DISCONNECT: u32 = 9001;
256    /// DeribitAppId (9004)
257    pub const DERIBIT_APP_ID: u32 = 9004;
258    /// DeribitAppSig (9005)
259    pub const DERIBIT_APP_SIG: u32 = 9005;
260}
261
262/// Order status enumeration
263#[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/// Execution type enumeration
283#[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/// Market data entry type
305#[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/// Security type enumeration
323#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
324pub enum SecurityType {
325    Future,
326    Option,
327    Spot,
328    Index,
329}
330
331/// Currency enumeration for Deribit
332#[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/// Instrument kind for Deribit
352#[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}