1use crate::ids::InstrumentName;
3use rust_decimal::Decimal;
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
8#[serde(rename_all = "camelCase")]
9pub struct Tag {
10 #[serde(rename = "type", default, skip_serializing_if = "Option::is_none")]
12 pub r#type: Option<String>,
13 #[serde(rename = "name", default, skip_serializing_if = "Option::is_none")]
15 pub name: Option<String>,
16}
17
18provider_enum! {
19 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
21 #[non_exhaustive]
22 pub enum InstrumentType {
23 Currency => "CURRENCY",
25 Cfd => "CFD",
27 Metal => "METAL",
29 ;
30 Unknown(String),
32 }
33}
34
35provider_enum! {
36 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
38 #[non_exhaustive]
39 pub enum DayOfWeek {
40 Sunday => "SUNDAY",
42 Monday => "MONDAY",
44 Tuesday => "TUESDAY",
46 Wednesday => "WEDNESDAY",
48 Thursday => "THURSDAY",
50 Friday => "FRIDAY",
52 Saturday => "SATURDAY",
54 ;
55 Unknown(String),
57 }
58}
59
60#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
62#[serde(rename_all = "camelCase")]
63pub struct FinancingDayOfWeek {
64 #[serde(rename = "dayOfWeek", default, skip_serializing_if = "Option::is_none")]
66 pub day_of_week: Option<DayOfWeek>,
67 #[serde(
69 rename = "daysCharged",
70 default,
71 skip_serializing_if = "Option::is_none"
72 )]
73 pub days_charged: Option<i64>,
74}
75
76#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
78#[serde(rename_all = "camelCase")]
79pub struct InstrumentFinancing {
80 #[serde(rename = "longRate", default, skip_serializing_if = "Option::is_none")]
83 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
84 pub long_rate: Option<Decimal>,
85 #[serde(rename = "shortRate", default, skip_serializing_if = "Option::is_none")]
88 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
89 pub short_rate: Option<Decimal>,
90 #[serde(
93 rename = "financingDaysOfWeek",
94 default,
95 skip_serializing_if = "Option::is_none"
96 )]
97 pub financing_days_of_week: Option<Vec<FinancingDayOfWeek>>,
98}
99
100#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
102#[serde(rename_all = "camelCase")]
103pub struct Instrument {
104 #[serde(rename = "name", default, skip_serializing_if = "Option::is_none")]
106 pub name: Option<InstrumentName>,
107 #[serde(rename = "type", default, skip_serializing_if = "Option::is_none")]
109 pub r#type: Option<InstrumentType>,
110 #[serde(
112 rename = "displayName",
113 default,
114 skip_serializing_if = "Option::is_none"
115 )]
116 pub display_name: Option<String>,
117 #[serde(
121 rename = "pipLocation",
122 default,
123 skip_serializing_if = "Option::is_none"
124 )]
125 pub pip_location: Option<i64>,
126 #[serde(
129 rename = "displayPrecision",
130 default,
131 skip_serializing_if = "Option::is_none"
132 )]
133 pub display_precision: Option<i64>,
134 #[serde(
137 rename = "tradeUnitsPrecision",
138 default,
139 skip_serializing_if = "Option::is_none"
140 )]
141 pub trade_units_precision: Option<i64>,
142 #[serde(
144 rename = "minimumTradeSize",
145 default,
146 skip_serializing_if = "Option::is_none"
147 )]
148 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
149 pub minimum_trade_size: Option<Decimal>,
150 #[serde(
153 rename = "maximumTrailingStopDistance",
154 default,
155 skip_serializing_if = "Option::is_none"
156 )]
157 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
158 pub maximum_trailing_stop_distance: Option<Decimal>,
159 #[serde(
162 rename = "minimumGuaranteedStopLossDistance",
163 default,
164 skip_serializing_if = "Option::is_none"
165 )]
166 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
167 pub minimum_guaranteed_stop_loss_distance: Option<Decimal>,
168 #[serde(
171 rename = "minimumTrailingStopDistance",
172 default,
173 skip_serializing_if = "Option::is_none"
174 )]
175 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
176 pub minimum_trailing_stop_distance: Option<Decimal>,
177 #[serde(
179 rename = "maximumPositionSize",
180 default,
181 skip_serializing_if = "Option::is_none"
182 )]
183 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
184 pub maximum_position_size: Option<Decimal>,
185 #[serde(
187 rename = "maximumOrderUnits",
188 default,
189 skip_serializing_if = "Option::is_none"
190 )]
191 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
192 pub maximum_order_units: Option<Decimal>,
193 #[serde(
195 rename = "marginRate",
196 default,
197 skip_serializing_if = "Option::is_none"
198 )]
199 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
200 pub margin_rate: Option<Decimal>,
201 #[serde(
203 rename = "commission",
204 default,
205 skip_serializing_if = "Option::is_none"
206 )]
207 pub commission: Option<InstrumentCommission>,
208 #[serde(
210 rename = "guaranteedStopLossOrderMode",
211 default,
212 skip_serializing_if = "Option::is_none"
213 )]
214 pub guaranteed_stop_loss_order_mode: Option<GuaranteedStopLossOrderModeForInstrument>,
215 #[serde(
219 rename = "guaranteedStopLossOrderExecutionPremium",
220 default,
221 skip_serializing_if = "Option::is_none"
222 )]
223 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
224 pub guaranteed_stop_loss_order_execution_premium: Option<Decimal>,
225 #[serde(
228 rename = "guaranteedStopLossOrderLevelRestriction",
229 default,
230 skip_serializing_if = "Option::is_none"
231 )]
232 pub guaranteed_stop_loss_order_level_restriction:
233 Option<GuaranteedStopLossOrderLevelRestriction>,
234 #[serde(rename = "financing", default, skip_serializing_if = "Option::is_none")]
236 pub financing: Option<InstrumentFinancing>,
237 #[serde(rename = "tags", default, skip_serializing_if = "Option::is_none")]
239 pub tags: Option<Vec<Tag>>,
240}
241
242provider_enum! {
243 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
247 #[non_exhaustive]
248 pub enum AcceptDatetimeFormat {
249 Unix => "UNIX",
251 Rfc3339 => "RFC3339",
254 ;
255 Unknown(String),
257 }
258}
259
260#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
262#[serde(rename_all = "camelCase")]
263pub struct InstrumentCommission {
264 #[serde(
266 rename = "commission",
267 default,
268 skip_serializing_if = "Option::is_none"
269 )]
270 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
271 pub commission: Option<Decimal>,
272 #[serde(
274 rename = "unitsTraded",
275 default,
276 skip_serializing_if = "Option::is_none"
277 )]
278 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
279 pub units_traded: Option<Decimal>,
280 #[serde(
283 rename = "minimumCommission",
284 default,
285 skip_serializing_if = "Option::is_none"
286 )]
287 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
288 pub minimum_commission: Option<Decimal>,
289}
290
291provider_enum! {
292 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
294 #[non_exhaustive]
295 pub enum GuaranteedStopLossOrderModeForInstrument {
296 Disabled => "DISABLED",
298 Allowed => "ALLOWED",
301 Required => "REQUIRED",
303 ;
304 Unknown(String),
306 }
307}
308
309#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
312#[serde(rename_all = "camelCase")]
313pub struct GuaranteedStopLossOrderLevelRestriction {
314 #[serde(rename = "volume", default, skip_serializing_if = "Option::is_none")]
318 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
319 pub volume: Option<Decimal>,
320 #[serde(
322 rename = "priceRange",
323 default,
324 skip_serializing_if = "Option::is_none"
325 )]
326 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
327 pub price_range: Option<Decimal>,
328}
329
330provider_enum! {
331 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
333 #[non_exhaustive]
334 pub enum Direction {
335 Long => "LONG",
338 Short => "SHORT",
341 ;
342 Unknown(String),
344 }
345}
346
347#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
350#[serde(rename_all = "camelCase")]
351pub struct ConversionFactor {
352 #[serde(rename = "factor", default, skip_serializing_if = "Option::is_none")]
355 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
356 pub factor: Option<Decimal>,
357}
358
359#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
362#[serde(rename_all = "camelCase")]
363pub struct HomeConversionFactors {
364 #[serde(
367 rename = "gainQuoteHome",
368 default,
369 skip_serializing_if = "Option::is_none"
370 )]
371 pub gain_quote_home: Option<ConversionFactor>,
372 #[serde(
375 rename = "lossQuoteHome",
376 default,
377 skip_serializing_if = "Option::is_none"
378 )]
379 pub loss_quote_home: Option<ConversionFactor>,
380 #[serde(
383 rename = "gainBaseHome",
384 default,
385 skip_serializing_if = "Option::is_none"
386 )]
387 pub gain_base_home: Option<ConversionFactor>,
388 #[serde(
391 rename = "lossBaseHome",
392 default,
393 skip_serializing_if = "Option::is_none"
394 )]
395 pub loss_base_home: Option<ConversionFactor>,
396}