Skip to main content

nautilus_deribit/http/
models.rs

1// -------------------------------------------------------------------------------------------------
2//  Copyright (C) 2015-2026 Nautech Systems Pty Ltd. All rights reserved.
3//  https://nautechsystems.io
4//
5//  Licensed under the GNU Lesser General Public License Version 3.0 (the "License");
6//  You may not use this file except in compliance with the License.
7//  You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html
8//
9//  Unless required by applicable law or agreed to in writing, software
10//  distributed under the License is distributed on an "AS IS" BASIS,
11//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12//  See the License for the specific language governing permissions and
13//  limitations under the License.
14// -------------------------------------------------------------------------------------------------
15
16//! Deribit HTTP API models and types.
17
18use nautilus_core::serialization::{deserialize_decimal, deserialize_optional_decimal};
19use rust_decimal::Decimal;
20use serde::{Deserialize, Serialize};
21use ustr::Ustr;
22
23pub use crate::common::{
24    enums::{DeribitCurrency, DeribitOptionType, DeribitProductType},
25    rpc::{DeribitJsonRpcError, DeribitJsonRpcRequest, DeribitJsonRpcResponse},
26};
27
28/// JSON-RPC 2.0 response payload (either success or error).
29#[derive(Debug, Serialize, Deserialize)]
30#[serde(untagged)]
31pub enum DeribitResponsePayload<T> {
32    /// Successful response with result data
33    Success { result: T },
34    /// Error response with error details
35    Error { error: DeribitJsonRpcError },
36}
37
38/// Deribit instrument definition.
39#[derive(Clone, Debug, Serialize, Deserialize)]
40pub struct DeribitInstrument {
41    /// The underlying currency being traded
42    pub base_currency: Ustr,
43    /// Block trade commission for instrument
44    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
45    pub block_trade_commission: Option<Decimal>,
46    /// Minimum amount for block trading
47    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
48    pub block_trade_min_trade_amount: Option<Decimal>,
49    /// Specifies minimal price change for block trading
50    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
51    pub block_trade_tick_size: Option<Decimal>,
52    /// Contract size for instrument
53    #[serde(deserialize_with = "deserialize_decimal")]
54    pub contract_size: Decimal,
55    /// Counter currency for the instrument
56    pub counter_currency: Option<Ustr>,
57    /// The time when the instrument was first created (milliseconds since UNIX epoch)
58    pub creation_timestamp: i64,
59    /// The time when the instrument will expire (milliseconds since UNIX epoch)
60    pub expiration_timestamp: Option<i64>,
61    /// Future type (deprecated, use instrument_type instead)
62    pub future_type: Option<String>,
63    /// Instrument ID
64    pub instrument_id: i64,
65    /// Unique instrument identifier (e.g., "BTC-PERPETUAL")
66    pub instrument_name: Ustr,
67    /// Type of the instrument: "linear" or "reversed"
68    pub instrument_type: Option<String>,
69    /// Indicates if the instrument can currently be traded
70    pub is_active: bool,
71    /// Product type: "future", "option", "spot", "future_combo", "option_combo"
72    pub kind: DeribitProductType,
73    /// Maker commission for instrument
74    #[serde(deserialize_with = "deserialize_decimal")]
75    pub maker_commission: Decimal,
76    /// Maximal leverage for instrument (only for futures)
77    pub max_leverage: Option<i64>,
78    /// Maximal liquidation trade commission for instrument (only for futures)
79    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
80    pub max_liquidation_commission: Option<Decimal>,
81    /// Minimum amount for trading
82    #[serde(deserialize_with = "deserialize_decimal")]
83    pub min_trade_amount: Decimal,
84    /// The option type (only for options)
85    pub option_type: Option<DeribitOptionType>,
86    /// Name of price index that is used for this instrument
87    pub price_index: Option<String>,
88    /// The currency in which the instrument prices are quoted
89    pub quote_currency: Ustr,
90    /// Settlement currency for the instrument (not present for spot)
91    pub settlement_currency: Option<Ustr>,
92    /// The settlement period (not present for spot)
93    pub settlement_period: Option<String>,
94    /// The strike value (only for options)
95    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
96    pub strike: Option<Decimal>,
97    /// Taker commission for instrument
98    #[serde(deserialize_with = "deserialize_decimal")]
99    pub taker_commission: Decimal,
100    /// Specifies minimal price change and number of decimal places for instrument prices
101    #[serde(deserialize_with = "deserialize_decimal")]
102    pub tick_size: Decimal,
103    /// Tick size steps for different price ranges
104    pub tick_size_steps: Option<Vec<DeribitTickSizeStep>>,
105}
106
107/// Tick size step definition for price-dependent tick sizes.
108#[derive(Clone, Debug, Serialize, Deserialize)]
109pub struct DeribitTickSizeStep {
110    /// The price from which the increased tick size applies
111    #[serde(deserialize_with = "deserialize_decimal")]
112    pub above_price: Decimal,
113    /// Tick size to be used above the price
114    #[serde(deserialize_with = "deserialize_decimal")]
115    pub tick_size: Decimal,
116}
117
118/// Wrapper for the account summaries response.
119///
120/// The API returns an object with a `summaries` field containing the array of account summaries,
121/// plus account-level metadata.
122#[derive(Debug, Clone, Serialize, Deserialize)]
123pub struct DeribitAccountSummariesResponse {
124    /// Array of per-currency account summaries
125    pub summaries: Vec<DeribitAccountSummary>,
126    /// Account ID
127    #[serde(default)]
128    pub id: Option<i64>,
129    /// Account email
130    #[serde(default)]
131    pub email: Option<String>,
132    /// System name
133    #[serde(default)]
134    pub system_name: Option<String>,
135    /// Account username
136    #[serde(default)]
137    pub username: Option<String>,
138    /// Account type (e.g., "main", "subaccount")
139    #[serde(rename = "type", default)]
140    pub account_type: Option<String>,
141    /// Account creation timestamp (milliseconds since UNIX epoch)
142    #[serde(default)]
143    pub creation_timestamp: Option<i64>,
144    /// Referrer ID (affiliation program)
145    #[serde(default)]
146    pub referrer_id: Option<String>,
147    /// Whether login is enabled for this account
148    #[serde(default)]
149    pub login_enabled: Option<bool>,
150    /// Whether security keys are enabled
151    #[serde(default)]
152    pub security_keys_enabled: Option<bool>,
153    /// Whether MMP (Market Maker Protection) is enabled
154    #[serde(default)]
155    pub mmp_enabled: Option<bool>,
156    /// Whether inter-user transfers are enabled
157    #[serde(default)]
158    pub interuser_transfers_enabled: Option<bool>,
159    /// Self-trading reject mode
160    #[serde(default)]
161    pub self_trading_reject_mode: Option<String>,
162    /// Whether self-trading is extended to subaccounts
163    #[serde(default)]
164    pub self_trading_extended_to_subaccounts: Option<bool>,
165    /// Block RFQ self match prevention
166    #[serde(default)]
167    pub block_rfq_self_match_prevention: Option<bool>,
168}
169
170/// Account summary for a single currency.
171///
172/// Contains balance, equity, margin information, and profit/loss data.
173#[derive(Debug, Clone, Serialize, Deserialize)]
174pub struct DeribitAccountSummary {
175    /// Currency code (e.g., "BTC", "ETH")
176    pub currency: Ustr,
177    /// Account equity (balance + unrealized PnL)
178    #[serde(deserialize_with = "deserialize_decimal")]
179    pub equity: Decimal,
180    /// Account balance
181    #[serde(deserialize_with = "deserialize_decimal")]
182    pub balance: Decimal,
183    /// Available funds for trading
184    #[serde(deserialize_with = "deserialize_decimal")]
185    pub available_funds: Decimal,
186    /// Margin balance (for derivatives)
187    #[serde(deserialize_with = "deserialize_decimal")]
188    pub margin_balance: Decimal,
189    /// Initial margin (required for current positions)
190    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
191    pub initial_margin: Option<Decimal>,
192    /// Maintenance margin
193    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
194    pub maintenance_margin: Option<Decimal>,
195    /// Total profit/loss
196    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
197    pub total_pl: Option<Decimal>,
198    /// Session unrealized profit/loss
199    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
200    pub session_upl: Option<Decimal>,
201    /// Session realized profit/loss
202    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
203    pub session_rpl: Option<Decimal>,
204    /// Portfolio margining enabled
205    #[serde(default)]
206    pub portfolio_margining_enabled: Option<bool>,
207}
208
209/// Extended account summary with additional account details.
210///
211/// Returned by `private/get_account_summary` with `extended=true`.
212/// Contains all fields from [`DeribitAccountSummary`] plus account metadata,
213/// position Greeks, detailed margins, and fee structures.
214#[derive(Debug, Clone, Serialize, Deserialize)]
215pub struct DeribitAccountSummaryExtended {
216    /// Currency code (e.g., "BTC", "ETH")
217    pub currency: Ustr,
218    /// Account equity (balance + unrealized PnL)
219    #[serde(deserialize_with = "deserialize_decimal")]
220    pub equity: Decimal,
221    /// Account balance
222    #[serde(deserialize_with = "deserialize_decimal")]
223    pub balance: Decimal,
224    /// Available funds for trading
225    #[serde(deserialize_with = "deserialize_decimal")]
226    pub available_funds: Decimal,
227    /// Margin balance (for derivatives)
228    #[serde(deserialize_with = "deserialize_decimal")]
229    pub margin_balance: Decimal,
230    /// Initial margin (required for current positions)
231    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
232    pub initial_margin: Option<Decimal>,
233    /// Maintenance margin
234    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
235    pub maintenance_margin: Option<Decimal>,
236    /// Total profit/loss
237    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
238    pub total_pl: Option<Decimal>,
239    /// Session unrealized profit/loss
240    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
241    pub session_upl: Option<Decimal>,
242    /// Session realized profit/loss
243    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
244    pub session_rpl: Option<Decimal>,
245    /// Portfolio margining enabled
246    #[serde(default)]
247    pub portfolio_margining_enabled: Option<bool>,
248    // Extended fields below
249    /// Account ID
250    #[serde(default)]
251    pub id: Option<i64>,
252    /// Account email
253    #[serde(default)]
254    pub email: Option<String>,
255    /// Account username
256    #[serde(default)]
257    pub username: Option<String>,
258    /// System name
259    #[serde(default)]
260    pub system_name: Option<String>,
261    /// Account type (e.g., "main", "subaccount")
262    #[serde(rename = "type", default)]
263    pub account_type: Option<String>,
264    /// Futures session unrealized P&L
265    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
266    pub futures_session_upl: Option<Decimal>,
267    /// Futures session realized P&L
268    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
269    pub futures_session_rpl: Option<Decimal>,
270    /// Options session unrealized P&L
271    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
272    pub options_session_upl: Option<Decimal>,
273    /// Options session realized P&L
274    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
275    pub options_session_rpl: Option<Decimal>,
276    /// Futures profit/loss
277    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
278    pub futures_pl: Option<Decimal>,
279    /// Options profit/loss
280    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
281    pub options_pl: Option<Decimal>,
282    /// Options delta
283    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
284    pub options_delta: Option<Decimal>,
285    /// Options gamma
286    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
287    pub options_gamma: Option<Decimal>,
288    /// Options vega
289    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
290    pub options_vega: Option<Decimal>,
291    /// Options theta
292    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
293    pub options_theta: Option<Decimal>,
294    /// Options value
295    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
296    pub options_value: Option<Decimal>,
297    /// Total delta across all positions
298    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
299    pub delta_total: Option<Decimal>,
300    /// Projected delta total
301    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
302    pub projected_delta_total: Option<Decimal>,
303    /// Projected initial margin
304    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
305    pub projected_initial_margin: Option<Decimal>,
306    /// Projected maintenance margin
307    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
308    pub projected_maintenance_margin: Option<Decimal>,
309    /// Estimated liquidation ratio
310    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
311    pub estimated_liquidation_ratio: Option<Decimal>,
312    /// Available withdrawal funds
313    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
314    pub available_withdrawal_funds: Option<Decimal>,
315    /// Spot reserve
316    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
317    pub spot_reserve: Option<Decimal>,
318    /// Fee balance
319    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
320    pub fee_balance: Option<Decimal>,
321    /// Margin model (e.g., "segregated_sm", "cross_pm")
322    #[serde(default)]
323    pub margin_model: Option<String>,
324    /// Cross collateral enabled
325    #[serde(default)]
326    pub cross_collateral_enabled: Option<bool>,
327    /// Account creation timestamp (milliseconds since UNIX epoch)
328    #[serde(default)]
329    pub creation_timestamp: Option<i64>,
330    /// Whether login is enabled for this account
331    #[serde(default)]
332    pub login_enabled: Option<bool>,
333    /// Whether security keys are enabled
334    #[serde(default)]
335    pub security_keys_enabled: Option<bool>,
336    /// Whether MMP (Market Maker Protection) is enabled
337    #[serde(default)]
338    pub mmp_enabled: Option<bool>,
339    /// Whether inter-user transfers are enabled
340    #[serde(default)]
341    pub interuser_transfers_enabled: Option<bool>,
342    /// Self-trading reject mode
343    #[serde(default)]
344    pub self_trading_reject_mode: Option<String>,
345    /// Whether self-trading is extended to subaccounts
346    #[serde(default)]
347    pub self_trading_extended_to_subaccounts: Option<bool>,
348    /// Referrer ID (affiliation program)
349    #[serde(default)]
350    pub referrer_id: Option<String>,
351    /// Block RFQ self match prevention
352    #[serde(default)]
353    pub block_rfq_self_match_prevention: Option<bool>,
354}
355
356/// Deribit public trade data from the market data API.
357///
358/// Represents a single trade returned by `/public/get_last_trades_by_instrument_and_time`
359/// and other trade-related endpoints.
360#[derive(Clone, Debug, Serialize, Deserialize)]
361pub struct DeribitPublicTrade {
362    /// Trade amount. For perpetual and inverse futures the amount is in USD units.
363    /// For options and linear futures it is the underlying base currency coin.
364    #[serde(deserialize_with = "deserialize_decimal")]
365    pub amount: Decimal,
366    /// Trade size in contract units (optional, may be absent in historical trades).
367    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
368    pub contracts: Option<Decimal>,
369    /// Direction of the trade: "buy" or "sell"
370    pub direction: String,
371    /// Index Price at the moment of trade.
372    #[serde(deserialize_with = "deserialize_decimal")]
373    pub index_price: Decimal,
374    /// Unique instrument identifier.
375    pub instrument_name: String,
376    /// Option implied volatility for the price (Option only).
377    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
378    pub iv: Option<Decimal>,
379    /// Optional field (only for trades caused by liquidation).
380    #[serde(default)]
381    pub liquidation: Option<String>,
382    /// Mark Price at the moment of trade.
383    #[serde(deserialize_with = "deserialize_decimal")]
384    pub mark_price: Decimal,
385    /// Price in base currency.
386    #[serde(deserialize_with = "deserialize_decimal")]
387    pub price: Decimal,
388    /// Direction of the "tick" (0 = Plus Tick, 1 = Zero-Plus Tick, 2 = Minus Tick, 3 = Zero-Minus Tick).
389    pub tick_direction: i32,
390    /// The timestamp of the trade (milliseconds since the UNIX epoch).
391    pub timestamp: i64,
392    /// Unique (per currency) trade identifier.
393    pub trade_id: String,
394    /// The sequence number of the trade within instrument.
395    pub trade_seq: i64,
396    /// Block trade id - when trade was part of a block trade.
397    #[serde(default)]
398    pub block_trade_id: Option<String>,
399    /// Block trade leg count - when trade was part of a block trade.
400    #[serde(default)]
401    pub block_trade_leg_count: Option<i32>,
402    /// ID of the Block RFQ - when trade was part of the Block RFQ.
403    #[serde(default)]
404    pub block_rfq_id: Option<i64>,
405    /// Optional field containing combo instrument name if the trade is a combo trade.
406    #[serde(default)]
407    pub combo_id: Option<String>,
408    /// Optional field containing combo trade identifier if the trade is a combo trade.
409    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
410    pub combo_trade_id: Option<Decimal>,
411}
412
413/// Response wrapper for trades endpoints.
414///
415/// Contains the trades array and pagination information.
416#[derive(Clone, Debug, Serialize, Deserialize)]
417pub struct DeribitTradesResponse {
418    /// Whether there are more trades available.
419    pub has_more: bool,
420    /// Array of trade objects.
421    pub trades: Vec<DeribitPublicTrade>,
422}
423
424/// Response from `public/get_tradingview_chart_data` endpoint.
425///
426/// Contains OHLCV data in array format where each array element corresponds
427/// to a single candle at the index in the `ticks` array.
428#[derive(Clone, Debug, Serialize, Deserialize)]
429pub struct DeribitTradingViewChartData {
430    /// List of prices at close (one per candle)
431    pub close: Vec<f64>,
432    /// List of cost bars (volume in quote currency, one per candle)
433    #[serde(default)]
434    pub cost: Vec<f64>,
435    /// List of highest price levels (one per candle)
436    pub high: Vec<f64>,
437    /// List of lowest price levels (one per candle)
438    pub low: Vec<f64>,
439    /// List of prices at open (one per candle)
440    pub open: Vec<f64>,
441    /// Status of the query: "ok" or "no_data"
442    pub status: String,
443    /// Values of the time axis given in milliseconds since UNIX epoch
444    pub ticks: Vec<i64>,
445    /// List of volume bars (in base currency, one per candle)
446    pub volume: Vec<f64>,
447}
448
449/// Response from `public/get_order_book` endpoint.
450///
451/// Contains the current order book state with bids, asks, and market data.
452#[derive(Clone, Debug, Serialize, Deserialize)]
453pub struct DeribitOrderBook {
454    /// The timestamp of the order book (milliseconds since UNIX epoch)
455    pub timestamp: i64,
456    /// Unique instrument identifier
457    pub instrument_name: String,
458    /// List of bids as [price, amount] pairs (kept as f64 for performance)
459    pub bids: Vec<[f64; 2]>,
460    /// List of asks as [price, amount] pairs (kept as f64 for performance)
461    pub asks: Vec<[f64; 2]>,
462    /// The state of the order book: "open" or "closed"
463    pub state: String,
464    /// The current best bid price (null if there aren't any bids)
465    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
466    pub best_bid_price: Option<Decimal>,
467    /// The current best ask price (null if there aren't any asks)
468    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
469    pub best_ask_price: Option<Decimal>,
470    /// The order size of all best bids
471    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
472    pub best_bid_amount: Option<Decimal>,
473    /// The order size of all best asks
474    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
475    pub best_ask_amount: Option<Decimal>,
476    /// The mark price for the instrument
477    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
478    pub mark_price: Option<Decimal>,
479    /// The price for the last trade
480    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
481    pub last_price: Option<Decimal>,
482    /// Current index price
483    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
484    pub index_price: Option<Decimal>,
485    /// The total amount of outstanding contracts
486    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
487    pub open_interest: Option<Decimal>,
488    /// The maximum price for the future
489    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
490    pub max_price: Option<Decimal>,
491    /// The minimum price for the future
492    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
493    pub min_price: Option<Decimal>,
494    /// Current funding (perpetual only)
495    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
496    pub current_funding: Option<Decimal>,
497    /// Funding 8h (perpetual only)
498    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
499    pub funding_8h: Option<Decimal>,
500    /// The settlement price for the instrument (when state = open)
501    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
502    pub settlement_price: Option<Decimal>,
503    /// The settlement/delivery price for the instrument (when state = closed)
504    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
505    pub delivery_price: Option<Decimal>,
506    /// (Only for option) implied volatility for best bid
507    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
508    pub bid_iv: Option<Decimal>,
509    /// (Only for option) implied volatility for best ask
510    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
511    pub ask_iv: Option<Decimal>,
512    /// (Only for option) implied volatility for mark price
513    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
514    pub mark_iv: Option<Decimal>,
515    /// Underlying price for implied volatility calculations (options only)
516    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
517    pub underlying_price: Option<Decimal>,
518    /// Name of the underlying future, or index_price (options only)
519    #[serde(default)]
520    pub underlying_index: Option<serde_json::Value>,
521    /// Interest rate used in implied volatility calculations (options only)
522    #[serde(default, deserialize_with = "deserialize_optional_decimal")]
523    pub interest_rate: Option<Decimal>,
524}
525
526/// Position data from `/private/get_positions` endpoint.
527///
528/// Contains information about a single position in a specific instrument.
529#[derive(Debug, Clone, Serialize, Deserialize)]
530pub struct DeribitPosition {
531    /// Unique instrument identifier
532    pub instrument_name: Ustr,
533    /// Position direction: "buy" (long), "sell" (short), or "zero" (flat)
534    pub direction: String,
535    /// Position size in contracts (positive = long, negative = short)
536    #[serde(
537        serialize_with = "nautilus_core::serialization::serialize_decimal",
538        deserialize_with = "nautilus_core::serialization::deserialize_decimal"
539    )]
540    pub size: Decimal,
541    /// Average entry price
542    #[serde(
543        serialize_with = "nautilus_core::serialization::serialize_decimal",
544        deserialize_with = "nautilus_core::serialization::deserialize_decimal"
545    )]
546    pub average_price: Decimal,
547    /// Current mark price
548    #[serde(
549        serialize_with = "nautilus_core::serialization::serialize_decimal",
550        deserialize_with = "nautilus_core::serialization::deserialize_decimal"
551    )]
552    pub mark_price: Decimal,
553    /// Current index price
554    #[serde(
555        default,
556        serialize_with = "nautilus_core::serialization::serialize_optional_decimal",
557        deserialize_with = "nautilus_core::serialization::deserialize_optional_decimal"
558    )]
559    pub index_price: Option<Decimal>,
560    /// Maintenance margin
561    #[serde(
562        serialize_with = "nautilus_core::serialization::serialize_decimal",
563        deserialize_with = "nautilus_core::serialization::deserialize_decimal"
564    )]
565    pub maintenance_margin: Decimal,
566    /// Initial margin
567    #[serde(
568        serialize_with = "nautilus_core::serialization::serialize_decimal",
569        deserialize_with = "nautilus_core::serialization::deserialize_decimal"
570    )]
571    pub initial_margin: Decimal,
572    /// Leverage used for the position
573    #[serde(default)]
574    pub leverage: Option<i64>,
575    /// Current unrealized profit/loss
576    #[serde(
577        serialize_with = "nautilus_core::serialization::serialize_decimal",
578        deserialize_with = "nautilus_core::serialization::deserialize_decimal"
579    )]
580    pub floating_profit_loss: Decimal,
581    /// Realized profit/loss for this position
582    #[serde(
583        serialize_with = "nautilus_core::serialization::serialize_decimal",
584        deserialize_with = "nautilus_core::serialization::deserialize_decimal"
585    )]
586    pub realized_profit_loss: Decimal,
587    /// Total profit/loss (floating + realized)
588    #[serde(
589        serialize_with = "nautilus_core::serialization::serialize_decimal",
590        deserialize_with = "nautilus_core::serialization::deserialize_decimal"
591    )]
592    pub total_profit_loss: Decimal,
593    /// Product type: future, option, spot, etc.
594    pub kind: DeribitProductType,
595    /// Position size in currency units (for currency-quoted positions)
596    #[serde(
597        default,
598        serialize_with = "nautilus_core::serialization::serialize_optional_decimal",
599        deserialize_with = "nautilus_core::serialization::deserialize_optional_decimal"
600    )]
601    pub size_currency: Option<Decimal>,
602    /// Estimated liquidation price
603    #[serde(
604        default,
605        serialize_with = "nautilus_core::serialization::serialize_optional_decimal",
606        deserialize_with = "nautilus_core::serialization::deserialize_optional_decimal"
607    )]
608    pub estimated_liquidation_price: Option<Decimal>,
609    /// Position delta (for options)
610    #[serde(
611        default,
612        serialize_with = "nautilus_core::serialization::serialize_optional_decimal",
613        deserialize_with = "nautilus_core::serialization::deserialize_optional_decimal"
614    )]
615    pub delta: Option<Decimal>,
616    /// Position gamma (for options)
617    #[serde(
618        default,
619        serialize_with = "nautilus_core::serialization::serialize_optional_decimal",
620        deserialize_with = "nautilus_core::serialization::deserialize_optional_decimal"
621    )]
622    pub gamma: Option<Decimal>,
623    /// Position vega (for options)
624    #[serde(
625        default,
626        serialize_with = "nautilus_core::serialization::serialize_optional_decimal",
627        deserialize_with = "nautilus_core::serialization::deserialize_optional_decimal"
628    )]
629    pub vega: Option<Decimal>,
630    /// Position theta (for options)
631    #[serde(
632        default,
633        serialize_with = "nautilus_core::serialization::serialize_optional_decimal",
634        deserialize_with = "nautilus_core::serialization::deserialize_optional_decimal"
635    )]
636    pub theta: Option<Decimal>,
637    /// Settlement price (if settled)
638    #[serde(
639        default,
640        serialize_with = "nautilus_core::serialization::serialize_optional_decimal",
641        deserialize_with = "nautilus_core::serialization::deserialize_optional_decimal"
642    )]
643    pub settlement_price: Option<Decimal>,
644    /// Open orders margin for this position
645    #[serde(
646        default,
647        serialize_with = "nautilus_core::serialization::serialize_optional_decimal",
648        deserialize_with = "nautilus_core::serialization::deserialize_optional_decimal"
649    )]
650    pub open_orders_margin: Option<Decimal>,
651    /// Average price in USD (for currency-margined contracts)
652    #[serde(
653        default,
654        serialize_with = "nautilus_core::serialization::serialize_optional_decimal",
655        deserialize_with = "nautilus_core::serialization::deserialize_optional_decimal"
656    )]
657    pub average_price_usd: Option<Decimal>,
658    /// Realized profit loss (session)
659    #[serde(
660        default,
661        serialize_with = "nautilus_core::serialization::serialize_optional_decimal",
662        deserialize_with = "nautilus_core::serialization::deserialize_optional_decimal"
663    )]
664    pub realized_profit_loss_session: Option<Decimal>,
665    /// Floating profit loss in USD
666    #[serde(
667        default,
668        serialize_with = "nautilus_core::serialization::serialize_optional_decimal",
669        deserialize_with = "nautilus_core::serialization::deserialize_optional_decimal"
670    )]
671    pub floating_profit_loss_usd: Option<Decimal>,
672}
673
674/// Response wrapper for user trades endpoints.
675///
676/// Contains the trades array and pagination information.
677/// Used by `/private/get_user_trades_by_*` endpoints.
678#[derive(Clone, Debug, Serialize, Deserialize)]
679pub struct DeribitUserTradesResponse {
680    /// Whether there are more trades available.
681    pub has_more: bool,
682    /// Array of user trade objects.
683    pub trades: Vec<crate::websocket::messages::DeribitUserTradeMsg>,
684}