dceapi_rs/services/
trade.rs

1//! Trade service for trading parameter APIs.
2
3use std::collections::HashMap;
4
5use crate::error::Result;
6use crate::http::{BaseClient, RequestOptions};
7use crate::models::{
8    ArbitrageContract, ArbitrageContractRequest, ContractInfo, ContractInfoRequest,
9    DayTradeParamRequest, TradeParam,
10};
11
12/// API endpoint for day trade parameters.
13const PATH_GET_DAY_TRADE_PARAM: &str = "/dceapi/forward/publicweb/tradepara/dayTradPara";
14
15/// API endpoint for month trade parameters.
16const PATH_GET_MONTH_TRADE_PARAM: &str = "/dceapi/forward/publicweb/tradepara/monthTradPara";
17
18/// API endpoint for contract information.
19const PATH_GET_CONTRACT_INFO: &str = "/dceapi/forward/publicweb/tradepara/contractInfo";
20
21/// API endpoint for arbitrage contracts.
22const PATH_GET_ARBITRAGE_CONTRACT: &str = "/dceapi/forward/publicweb/tradepara/arbitrageContract";
23
24/// Trade service for accessing trading parameters.
25#[derive(Debug, Clone)]
26pub struct TradeService {
27    client: BaseClient,
28}
29
30impl TradeService {
31    /// Create a new trade service.
32    pub fn new(client: BaseClient) -> Self {
33        TradeService { client }
34    }
35
36    /// Get daily trading parameters.
37    ///
38    /// Returns margin rates, price limits, etc. for a variety.
39    ///
40    /// # Arguments
41    /// * `req` - Request with variety_id, trade_type, and lang
42    /// * `opts` - Optional request options
43    pub async fn get_day_trade_param(
44        &self,
45        req: &DayTradeParamRequest,
46        opts: Option<RequestOptions>,
47    ) -> Result<Vec<TradeParam>> {
48        self.client.do_post(PATH_GET_DAY_TRADE_PARAM, req, opts).await
49    }
50
51    /// Get monthly trading parameters.
52    ///
53    /// # Arguments
54    /// * `opts` - Optional request options
55    pub async fn get_month_trade_param(
56        &self,
57        opts: Option<RequestOptions>,
58    ) -> Result<HashMap<String, serde_json::Value>> {
59        #[derive(serde::Serialize)]
60        struct EmptyRequest {}
61
62        self.client
63            .do_post(PATH_GET_MONTH_TRADE_PARAM, &EmptyRequest {}, opts)
64            .await
65    }
66
67    /// Get contract information.
68    ///
69    /// Returns contract details including trading dates, unit, tick, etc.
70    ///
71    /// # Arguments
72    /// * `req` - Request with variety_id, trade_type, and lang
73    /// * `opts` - Optional request options
74    pub async fn get_contract_info(
75        &self,
76        req: &ContractInfoRequest,
77        opts: Option<RequestOptions>,
78    ) -> Result<Vec<ContractInfo>> {
79        self.client.do_post(PATH_GET_CONTRACT_INFO, req, opts).await
80    }
81
82    /// Get arbitrage contracts.
83    ///
84    /// Returns available spread/arbitrage trading contracts.
85    ///
86    /// # Arguments
87    /// * `lang` - Language ("zh" or "en"), defaults to "zh"
88    /// * `opts` - Optional request options
89    pub async fn get_arbitrage_contract(
90        &self,
91        lang: Option<&str>,
92        opts: Option<RequestOptions>,
93    ) -> Result<Vec<ArbitrageContract>> {
94        let req = ArbitrageContractRequest {
95            lang: lang.unwrap_or("zh").to_string(),
96        };
97        self.client.do_post(PATH_GET_ARBITRAGE_CONTRACT, &req, opts).await
98    }
99}