deribit_base/model/
order_management.rs

1/******************************************************************************
2   Author: Joaquín Béjar García
3   Email: jb@taunais.com
4   Date: 21/7/25
5******************************************************************************/
6
7use crate::model::order::{OrderSide, OrderType, TimeInForce};
8use crate::{impl_json_debug_pretty, impl_json_display};
9use serde::{Deserialize, Serialize};
10
11/// Buy order request
12#[derive(Clone, Serialize, Deserialize)]
13pub struct BuyOrderRequest {
14    /// Name of the instrument to trade
15    pub instrument_name: String,
16    /// Amount/quantity to buy
17    pub amount: f64,
18    /// Order price (required for limit orders)
19    pub price: Option<f64>,
20    /// User-defined label for the order
21    pub label: Option<String>,
22    /// Time in force specification
23    pub time_in_force: Option<TimeInForce>,
24    /// Whether this order only reduces position
25    pub reduce_only: Option<bool>,
26    /// Whether this is a post-only order
27    pub post_only: Option<bool>,
28    /// Type of order to place
29    pub type_: Option<OrderType>,
30}
31
32impl_json_display!(BuyOrderRequest);
33impl_json_debug_pretty!(BuyOrderRequest);
34
35/// Sell order request
36#[derive(Clone, Serialize, Deserialize)]
37pub struct SellOrderRequest {
38    /// Name of the instrument to trade
39    pub instrument_name: String,
40    /// Amount/quantity to sell
41    pub amount: f64,
42    /// Order price (required for limit orders)
43    pub price: Option<f64>,
44    /// User-defined label for the order
45    pub label: Option<String>,
46    /// Time in force specification
47    pub time_in_force: Option<TimeInForce>,
48    /// Whether this order only reduces position
49    pub reduce_only: Option<bool>,
50    /// Whether this is a post-only order
51    pub post_only: Option<bool>,
52    /// Type of order to place
53    pub type_: Option<OrderType>,
54}
55
56impl_json_display!(SellOrderRequest);
57impl_json_debug_pretty!(SellOrderRequest);
58
59/// Edit order request
60#[derive(Clone, Serialize, Deserialize)]
61pub struct EditOrderRequest {
62    /// Unique identifier of the order to edit
63    pub order_id: String,
64    /// New order amount/quantity
65    pub amount: Option<f64>,
66    /// New order price
67    pub price: Option<f64>,
68    /// Whether this is a post-only order
69    pub post_only: Option<bool>,
70    /// Whether this order only reduces position
71    pub reduce_only: Option<bool>,
72    /// Time in force specification
73    pub time_in_force: Option<TimeInForce>,
74}
75
76impl_json_display!(EditOrderRequest);
77impl_json_debug_pretty!(EditOrderRequest);
78
79/// Mass quote request item
80#[derive(Clone, Serialize, Deserialize)]
81pub struct MassQuoteItem {
82    /// Name of the instrument to quote
83    pub instrument_name: String,
84    /// Order side (buy or sell)
85    pub side: OrderSide,
86    /// Quote amount/quantity
87    pub amount: f64,
88    /// Quote price
89    pub price: f64,
90}
91
92/// Mass quote request
93#[derive(Clone, Serialize, Deserialize)]
94pub struct MassQuoteRequest {
95    /// List of quote items
96    pub items: Vec<MassQuoteItem>,
97    /// User-defined label for the mass quote
98    pub label: Option<String>,
99}
100
101impl_json_display!(MassQuoteRequest);
102impl_json_debug_pretty!(MassQuoteRequest);
103
104/// Transfer result for order-related transfers (e.g., fee rebates)
105#[derive(Clone, Serialize, Deserialize)]
106pub struct TransferResult {
107    /// Transfer identifier
108    pub id: String,
109    /// Transfer status
110    pub status: String,
111}
112
113impl_json_display!(TransferResult);
114impl_json_debug_pretty!(TransferResult);
115
116/// Quote result
117#[derive(Clone, Serialize, Deserialize)]
118pub struct QuoteResult {
119    /// Name of the instrument that was quoted
120    pub instrument_name: String,
121    /// Whether the quote was successful
122    pub success: bool,
123    /// Error message if quote failed
124    pub error: Option<String>,
125}
126
127impl_json_display!(QuoteResult);
128impl_json_debug_pretty!(QuoteResult);
129
130#[cfg(test)]
131mod tests {
132    use super::*;
133
134    #[test]
135    fn test_mass_quote_request() {
136        let item = MassQuoteItem {
137            instrument_name: "BTC-PERPETUAL".to_string(),
138            side: OrderSide::Buy,
139            amount: 10.0,
140            price: 50000.0,
141        };
142        let req = MassQuoteRequest {
143            items: vec![item],
144            label: Some("test".to_string()),
145        };
146        let json = serde_json::to_string(&req).unwrap();
147        let de: MassQuoteRequest = serde_json::from_str(&json).unwrap();
148        assert_eq!(de.items.len(), 1);
149    }
150}