Skip to main content

rust_okx/api/account/responses/
risk.rs

1use std::collections::HashMap;
2
3use serde::Deserialize;
4
5use crate::model::NumberString;
6
7/// Account risk state, as returned by `GET /api/v5/account/risk-state`.
8#[derive(Debug, Clone, Deserialize)]
9#[serde(rename_all = "camelCase")]
10#[non_exhaustive]
11pub struct RiskState {
12    /// Account risk status in auto-borrow mode. `true` if the account is
13    /// currently in a specific risk state.
14    #[serde(default)]
15    pub at_risk: bool,
16    /// Derivatives risk unit list.
17    #[serde(default)]
18    pub at_risk_idx: Vec<String>,
19    /// Margin risk unit list.
20    #[serde(default)]
21    pub at_risk_mgn: Vec<String>,
22    /// Timestamp (Unix milliseconds).
23    #[serde(default)]
24    pub ts: NumberString,
25}
26
27/// Simulated margin calculation result.
28#[derive(Debug, Clone, Deserialize)]
29#[serde(rename_all = "camelCase")]
30#[non_exhaustive]
31pub struct SimulatedMargin {
32    /// Initial margin requirement.
33    #[serde(default)]
34    pub imr: NumberString,
35    /// Maintenance margin requirement.
36    #[serde(default)]
37    pub mmr: NumberString,
38    /// Margin ratio.
39    #[serde(default)]
40    pub mr: NumberString,
41    /// Notional value in USD.
42    #[serde(default)]
43    pub notional_usd: NumberString,
44    /// Per-instrument details returned by OKX.
45    #[serde(default)]
46    pub details: Vec<SimulatedMarginDetail>,
47}
48
49/// Per-instrument detail in a simulated margin response.
50#[derive(Debug, Clone, Deserialize)]
51#[serde(rename_all = "camelCase")]
52#[non_exhaustive]
53pub struct SimulatedMarginDetail {
54    /// Instrument ID.
55    #[serde(default)]
56    pub inst_id: String,
57    /// Position size.
58    #[serde(default)]
59    pub pos: NumberString,
60    /// Initial margin requirement.
61    #[serde(default)]
62    pub imr: NumberString,
63    /// Maintenance margin requirement.
64    #[serde(default)]
65    pub mmr: NumberString,
66    /// Unrealized PnL.
67    #[serde(default)]
68    pub upl: NumberString,
69}
70
71/// Account greeks row.
72#[derive(Debug, Clone, Deserialize)]
73#[serde(rename_all = "camelCase")]
74#[non_exhaustive]
75pub struct Greek {
76    /// Currency.
77    #[serde(default)]
78    pub ccy: String,
79    /// Black-Scholes delta.
80    #[serde(rename = "deltaBS", default)]
81    pub delta_bs: NumberString,
82    /// Portfolio-adjusted delta.
83    #[serde(rename = "deltaPA", default)]
84    pub delta_pa: NumberString,
85    /// Black-Scholes gamma.
86    #[serde(rename = "gammaBS", default)]
87    pub gamma_bs: NumberString,
88    /// Black-Scholes theta.
89    #[serde(rename = "thetaBS", default)]
90    pub theta_bs: NumberString,
91    /// Black-Scholes vega.
92    #[serde(rename = "vegaBS", default)]
93    pub vega_bs: NumberString,
94}
95
96/// Account position-tier row.
97#[derive(Debug, Clone, Deserialize)]
98#[serde(rename_all = "camelCase")]
99#[non_exhaustive]
100pub struct AccountPositionTier {
101    /// Underlying. Applicable to `FUTURES`/`SWAP`/`OPTION`.
102    #[serde(default)]
103    pub uly: String,
104    /// Instrument family. Applicable to `FUTURES`/`SWAP`/`OPTION`.
105    #[serde(default)]
106    pub inst_family: String,
107    /// Max number of positions.
108    #[serde(default)]
109    pub max_sz: NumberString,
110    /// Limitation of position type. Only applicable to cross `OPTION` under
111    /// portfolio margin mode.
112    #[serde(default)]
113    pub pos_type: String,
114}
115
116/// Result of setting the spot risk offset amount.
117#[derive(Debug, Clone, Deserialize)]
118#[serde(rename_all = "camelCase")]
119#[non_exhaustive]
120pub struct SetRiskOffsetAmountResult {
121    /// Currency.
122    #[serde(default)]
123    pub ccy: String,
124    /// User-defined spot risk offset amount.
125    #[serde(rename = "clSpotInUseAmt", default)]
126    pub cl_spot_in_use_amt: NumberString,
127}
128
129/// Position-builder result, as returned by
130/// `POST /api/v5/account/position-builder`.
131#[derive(Debug, Clone, Deserialize)]
132#[serde(rename_all = "camelCase")]
133#[non_exhaustive]
134pub struct PositionBuilderResult {
135    /// Adjusted equity (USD) for the account.
136    #[serde(default)]
137    pub eq: NumberString,
138    /// Total MMR (USD) for the account.
139    #[serde(default)]
140    pub total_mmr: NumberString,
141    /// Total IMR (USD) for the account.
142    #[serde(default)]
143    pub total_imr: NumberString,
144    /// Borrow MMR (USD) for the account.
145    #[serde(default)]
146    pub borrow_mmr: NumberString,
147    /// Derivatives MMR (USD) for the account.
148    #[serde(default)]
149    pub deriv_mmr: NumberString,
150    /// Cross maintenance margin ratio for the account.
151    #[serde(default)]
152    pub margin_ratio: NumberString,
153    /// UPL for the account.
154    #[serde(default)]
155    pub upl: NumberString,
156    /// Leverage of the account.
157    #[serde(default)]
158    pub acct_lever: NumberString,
159    /// Update time for the account, Unix timestamp format in milliseconds,
160    /// e.g. `1597026383085`.
161    #[serde(default)]
162    pub ts: NumberString,
163    /// Asset info.
164    #[serde(default)]
165    pub assets: Vec<PositionBuilderAsset>,
166    /// Risk unit info.
167    #[serde(default)]
168    pub risk_unit_data: Vec<PositionBuilderRiskUnit>,
169}
170
171/// Asset info returned by position builder.
172#[derive(Debug, Clone, Deserialize)]
173#[serde(rename_all = "camelCase")]
174#[non_exhaustive]
175pub struct PositionBuilderAsset {
176    /// Currency, e.g. `BTC`.
177    #[serde(default)]
178    pub ccy: String,
179    /// Currency equity.
180    #[serde(default)]
181    pub avail_eq: NumberString,
182    /// Spot in use.
183    #[serde(default)]
184    pub spot_in_use: NumberString,
185    /// Borrowing MMR (USD). (Deprecated)
186    #[serde(default)]
187    pub borrow_mmr: NumberString,
188    /// Borrowing IMR (USD).
189    #[serde(default)]
190    pub borrow_imr: NumberString,
191}
192
193/// Risk unit info returned by position builder.
194#[derive(Debug, Clone, Deserialize)]
195#[serde(rename_all = "camelCase")]
196#[non_exhaustive]
197pub struct PositionBuilderRiskUnit {
198    /// Risk unit, e.g. `BTC`.
199    #[serde(default)]
200    pub risk_unit: String,
201    /// Risk unit MMR before volatility (USD). Returns `""` if users don't
202    /// pass in `idxVol`.
203    #[serde(default)]
204    pub mmr_bf: NumberString,
205    /// Risk unit MMR (USD).
206    #[serde(default)]
207    pub mmr: NumberString,
208    /// Risk unit IMR before volatility (USD). Returns `""` if users don't
209    /// pass in `idxVol`.
210    #[serde(default)]
211    pub imr_bf: NumberString,
212    /// Risk unit IMR (USD).
213    #[serde(default)]
214    pub imr: NumberString,
215    /// Risk unit UPL (USD).
216    #[serde(default)]
217    pub upl: NumberString,
218    /// Stress testing value of spot and volatility (all derivatives, and
219    /// spot trading in spot-derivatives risk offset mode).
220    #[serde(default)]
221    pub mr1: NumberString,
222    /// Stress testing value of time value of money (TVM) (for options).
223    #[serde(default)]
224    pub mr2: NumberString,
225    /// Stress testing value of volatility span (for options).
226    #[serde(default)]
227    pub mr3: NumberString,
228    /// Stress testing value of basis (for all derivatives).
229    #[serde(default)]
230    pub mr4: NumberString,
231    /// Stress testing value of interest rate risk (for options).
232    #[serde(default)]
233    pub mr5: NumberString,
234    /// Stress testing value of extremely volatile markets (for all
235    /// derivatives, and spot trading in spot-derivatives risk offset mode).
236    #[serde(default)]
237    pub mr6: NumberString,
238    /// Stress testing value of position reduction cost (for all derivatives).
239    #[serde(default)]
240    pub mr7: NumberString,
241    /// Borrowing MMR/IMR.
242    #[serde(default)]
243    pub mr8: NumberString,
244    /// USDT-USDC-USD hedge risk.
245    #[serde(default)]
246    pub mr9: NumberString,
247    /// MR1 scenario analysis.
248    #[serde(default)]
249    pub mr1_scenarios: Option<PositionBuilderMr1Scenarios>,
250}
251
252/// MR1 scenario analysis for a risk unit.
253///
254/// Each scenario maps a price volatility ratio (in percentage, e.g. `0.01`
255/// representing 1%) to the P&L under stress tests, measured in USD.
256#[derive(Debug, Clone, Deserialize)]
257#[serde(rename_all = "camelCase")]
258#[non_exhaustive]
259pub struct PositionBuilderMr1Scenarios {
260    /// P&L of stress tests under different price volatility ratios when
261    /// volatility shocks down.
262    #[serde(default)]
263    pub vol_shock_down: HashMap<String, NumberString>,
264    /// P&L of stress tests under different price volatility ratios when
265    /// volatility keeps the same.
266    #[serde(default)]
267    pub vol_same: HashMap<String, NumberString>,
268    /// P&L of stress tests under different price volatility ratios when
269    /// volatility shocks up.
270    #[serde(default)]
271    pub vol_shock_up: HashMap<String, NumberString>,
272}