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******************************************************************************/
6use crate::model::order::{OrderSide, OrderType, TimeInForce};
7use pretty_simple_display::{DebugPretty, DisplaySimple};
8
9use serde::{Deserialize, Serialize};
10
11/// Buy order request
12#[derive(DebugPretty, DisplaySimple, 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
32/// Sell order request
33#[derive(DebugPretty, DisplaySimple, Clone, Serialize, Deserialize)]
34pub struct SellOrderRequest {
35    /// Name of the instrument to trade
36    pub instrument_name: String,
37    /// Amount/quantity to sell
38    pub amount: f64,
39    /// Order price (required for limit orders)
40    pub price: Option<f64>,
41    /// User-defined label for the order
42    pub label: Option<String>,
43    /// Time in force specification
44    pub time_in_force: Option<TimeInForce>,
45    /// Whether this order only reduces position
46    pub reduce_only: Option<bool>,
47    /// Whether this is a post-only order
48    pub post_only: Option<bool>,
49    /// Type of order to place
50    pub type_: Option<OrderType>,
51}
52
53/// Edit order request
54#[derive(DebugPretty, DisplaySimple, Clone, Serialize, Deserialize)]
55pub struct EditOrderRequest {
56    /// Unique identifier of the order to edit
57    pub order_id: String,
58    /// New order amount/quantity
59    pub amount: Option<f64>,
60    /// New order price
61    pub price: Option<f64>,
62    /// Whether this is a post-only order
63    pub post_only: Option<bool>,
64    /// Whether this order only reduces position
65    pub reduce_only: Option<bool>,
66    /// Time in force specification
67    pub time_in_force: Option<TimeInForce>,
68}
69
70/// Mass quote request item
71#[derive(DebugPretty, DisplaySimple, Clone, Serialize, Deserialize)]
72pub struct MassQuoteItem {
73    /// Name of the instrument to quote
74    pub instrument_name: String,
75    /// Order side (buy or sell)
76    pub side: OrderSide,
77    /// Quote amount/quantity
78    pub amount: f64,
79    /// Quote price
80    pub price: f64,
81}
82
83/// Mass quote request
84#[derive(DebugPretty, DisplaySimple, Clone, Serialize, Deserialize)]
85pub struct MassQuoteRequest {
86    /// List of quote items
87    pub items: Vec<MassQuoteItem>,
88    /// User-defined label for the mass quote
89    pub label: Option<String>,
90}
91
92/// Transfer result for order-related transfers (e.g., fee rebates)
93#[derive(DebugPretty, DisplaySimple, Clone, Serialize, Deserialize)]
94pub struct TransferResult {
95    /// Transfer identifier
96    pub id: String,
97    /// Transfer status
98    pub status: String,
99}
100
101/// Quote result
102#[derive(DebugPretty, DisplaySimple, Clone, Serialize, Deserialize)]
103pub struct QuoteResult {
104    /// Name of the instrument that was quoted
105    pub instrument_name: String,
106    /// Whether the quote was successful
107    pub success: bool,
108    /// Error message if quote failed
109    pub error: Option<String>,
110}
111
112#[cfg(test)]
113mod tests {
114    use super::*;
115
116    #[test]
117    fn test_mass_quote_request() {
118        let item = MassQuoteItem {
119            instrument_name: "BTC-PERPETUAL".to_string(),
120            side: OrderSide::Buy,
121            amount: 10.0,
122            price: 50000.0,
123        };
124        let req = MassQuoteRequest {
125            items: vec![item],
126            label: Some("test".to_string()),
127        };
128        let json = serde_json::to_string(&req).unwrap();
129        let de: MassQuoteRequest = serde_json::from_str(&json).unwrap();
130        assert_eq!(de.items.len(), 1);
131    }
132}