1use rust_decimal::Decimal;
12use serde::{Deserialize, Serialize};
13
14fn dec_out<S: serde::Serializer>(d: &Decimal, s: S) -> Result<S::Ok, S::Error> {
15 rust_decimal::serde::arbitrary_precision::serialize(d, s)
16}
17
18fn dec_out_opt<S: serde::Serializer>(d: &Option<Decimal>, s: S) -> Result<S::Ok, S::Error> {
19 rust_decimal::serde::arbitrary_precision_option::serialize(d, s)
20}
21
22#[derive(Debug, Clone, Default, Deserialize, Serialize)]
27pub struct SecurityInfo {
28 #[serde(default)]
30 pub symbol: String,
31 #[serde(default)]
33 pub shortname: Option<String>,
34 #[serde(default)]
36 pub description: Option<String>,
37 #[serde(default)]
39 pub exchange: String,
40 #[serde(default)]
42 pub market: Option<String>,
43 #[serde(default, rename = "type")]
45 pub kind: Option<String>,
46 #[serde(default, rename = "lotsize", serialize_with = "dec_out_opt")]
48 pub lot_size: Option<Decimal>,
49 #[serde(default, rename = "facevalue", serialize_with = "dec_out_opt")]
51 pub face_value: Option<Decimal>,
52 #[serde(default, rename = "cfiCode")]
54 pub cfi_code: Option<String>,
55 #[serde(default)]
57 pub cancellation: Option<String>,
58 #[serde(default, rename = "minstep", serialize_with = "dec_out_opt")]
60 pub min_step: Option<Decimal>,
61 #[serde(default, rename = "pricestep", serialize_with = "dec_out_opt")]
63 pub price_step: Option<Decimal>,
64 #[serde(default)]
66 pub currency: Option<String>,
67 #[serde(default, rename = "ISIN")]
69 pub isin: Option<String>,
70 #[serde(default)]
72 pub board: Option<String>,
73 #[serde(default)]
75 pub primary_board: Option<String>,
76 #[serde(default, rename = "tradingStatus")]
78 pub trading_status: Option<i32>,
79 #[serde(default, rename = "tradingStatusInfo")]
81 pub trading_status_info: Option<String>,
82}
83
84#[derive(Debug, Clone, Default, Deserialize, Serialize)]
86pub struct MarketStatus {
87 #[serde(default)]
89 pub code: String,
90 #[serde(default)]
92 pub status: String,
93}
94
95#[derive(Debug, Clone, Deserialize, Serialize)]
99pub struct BookLevel {
100 #[serde(serialize_with = "dec_out")]
102 pub price: Decimal,
103 #[serde(serialize_with = "dec_out")]
105 pub volume: Decimal,
106}
107
108#[derive(Debug, Clone, Default, Deserialize, Serialize)]
111pub struct OrderBook {
112 #[serde(default)]
114 pub bids: Vec<BookLevel>,
115 #[serde(default)]
117 pub asks: Vec<BookLevel>,
118 #[serde(default, alias = "msTimestamp")]
120 pub ms_timestamp: Option<i64>,
121 #[serde(default)]
123 pub existing: Option<bool>,
124}
125
126#[derive(Debug, Clone, Default, Deserialize, Serialize)]
128pub struct Bar {
129 #[serde(default)]
131 pub time: i64,
132 #[serde(default, serialize_with = "dec_out")]
134 pub open: Decimal,
135 #[serde(default, serialize_with = "dec_out")]
137 pub high: Decimal,
138 #[serde(default, serialize_with = "dec_out")]
140 pub low: Decimal,
141 #[serde(default, serialize_with = "dec_out")]
143 pub close: Decimal,
144 #[serde(default, serialize_with = "dec_out")]
146 pub volume: Decimal,
147}
148
149#[derive(Debug, Clone, Default, Deserialize, Serialize)]
151pub struct HistoryResponse {
152 #[serde(default)]
154 pub history: Vec<Bar>,
155 #[serde(default)]
157 pub next: Option<i64>,
158 #[serde(default)]
160 pub prev: Option<i64>,
161}
162
163#[derive(Debug, Clone, Default, Deserialize, Serialize)]
166pub struct MarketTradeRecord {
167 #[serde(default)]
169 pub id: Option<i64>,
170 #[serde(default)]
172 pub orderno: Option<String>,
173 #[serde(default)]
175 pub symbol: Option<String>,
176 #[serde(default)]
178 pub board: Option<String>,
179 #[serde(default, serialize_with = "dec_out")]
181 pub qty: Decimal,
182 #[serde(default, serialize_with = "dec_out")]
184 pub price: Decimal,
185 #[serde(default)]
187 pub time: Option<String>,
188 #[serde(default)]
190 pub timestamp: Option<i64>,
191 #[serde(default)]
193 pub side: Option<String>,
194 #[serde(default)]
196 pub oi: Option<i64>,
197 #[serde(default)]
199 pub existing: Option<bool>,
200}
201
202#[derive(Debug, Clone, Default, Deserialize, Serialize)]
204pub struct AllTradesHistory {
205 #[serde(default)]
207 pub total: Option<i64>,
208 #[serde(default)]
210 pub list: Vec<MarketTradeRecord>,
211}
212
213#[derive(Debug, Clone, Default, Deserialize, Serialize)]
216pub struct QuoteRecord {
217 #[serde(default)]
219 pub symbol: String,
220 #[serde(default)]
222 pub exchange: Option<String>,
223 #[serde(default, serialize_with = "dec_out_opt")]
225 pub last_price: Option<Decimal>,
226 #[serde(default, serialize_with = "dec_out_opt")]
228 pub ask: Option<Decimal>,
229 #[serde(default, serialize_with = "dec_out_opt")]
231 pub bid: Option<Decimal>,
232 #[serde(default, serialize_with = "dec_out_opt")]
234 pub ask_vol: Option<Decimal>,
235 #[serde(default, serialize_with = "dec_out_opt")]
237 pub bid_vol: Option<Decimal>,
238 #[serde(default)]
240 pub ob_ms_timestamp: Option<i64>,
241 #[serde(default, serialize_with = "dec_out_opt")]
243 pub lotsize: Option<Decimal>,
244}
245
246#[derive(Debug, Clone, Default, Deserialize, Serialize)]
251pub struct OrderRecord {
252 #[serde(default)]
254 pub id: String,
255 #[serde(default)]
257 pub symbol: String,
258 #[serde(default)]
260 pub board: Option<String>,
261 #[serde(default)]
263 pub exchange: Option<String>,
264 #[serde(default)]
266 pub portfolio: Option<String>,
267 #[serde(default)]
269 pub comment: Option<String>,
270 #[serde(default, rename = "type")]
272 pub kind: Option<String>,
273 #[serde(default)]
275 pub side: Option<String>,
276 #[serde(default)]
278 pub status: Option<String>,
279 #[serde(default, rename = "transTime")]
281 pub trans_time: Option<String>,
282 #[serde(default, rename = "updateTime")]
284 pub update_time: Option<String>,
285 #[serde(default, rename = "qtyUnits", serialize_with = "dec_out_opt")]
287 pub qty_units: Option<Decimal>,
288 #[serde(default, serialize_with = "dec_out_opt")]
290 pub qty: Option<Decimal>,
291 #[serde(default, rename = "filledQtyUnits", serialize_with = "dec_out_opt")]
293 pub filled_qty_units: Option<Decimal>,
294 #[serde(default, serialize_with = "dec_out_opt")]
296 pub filled: Option<Decimal>,
297 #[serde(default, serialize_with = "dec_out_opt")]
299 pub price: Option<Decimal>,
300 #[serde(default, rename = "timeInForce")]
303 pub time_in_force: Option<String>,
304 #[serde(default)]
306 pub existing: Option<bool>,
307}
308
309#[derive(Debug, Clone, Default, Deserialize, Serialize)]
312pub struct StopOrderRecord {
313 #[serde(default)]
315 pub id: String,
316 #[serde(default, rename = "exchangeOrderId")]
318 pub exchange_order_id: Option<String>,
319 #[serde(default)]
321 pub symbol: String,
322 #[serde(default)]
324 pub board: Option<String>,
325 #[serde(default)]
327 pub exchange: Option<String>,
328 #[serde(default)]
330 pub portfolio: Option<String>,
331 #[serde(default)]
333 pub comment: Option<String>,
334 #[serde(default, rename = "type")]
336 pub kind: Option<String>,
337 #[serde(default)]
339 pub side: Option<String>,
340 #[serde(default)]
342 pub condition: Option<String>,
343 #[serde(default)]
345 pub status: Option<String>,
346 #[serde(default, rename = "transTime")]
348 pub trans_time: Option<String>,
349 #[serde(default, rename = "endTime")]
351 pub end_time: Option<String>,
352 #[serde(default)]
354 pub error: Option<String>,
355 #[serde(default, rename = "qtyUnits", serialize_with = "dec_out_opt")]
357 pub qty_units: Option<Decimal>,
358 #[serde(default, serialize_with = "dec_out_opt")]
360 pub qty: Option<Decimal>,
361 #[serde(default, serialize_with = "dec_out_opt")]
363 pub price: Option<Decimal>,
364 #[serde(default, rename = "stopPrice", serialize_with = "dec_out_opt")]
366 pub stop_price: Option<Decimal>,
367 #[serde(default)]
369 pub existing: Option<bool>,
370}
371
372#[derive(Debug, Clone, Default, Deserialize, Serialize)]
375pub struct TradeRecord {
376 #[serde(default)]
378 pub id: String,
379 #[serde(default)]
381 pub orderno: Option<String>,
382 #[serde(default)]
384 pub comment: Option<String>,
385 #[serde(default)]
387 pub symbol: String,
388 #[serde(default)]
390 pub exchange: Option<String>,
391 #[serde(default)]
393 pub date: Option<String>,
394 #[serde(default)]
396 pub board: Option<String>,
397 #[serde(default, rename = "qtyUnits", serialize_with = "dec_out_opt")]
399 pub qty_units: Option<Decimal>,
400 #[serde(default, serialize_with = "dec_out_opt")]
402 pub qty: Option<Decimal>,
403 #[serde(default, serialize_with = "dec_out")]
405 pub price: Decimal,
406 #[serde(default)]
408 pub side: Option<String>,
409 #[serde(default, serialize_with = "dec_out_opt")]
411 pub commission: Option<Decimal>,
412 #[serde(default)]
414 pub existing: Option<bool>,
415}
416
417#[derive(Debug, Clone, Default, Deserialize, Serialize)]
420pub struct PositionRecord {
421 #[serde(default)]
423 pub symbol: String,
424 #[serde(default)]
426 pub exchange: Option<String>,
427 #[serde(default)]
429 pub portfolio: Option<String>,
430 #[serde(default, rename = "avgPrice", serialize_with = "dec_out_opt")]
432 pub avg_price: Option<Decimal>,
433 #[serde(default, rename = "qtyUnits", serialize_with = "dec_out_opt")]
435 pub qty_units: Option<Decimal>,
436 #[serde(default, rename = "lotSize", serialize_with = "dec_out_opt")]
438 pub lot_size: Option<Decimal>,
439 #[serde(default, serialize_with = "dec_out_opt")]
441 pub qty: Option<Decimal>,
442 #[serde(default, rename = "isCurrency")]
444 pub is_currency: Option<bool>,
445 #[serde(default, rename = "unrealisedPl", serialize_with = "dec_out_opt")]
447 pub unrealised_pl: Option<Decimal>,
448 #[serde(default, rename = "currentVolume", serialize_with = "dec_out_opt")]
450 pub current_volume: Option<Decimal>,
451 #[serde(default)]
453 pub existing: Option<bool>,
454}
455
456#[derive(Debug, Clone, Default, Deserialize, Serialize)]
458pub struct BuyingPowerByCurrency {
459 #[serde(default)]
461 pub currency: String,
462 #[serde(default, rename = "buyingPower", serialize_with = "dec_out_opt")]
464 pub buying_power: Option<Decimal>,
465}
466
467#[derive(Debug, Clone, Default, Deserialize, Serialize)]
470pub struct SummaryRecord {
471 #[serde(default, rename = "buyingPower", serialize_with = "dec_out_opt")]
473 pub buying_power: Option<Decimal>,
474 #[serde(
476 default,
477 rename = "portfolioEvaluation",
478 serialize_with = "dec_out_opt"
479 )]
480 pub portfolio_evaluation: Option<Decimal>,
481 #[serde(default, serialize_with = "dec_out_opt")]
483 pub commission: Option<Decimal>,
484 #[serde(default, rename = "buyingPowerByCurrency")]
486 pub buying_power_by_currency: Vec<BuyingPowerByCurrency>,
487}
488
489#[derive(Debug, Clone, Serialize, Deserialize)]
493pub struct InstrumentRef {
494 pub symbol: String,
496 pub exchange: String,
498 #[serde(rename = "instrumentGroup", skip_serializing_if = "Option::is_none")]
500 pub instrument_group: Option<String>,
501}
502
503#[derive(Debug, Clone, Serialize, Deserialize)]
505pub struct UserRef {
506 pub portfolio: String,
508}
509
510#[derive(Debug, Clone, Serialize)]
512pub struct LimitOrderRequest {
513 pub side: String,
515 pub quantity: i64,
517 #[serde(serialize_with = "dec_out")]
519 pub price: Decimal,
520 pub instrument: InstrumentRef,
522 pub user: UserRef,
524 #[serde(skip_serializing_if = "Option::is_none")]
526 pub comment: Option<String>,
527 #[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
530 pub time_in_force: Option<String>,
531 #[serde(rename = "allowMargin", skip_serializing_if = "Option::is_none")]
533 pub allow_margin: Option<bool>,
534 #[serde(rename = "icebergFixed", skip_serializing_if = "Option::is_none")]
536 pub iceberg_fixed: Option<i64>,
537 #[serde(rename = "icebergVariance", skip_serializing_if = "Option::is_none")]
539 pub iceberg_variance: Option<i64>,
540}
541
542#[derive(Debug, Clone, Serialize)]
544pub struct MarketOrderRequest {
545 pub side: String,
547 pub quantity: i64,
549 pub instrument: InstrumentRef,
551 pub user: UserRef,
553 #[serde(skip_serializing_if = "Option::is_none")]
555 pub comment: Option<String>,
556 #[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
558 pub time_in_force: Option<String>,
559 #[serde(rename = "allowMargin", skip_serializing_if = "Option::is_none")]
561 pub allow_margin: Option<bool>,
562}
563
564#[derive(Debug, Clone, Serialize)]
568pub struct StopOrderRequest {
569 pub side: String,
571 pub condition: String,
573 #[serde(rename = "triggerPrice", serialize_with = "dec_out")]
575 pub trigger_price: Decimal,
576 #[serde(rename = "stopEndUnixTime", skip_serializing_if = "Option::is_none")]
578 pub stop_end_unix_time: Option<i64>,
579 #[serde(
581 skip_serializing_if = "Option::is_none",
582 serialize_with = "dec_out_opt"
583 )]
584 pub price: Option<Decimal>,
585 pub quantity: i64,
587 pub instrument: InstrumentRef,
589 pub user: UserRef,
591 #[serde(skip_serializing_if = "Option::is_none")]
593 pub comment: Option<String>,
594 #[serde(rename = "timeInForce", skip_serializing_if = "Option::is_none")]
596 pub time_in_force: Option<String>,
597 #[serde(rename = "allowMargin", skip_serializing_if = "Option::is_none")]
599 pub allow_margin: Option<bool>,
600 #[serde(skip_serializing_if = "Option::is_none")]
602 pub activate: Option<bool>,
603}
604
605#[derive(Debug, Clone, Default, Deserialize, Serialize)]
607pub struct OrderCommandResponse {
608 #[serde(default)]
610 pub message: Option<String>,
611 #[serde(default, rename = "orderNumber")]
613 pub order_number: Option<String>,
614}