Skip to main content

dhan_rs/types/
portfolio.rs

1#![allow(missing_docs)]
2//! Portfolio types — Holdings, Positions, Convert Position.
3
4use serde::{Deserialize, Serialize};
5
6use crate::types::enums::*;
7
8// ---------------------------------------------------------------------------
9// Holdings
10// ---------------------------------------------------------------------------
11
12/// A single holding in the demat account.
13#[derive(Debug, Clone, Deserialize)]
14#[serde(rename_all = "camelCase")]
15pub struct Holding {
16    pub exchange: Option<String>,
17    pub trading_symbol: Option<String>,
18    pub security_id: Option<String>,
19    pub isin: Option<String>,
20    #[serde(default)]
21    pub total_qty: Option<i64>,
22    #[serde(default)]
23    pub dp_qty: Option<i64>,
24    #[serde(default)]
25    pub t1_qty: Option<i64>,
26    #[serde(default, rename = "mtf_t1_qty", alias = "mtfT1Qty")]
27    pub mtf_t1_qty: Option<i64>,
28    #[serde(default, rename = "mtf_qty", alias = "mtfQty")]
29    pub mtf_qty: Option<i64>,
30    #[serde(default)]
31    pub available_qty: Option<i64>,
32    #[serde(default)]
33    pub collateral_qty: Option<i64>,
34    #[serde(default)]
35    pub avg_cost_price: Option<f64>,
36    #[serde(default)]
37    pub last_traded_price: Option<f64>,
38}
39
40// ---------------------------------------------------------------------------
41// Positions
42// ---------------------------------------------------------------------------
43
44/// A single open position.
45#[derive(Debug, Clone, Deserialize)]
46#[serde(rename_all = "camelCase")]
47pub struct Position {
48    pub dhan_client_id: Option<String>,
49    pub trading_symbol: Option<String>,
50    pub security_id: Option<String>,
51    pub position_type: Option<String>,
52    pub exchange_segment: Option<String>,
53    pub product_type: Option<String>,
54    #[serde(default)]
55    pub buy_avg: Option<f64>,
56    #[serde(default)]
57    pub buy_qty: Option<i64>,
58    #[serde(default)]
59    pub cost_price: Option<f64>,
60    #[serde(default)]
61    pub sell_avg: Option<f64>,
62    #[serde(default)]
63    pub sell_qty: Option<i64>,
64    #[serde(default)]
65    pub net_qty: Option<i64>,
66    #[serde(default)]
67    pub realized_profit: Option<f64>,
68    #[serde(default)]
69    pub unrealized_profit: Option<f64>,
70    #[serde(default)]
71    pub rbi_reference_rate: Option<f64>,
72    #[serde(default)]
73    pub multiplier: Option<i64>,
74    #[serde(default)]
75    pub carry_forward_buy_qty: Option<i64>,
76    #[serde(default)]
77    pub carry_forward_sell_qty: Option<i64>,
78    #[serde(default)]
79    pub carry_forward_buy_value: Option<f64>,
80    #[serde(default)]
81    pub carry_forward_sell_value: Option<f64>,
82    #[serde(default)]
83    pub day_buy_qty: Option<i64>,
84    #[serde(default)]
85    pub day_sell_qty: Option<i64>,
86    #[serde(default)]
87    pub day_buy_value: Option<f64>,
88    #[serde(default)]
89    pub day_sell_value: Option<f64>,
90    pub drv_expiry_date: Option<String>,
91    pub drv_option_type: Option<String>,
92    #[serde(default)]
93    pub drv_strike_price: Option<f64>,
94    #[serde(default)]
95    pub cross_currency: Option<bool>,
96}
97
98// ---------------------------------------------------------------------------
99// Convert Position
100// ---------------------------------------------------------------------------
101
102/// Request body for converting a position product type.
103///
104/// Used by `POST /v2/positions/convert`.
105#[derive(Debug, Clone, Serialize)]
106#[serde(rename_all = "camelCase")]
107pub struct ConvertPositionRequest {
108    pub dhan_client_id: String,
109    pub from_product_type: ProductType,
110    pub exchange_segment: ExchangeSegment,
111    pub position_type: PositionType,
112    pub security_id: String,
113    #[serde(skip_serializing_if = "Option::is_none")]
114    pub trading_symbol: Option<String>,
115    pub convert_qty: u64,
116    pub to_product_type: ProductType,
117}
118
119// ---------------------------------------------------------------------------
120// Exit All Positions
121// ---------------------------------------------------------------------------
122
123/// Response from exiting all positions.
124#[derive(Debug, Clone, Deserialize)]
125pub struct ExitAllResponse {
126    pub status: String,
127    pub message: String,
128}