dceapi_rs/
models.rs

1//! Data models for the DCE API.
2//!
3//! This module contains all request and response structures used by the API.
4
5use serde::{Deserialize, Deserializer, Serialize};
6use serde_json::Value;
7
8/// Helper function to deserialize a nullable string as an empty string.
9fn deserialize_nullable_string<'de, D>(deserializer: D) -> Result<String, D::Error>
10where
11    D: Deserializer<'de>,
12{
13    let opt: Option<String> = Option::deserialize(deserializer)?;
14    Ok(opt.unwrap_or_default())
15}
16
17// ============================================================================
18// Common Response Models
19// ============================================================================
20
21/// API common response wrapper.
22#[derive(Debug, Clone, Deserialize)]
23pub struct ApiResponse {
24    /// Response code.
25    pub code: i32,
26    /// Response message (field name is "msg" in the API).
27    #[serde(alias = "message", default)]
28    pub msg: String,
29    /// Response data (raw JSON).
30    #[serde(default)]
31    pub data: Value,
32}
33
34/// Token response from authentication endpoint.
35#[derive(Debug, Clone, Deserialize)]
36#[serde(rename_all = "camelCase")]
37pub struct TokenResponse {
38    /// Token type (e.g., "Bearer").
39    pub token_type: String,
40    /// Access token.
41    #[serde(rename = "token")]
42    pub access_token: String,
43    /// Token expiry time in seconds.
44    pub expires_in: i32,
45}
46
47// ============================================================================
48// News/Article Models (资讯数据模型)
49// ============================================================================
50
51/// Article information.
52#[derive(Debug, Clone, Serialize, Deserialize)]
53#[serde(rename_all = "camelCase")]
54pub struct Article {
55    /// Article ID.
56    #[serde(default, deserialize_with = "deserialize_nullable_string")]
57    pub id: String,
58    /// Article title.
59    #[serde(default, deserialize_with = "deserialize_nullable_string")]
60    pub title: String,
61    /// Article subtitle.
62    #[serde(default, deserialize_with = "deserialize_nullable_string")]
63    pub sub_title: String,
64    /// Article summary.
65    #[serde(
66        rename = "infoSummary",
67        default,
68        deserialize_with = "deserialize_nullable_string"
69    )]
70    pub summary: String,
71    /// Display date.
72    #[serde(default, deserialize_with = "deserialize_nullable_string")]
73    pub show_date: String,
74    /// Creation date.
75    #[serde(default, deserialize_with = "deserialize_nullable_string")]
76    pub create_date: String,
77    /// Article content.
78    #[serde(default, deserialize_with = "deserialize_nullable_string")]
79    pub content: String,
80    /// Keywords.
81    #[serde(default, deserialize_with = "deserialize_nullable_string")]
82    pub keywords: String,
83    /// Page name.
84    #[serde(default, deserialize_with = "deserialize_nullable_string")]
85    pub page_name: String,
86}
87
88/// Article detail (same as Article).
89pub type ArticleDetail = Article;
90
91/// Request for paginated article list.
92#[derive(Debug, Clone, Serialize)]
93#[serde(rename_all = "camelCase")]
94pub struct GetArticleByPageRequest {
95    /// Column ID (e.g., "244" for announcements).
96    pub column_id: String,
97    /// Page number (1-indexed).
98    pub page_no: i32,
99    /// Page size.
100    pub page_size: i32,
101    /// Site ID. Defaults to 5.
102    pub site_id: i32,
103}
104
105/// Response for paginated article list.
106#[derive(Debug, Clone, Deserialize)]
107#[serde(rename_all = "camelCase")]
108pub struct GetArticleByPageResponse {
109    /// Column ID.
110    pub column_id: String,
111    /// Total count of articles.
112    pub total_count: i32,
113    /// List of articles.
114    pub result_list: Vec<Article>,
115}
116
117// ============================================================================
118// Common Data Models (通用数据模型)
119// ============================================================================
120
121/// Trade date information.
122#[derive(Debug, Clone, Deserialize)]
123#[serde(rename_all = "camelCase")]
124pub struct TradeDate {
125    /// Trade date string.
126    #[serde(
127        rename = "tradeDate",
128        default,
129        deserialize_with = "deserialize_nullable_string"
130    )]
131    pub date: String,
132}
133
134/// Variety (commodity) information.
135#[derive(Debug, Clone, Deserialize)]
136#[serde(rename_all = "camelCase")]
137pub struct Variety {
138    /// Variety code/ID.
139    #[serde(
140        rename = "varietyId",
141        default,
142        deserialize_with = "deserialize_nullable_string"
143    )]
144    pub code: String,
145    /// Variety name in Chinese.
146    #[serde(
147        rename = "varietyName",
148        default,
149        deserialize_with = "deserialize_nullable_string"
150    )]
151    pub name: String,
152    /// Variety name in English.
153    #[serde(
154        rename = "varietyEnglishName",
155        default,
156        deserialize_with = "deserialize_nullable_string"
157    )]
158    pub english_name: String,
159    /// Picture URL.
160    #[serde(default, deserialize_with = "deserialize_nullable_string")]
161    pub pic: String,
162    /// Variety type.
163    #[serde(
164        rename = "varietyType",
165        default,
166        deserialize_with = "deserialize_nullable_string"
167    )]
168    pub variety_type: String,
169}
170
171// ============================================================================
172// Market Data Models (行情数据模型)
173// ============================================================================
174
175/// Quote data for a contract.
176#[derive(Debug, Clone, Deserialize)]
177#[serde(rename_all = "camelCase")]
178pub struct Quote {
179    /// Variety code.
180    #[serde(default, deserialize_with = "deserialize_nullable_string")]
181    pub variety: String,
182    /// Contract ID.
183    #[serde(
184        rename = "contractId",
185        default,
186        deserialize_with = "deserialize_nullable_string"
187    )]
188    pub contract_id: String,
189    /// Delivery month (for night quotes).
190    #[serde(
191        rename = "delivMonth",
192        default,
193        deserialize_with = "deserialize_nullable_string"
194    )]
195    pub deliv_month: String,
196    /// Open price.
197    #[serde(default, deserialize_with = "deserialize_nullable_string")]
198    pub open: String,
199    /// High price.
200    #[serde(default, deserialize_with = "deserialize_nullable_string")]
201    pub high: String,
202    /// Low price.
203    #[serde(default, deserialize_with = "deserialize_nullable_string")]
204    pub low: String,
205    /// Close price.
206    #[serde(default, deserialize_with = "deserialize_nullable_string")]
207    pub close: String,
208    /// Last clearing price.
209    #[serde(
210        rename = "lastClear",
211        default,
212        deserialize_with = "deserialize_nullable_string"
213    )]
214    pub last_clear: String,
215    /// Last price (for night quotes).
216    #[serde(
217        rename = "lastPrice",
218        default,
219        deserialize_with = "deserialize_nullable_string"
220    )]
221    pub last_price: String,
222    /// Clearing/settlement price.
223    #[serde(
224        rename = "clearPrice",
225        default,
226        deserialize_with = "deserialize_nullable_string"
227    )]
228    pub clear_price: String,
229    /// Price difference.
230    #[serde(default, deserialize_with = "deserialize_nullable_string")]
231    pub diff: String,
232    /// Price difference 1.
233    #[serde(default, deserialize_with = "deserialize_nullable_string")]
234    pub diff1: String,
235    /// Volume.
236    #[serde(rename = "volumn", default)]
237    pub volume: i64,
238    /// Open interest.
239    #[serde(rename = "openInterest", default)]
240    pub open_interest: i64,
241    /// Open interest difference.
242    #[serde(rename = "diffI", default)]
243    pub diff_i: i64,
244    /// Turnover.
245    #[serde(default, deserialize_with = "deserialize_nullable_string")]
246    pub turnover: String,
247}
248
249/// Request for day/night quotes.
250#[derive(Debug, Clone, Serialize)]
251#[serde(rename_all = "camelCase")]
252pub struct QuotesRequest {
253    /// Variety ID.
254    #[serde(skip_serializing_if = "Option::is_none")]
255    pub variety_id: Option<String>,
256    /// Variety code (for night quotes).
257    #[serde(skip_serializing_if = "Option::is_none")]
258    pub variety: Option<String>,
259    /// Trade date (YYYYMMDD format).
260    pub trade_date: String,
261    /// Trade type ("1" = futures, "2" = options).
262    pub trade_type: String,
263    /// Language.
264    #[serde(skip_serializing_if = "Option::is_none")]
265    pub lang: Option<String>,
266    /// Statistics type for options: 0=contract, 1=series, 2=variety.
267    #[serde(skip_serializing_if = "Option::is_none")]
268    pub statistics_type: Option<i32>,
269}
270
271/// Request for weekly quotes.
272#[derive(Debug, Clone, Serialize)]
273#[serde(rename_all = "camelCase")]
274pub struct WeekQuotesRequest {
275    /// Variety code.
276    pub variety_code: String,
277    /// Year.
278    pub year: i32,
279    /// Week number.
280    pub week: i32,
281}
282
283/// Request for monthly quotes.
284#[derive(Debug, Clone, Serialize)]
285#[serde(rename_all = "camelCase")]
286pub struct MonthQuotesRequest {
287    /// Variety code.
288    pub variety_code: String,
289    /// Year.
290    pub year: i32,
291    /// Month.
292    pub month: i32,
293}
294
295/// Request for contract statistics.
296#[derive(Debug, Clone, Serialize)]
297#[serde(rename_all = "camelCase")]
298pub struct ContractStatRequest {
299    /// Contract code.
300    pub contract_code: String,
301    /// Start date.
302    pub start_date: String,
303    /// End date.
304    pub end_date: String,
305}
306
307/// Contract statistics response.
308#[derive(Debug, Clone, Deserialize)]
309#[serde(rename_all = "camelCase")]
310pub struct ContractStat {
311    /// Contract code.
312    pub contract_code: String,
313    /// Total volume.
314    pub total_volume: i64,
315    /// Average price.
316    pub avg_price: f64,
317}
318
319// ============================================================================
320// Delivery Data Models (交割数据模型)
321// ============================================================================
322
323/// Delivery data.
324#[derive(Debug, Clone, Deserialize)]
325#[serde(rename_all = "camelCase")]
326pub struct DeliveryData {
327    /// Variety code.
328    #[serde(default, deserialize_with = "deserialize_nullable_string")]
329    pub variety_code: String,
330    /// Delivery month.
331    #[serde(default, deserialize_with = "deserialize_nullable_string")]
332    pub delivery_month: String,
333    /// Delivery volume.
334    pub delivery_volume: i64,
335    /// Delivery amount.
336    pub delivery_amount: f64,
337}
338
339/// Request for delivery data.
340#[derive(Debug, Clone, Serialize)]
341#[serde(rename_all = "camelCase")]
342pub struct DeliveryDataRequest {
343    /// Variety code.
344    pub variety_code: String,
345    /// Trade date.
346    pub trade_date: String,
347}
348
349/// Delivery match data.
350#[derive(Debug, Clone, Deserialize)]
351#[serde(rename_all = "camelCase")]
352pub struct DeliveryMatch {
353    /// Variety code.
354    #[serde(default, deserialize_with = "deserialize_nullable_string")]
355    pub variety_code: String,
356    /// Buy member.
357    #[serde(default, deserialize_with = "deserialize_nullable_string")]
358    pub buy_member: String,
359    /// Sell member.
360    #[serde(default, deserialize_with = "deserialize_nullable_string")]
361    pub sell_member: String,
362    /// Volume.
363    pub volume: i64,
364}
365
366/// Request for delivery match data.
367#[derive(Debug, Clone, Serialize)]
368#[serde(rename_all = "camelCase")]
369pub struct DeliveryMatchRequest {
370    /// Variety code.
371    pub variety_code: String,
372    /// Trade date.
373    pub trade_date: String,
374}
375
376/// Warehouse receipt data.
377#[derive(Debug, Clone, Deserialize)]
378#[serde(rename_all = "camelCase")]
379pub struct WarehouseReceipt {
380    /// Variety code.
381    #[serde(default, deserialize_with = "deserialize_nullable_string")]
382    pub variety_code: String,
383    /// Warehouse name.
384    #[serde(default, deserialize_with = "deserialize_nullable_string")]
385    pub warehouse_name: String,
386    /// Quantity.
387    pub quantity: i64,
388    /// Trade date.
389    #[serde(default, deserialize_with = "deserialize_nullable_string")]
390    pub trade_date: String,
391}
392
393/// Request for warehouse receipt data.
394#[derive(Debug, Clone, Serialize)]
395#[serde(rename_all = "camelCase")]
396pub struct WarehouseReceiptRequest {
397    /// Variety code.
398    pub variety_code: String,
399    /// Trade date.
400    pub trade_date: String,
401}
402
403/// Delivery cost data.
404#[derive(Debug, Clone, Deserialize)]
405#[serde(rename_all = "camelCase")]
406pub struct DeliveryCost {
407    /// Variety code.
408    #[serde(default, deserialize_with = "deserialize_nullable_string")]
409    pub variety_code: String,
410    /// Delivery fee.
411    pub delivery_fee: f64,
412    /// Inspection fee.
413    pub inspection_fee: f64,
414    /// Storage fee.
415    pub storage_fee: f64,
416}
417
418/// Warehouse premium data.
419#[derive(Debug, Clone, Deserialize)]
420#[serde(rename_all = "camelCase")]
421pub struct WarehousePremium {
422    /// Variety code.
423    #[serde(default, deserialize_with = "deserialize_nullable_string")]
424    pub variety_code: String,
425    /// Warehouse name.
426    #[serde(default, deserialize_with = "deserialize_nullable_string")]
427    pub warehouse_name: String,
428    /// Premium amount.
429    pub premium: f64,
430}
431
432// ============================================================================
433// Member Data Models (会员数据模型)
434// ============================================================================
435
436/// Ranking data entry.
437#[derive(Debug, Clone, Deserialize)]
438#[serde(rename_all = "camelCase")]
439pub struct Ranking {
440    /// Rank position.
441    #[serde(default, deserialize_with = "deserialize_nullable_string")]
442    pub rank: String,
443    /// Volume member abbreviation.
444    #[serde(
445        rename = "qtyAbbr",
446        default,
447        deserialize_with = "deserialize_nullable_string"
448    )]
449    pub qty_abbr: String,
450    /// Today's volume.
451    #[serde(rename = "todayQty", default)]
452    pub today_qty: i64,
453    /// Volume change.
454    #[serde(rename = "qtySub", default)]
455    pub qty_sub: i64,
456    /// Buy member abbreviation.
457    #[serde(
458        rename = "buyAbbr",
459        default,
460        deserialize_with = "deserialize_nullable_string"
461    )]
462    pub buy_abbr: String,
463    /// Today's buy quantity.
464    #[serde(rename = "todayBuyQty", default)]
465    pub today_buy_qty: i64,
466    /// Buy quantity change.
467    #[serde(rename = "buySub", default)]
468    pub buy_sub: i64,
469    /// Sell member abbreviation.
470    #[serde(
471        rename = "sellAbbr",
472        default,
473        deserialize_with = "deserialize_nullable_string"
474    )]
475    pub sell_abbr: String,
476    /// Today's sell quantity.
477    #[serde(rename = "todaySellQty", default)]
478    pub today_sell_qty: i64,
479    /// Sell quantity change.
480    #[serde(rename = "sellSub", default)]
481    pub sell_sub: i64,
482}
483
484/// Request for daily ranking.
485#[derive(Debug, Clone, Serialize)]
486#[serde(rename_all = "camelCase")]
487pub struct DailyRankingRequest {
488    /// Variety ID.
489    pub variety_id: String,
490    /// Contract ID.
491    pub contract_id: String,
492    /// Trade date.
493    pub trade_date: String,
494    /// Trade type ("1" = futures, "2" = options).
495    pub trade_type: String,
496}
497
498/// Response for daily ranking.
499#[derive(Debug, Clone, Deserialize)]
500#[serde(rename_all = "camelCase")]
501pub struct DailyRankingResponse {
502    /// Contract ID.
503    #[serde(
504        rename = "contractId",
505        default,
506        deserialize_with = "deserialize_nullable_string"
507    )]
508    pub contract_id: String,
509    /// Today's total volume.
510    #[serde(rename = "todayQty", default)]
511    pub today_qty: i64,
512    /// Volume change.
513    #[serde(rename = "qtySub", default)]
514    pub qty_sub: i64,
515    /// Today's buy quantity.
516    #[serde(rename = "todayBuyQty", default)]
517    pub today_buy_qty: i64,
518    /// Buy quantity change.
519    #[serde(rename = "buySub", default)]
520    pub buy_sub: i64,
521    /// Today's sell quantity.
522    #[serde(rename = "todaySellQty", default)]
523    pub today_sell_qty: i64,
524    /// Sell quantity change.
525    #[serde(rename = "sellSub", default)]
526    pub sell_sub: i64,
527    /// Volume ranking list.
528    #[serde(rename = "qtyFutureList", default)]
529    pub qty_future_list: Vec<Ranking>,
530    /// Buy ranking list.
531    #[serde(rename = "buyFutureList", default)]
532    pub buy_future_list: Vec<Ranking>,
533    /// Sell ranking list.
534    #[serde(rename = "sellFutureList", default)]
535    pub sell_future_list: Vec<Ranking>,
536}
537
538/// Request for phase ranking.
539#[derive(Debug, Clone, Serialize)]
540#[serde(rename_all = "camelCase")]
541pub struct PhaseRankingRequest {
542    /// Variety code.
543    pub variety: String,
544    /// Start month.
545    pub start_month: String,
546    /// End month.
547    pub end_month: String,
548    /// Trade type.
549    pub trade_type: String,
550}
551
552/// Phase ranking data.
553#[derive(Debug, Clone, Deserialize)]
554#[serde(rename_all = "camelCase")]
555pub struct PhaseRanking {
556    /// Sequence number.
557    #[serde(default, deserialize_with = "deserialize_nullable_string")]
558    pub seq: String,
559    /// Member ID.
560    #[serde(
561        rename = "memberId",
562        default,
563        deserialize_with = "deserialize_nullable_string"
564    )]
565    pub member_id: String,
566    /// Member name.
567    #[serde(
568        rename = "memberName",
569        default,
570        deserialize_with = "deserialize_nullable_string"
571    )]
572    pub member_name: String,
573    /// Monthly volume.
574    #[serde(rename = "monthQty", default)]
575    pub month_qty: f64,
576    /// Volume ratio.
577    #[serde(rename = "qtyRatio", default)]
578    pub qty_ratio: f64,
579    /// Monthly amount.
580    #[serde(rename = "monthAmt", default)]
581    pub month_amt: f64,
582    /// Amount ratio.
583    #[serde(rename = "amtRatio", default)]
584    pub amt_ratio: f64,
585}
586
587// ============================================================================
588// Trade Parameter Models (交易参数数据模型)
589// ============================================================================
590
591/// Trade parameter data.
592#[derive(Debug, Clone, Deserialize)]
593#[serde(rename_all = "camelCase")]
594pub struct TradeParam {
595    /// Contract ID.
596    #[serde(
597        rename = "contractId",
598        default,
599        deserialize_with = "deserialize_nullable_string"
600    )]
601    pub contract_id: String,
602    /// Speculative buy margin rate.
603    #[serde(rename = "specBuyRate", default)]
604    pub spec_buy_rate: f64,
605    /// Speculative buy margin.
606    #[serde(rename = "specBuy", default)]
607    pub spec_buy: f64,
608    /// Hedge buy margin rate.
609    #[serde(rename = "hedgeBuyRate", default)]
610    pub hedge_buy_rate: f64,
611    /// Hedge buy margin.
612    #[serde(rename = "hedgeBuy", default)]
613    pub hedge_buy: f64,
614    /// Rise limit rate.
615    #[serde(rename = "riseLimitRate", default)]
616    pub rise_limit_rate: f64,
617    /// Rise limit price.
618    #[serde(rename = "riseLimit", default)]
619    pub rise_limit: f64,
620    /// Fall limit price.
621    #[serde(rename = "fallLimit", default)]
622    pub fall_limit: f64,
623    /// Trade date.
624    #[serde(
625        rename = "tradeDate",
626        default,
627        deserialize_with = "deserialize_nullable_string"
628    )]
629    pub trade_date: String,
630}
631
632/// Request for day trade parameters.
633#[derive(Debug, Clone, Serialize)]
634#[serde(rename_all = "camelCase")]
635pub struct DayTradeParamRequest {
636    /// Variety ID.
637    pub variety_id: String,
638    /// Trade type.
639    pub trade_type: String,
640    /// Language.
641    pub lang: String,
642}
643
644/// Contract information.
645#[derive(Debug, Clone, Deserialize)]
646#[serde(rename_all = "camelCase")]
647pub struct ContractInfo {
648    /// Contract ID.
649    #[serde(
650        rename = "contractId",
651        default,
652        deserialize_with = "deserialize_nullable_string"
653    )]
654    pub contract_id: String,
655    /// Variety code.
656    #[serde(default, deserialize_with = "deserialize_nullable_string")]
657    pub variety: String,
658    /// Variety order.
659    #[serde(
660        rename = "varietyOrder",
661        default,
662        deserialize_with = "deserialize_nullable_string"
663    )]
664    pub variety_order: String,
665    /// Contract unit.
666    #[serde(default)]
667    pub unit: i32,
668    /// Minimum tick.
669    #[serde(default, deserialize_with = "deserialize_nullable_string")]
670    pub tick: String,
671    /// Start trade date.
672    #[serde(
673        rename = "startTradeDate",
674        default,
675        deserialize_with = "deserialize_nullable_string"
676    )]
677    pub start_trade_date: String,
678    /// End trade date.
679    #[serde(
680        rename = "endTradeDate",
681        default,
682        deserialize_with = "deserialize_nullable_string"
683    )]
684    pub end_trade_date: String,
685    /// End delivery date.
686    #[serde(
687        rename = "endDeliveryDate",
688        default,
689        deserialize_with = "deserialize_nullable_string"
690    )]
691    pub end_delivery_date: String,
692    /// Trade type.
693    #[serde(
694        rename = "tradeType",
695        default,
696        deserialize_with = "deserialize_nullable_string"
697    )]
698    pub trade_type: String,
699}
700
701/// Request for contract information.
702#[derive(Debug, Clone, Serialize)]
703#[serde(rename_all = "camelCase")]
704pub struct ContractInfoRequest {
705    /// Variety ID.
706    pub variety_id: String,
707    /// Trade type.
708    pub trade_type: String,
709    /// Language.
710    pub lang: String,
711}
712
713/// Arbitrage contract information.
714#[derive(Debug, Clone, Deserialize)]
715#[serde(rename_all = "camelCase")]
716pub struct ArbitrageContract {
717    /// Arbitrage strategy name.
718    #[serde(
719        rename = "arbiName",
720        default,
721        deserialize_with = "deserialize_nullable_string"
722    )]
723    pub arbi_name: String,
724    /// Variety name.
725    #[serde(
726        rename = "varietyName",
727        default,
728        deserialize_with = "deserialize_nullable_string"
729    )]
730    pub variety_name: String,
731    /// Arbitrage contract ID.
732    #[serde(
733        rename = "arbiContractId",
734        default,
735        deserialize_with = "deserialize_nullable_string"
736    )]
737    pub arbi_contract_id: String,
738    /// Maximum order size.
739    #[serde(rename = "maxHand", default)]
740    pub max_hand: i32,
741    /// Minimum tick.
742    #[serde(default)]
743    pub tick: f64,
744}
745
746/// Request for arbitrage contracts.
747#[derive(Debug, Clone, Serialize)]
748#[serde(rename_all = "camelCase")]
749pub struct ArbitrageContractRequest {
750    /// Language.
751    pub lang: String,
752}
753
754// ============================================================================
755// Settlement Parameter Models (结算参数数据模型)
756// ============================================================================
757
758/// Settlement parameter data.
759#[derive(Debug, Clone, Deserialize)]
760#[serde(rename_all = "camelCase")]
761pub struct SettleParam {
762    /// Variety code.
763    #[serde(default, deserialize_with = "deserialize_nullable_string")]
764    pub variety: String,
765    /// Variety order.
766    #[serde(
767        rename = "varietyOrder",
768        default,
769        deserialize_with = "deserialize_nullable_string"
770    )]
771    pub variety_order: String,
772    /// Contract ID.
773    #[serde(
774        rename = "contractId",
775        default,
776        deserialize_with = "deserialize_nullable_string"
777    )]
778    pub contract_id: String,
779    /// Clearing/settlement price.
780    #[serde(
781        rename = "clearPrice",
782        default,
783        deserialize_with = "deserialize_nullable_string"
784    )]
785    pub clear_price: String,
786    /// Open fee.
787    #[serde(
788        rename = "openFee",
789        default,
790        deserialize_with = "deserialize_nullable_string"
791    )]
792    pub open_fee: String,
793    /// Offset fee.
794    #[serde(
795        rename = "offsetFee",
796        default,
797        deserialize_with = "deserialize_nullable_string"
798    )]
799    pub offset_fee: String,
800    /// Short open fee (intraday).
801    #[serde(
802        rename = "shortOpenFee",
803        default,
804        deserialize_with = "deserialize_nullable_string"
805    )]
806    pub short_open_fee: String,
807    /// Short offset fee (intraday).
808    #[serde(
809        rename = "shortOffsetFee",
810        default,
811        deserialize_with = "deserialize_nullable_string"
812    )]
813    pub short_offset_fee: String,
814    /// Position limit style.
815    #[serde(default, deserialize_with = "deserialize_nullable_string")]
816    pub style: String,
817    /// Speculative buy margin rate.
818    #[serde(
819        rename = "specBuyRate",
820        default,
821        deserialize_with = "deserialize_nullable_string"
822    )]
823    pub spec_buy_rate: String,
824    /// Speculative sell margin rate.
825    #[serde(
826        rename = "specSellRate",
827        default,
828        deserialize_with = "deserialize_nullable_string"
829    )]
830    pub spec_sell_rate: String,
831    /// Hedge buy margin rate.
832    #[serde(
833        rename = "hedgeBuyRate",
834        default,
835        deserialize_with = "deserialize_nullable_string"
836    )]
837    pub hedge_buy_rate: String,
838    /// Hedge sell margin rate.
839    #[serde(
840        rename = "hedgeSellRate",
841        default,
842        deserialize_with = "deserialize_nullable_string"
843    )]
844    pub hedge_sell_rate: String,
845}
846
847/// Request for settlement parameters.
848#[derive(Debug, Clone, Serialize)]
849#[serde(rename_all = "camelCase")]
850pub struct SettleParamRequest {
851    /// Variety ID.
852    pub variety_id: String,
853    /// Trade date.
854    pub trade_date: String,
855    /// Trade type.
856    pub trade_type: String,
857    /// Language.
858    pub lang: String,
859}