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)]
27    pub available_qty: Option<i64>,
28    #[serde(default)]
29    pub collateral_qty: Option<i64>,
30    #[serde(default)]
31    pub avg_cost_price: Option<f64>,
32}
33
34// ---------------------------------------------------------------------------
35// Positions
36// ---------------------------------------------------------------------------
37
38/// A single open position.
39#[derive(Debug, Clone, Deserialize)]
40#[serde(rename_all = "camelCase")]
41pub struct Position {
42    pub dhan_client_id: Option<String>,
43    pub trading_symbol: Option<String>,
44    pub security_id: Option<String>,
45    pub position_type: Option<String>,
46    pub exchange_segment: Option<String>,
47    pub product_type: Option<String>,
48    #[serde(default)]
49    pub buy_avg: Option<f64>,
50    #[serde(default)]
51    pub buy_qty: Option<i64>,
52    #[serde(default)]
53    pub cost_price: Option<f64>,
54    #[serde(default)]
55    pub sell_avg: Option<f64>,
56    #[serde(default)]
57    pub sell_qty: Option<i64>,
58    #[serde(default)]
59    pub net_qty: Option<i64>,
60    #[serde(default)]
61    pub realized_profit: Option<f64>,
62    #[serde(default)]
63    pub unrealized_profit: Option<f64>,
64    #[serde(default)]
65    pub rbi_reference_rate: Option<f64>,
66    #[serde(default)]
67    pub multiplier: Option<i64>,
68    #[serde(default)]
69    pub carry_forward_buy_qty: Option<i64>,
70    #[serde(default)]
71    pub carry_forward_sell_qty: Option<i64>,
72    #[serde(default)]
73    pub carry_forward_buy_value: Option<f64>,
74    #[serde(default)]
75    pub carry_forward_sell_value: Option<f64>,
76    #[serde(default)]
77    pub day_buy_qty: Option<i64>,
78    #[serde(default)]
79    pub day_sell_qty: Option<i64>,
80    #[serde(default)]
81    pub day_buy_value: Option<f64>,
82    #[serde(default)]
83    pub day_sell_value: Option<f64>,
84    pub drv_expiry_date: Option<String>,
85    pub drv_option_type: Option<String>,
86    #[serde(default)]
87    pub drv_strike_price: Option<f64>,
88    #[serde(default)]
89    pub cross_currency: Option<bool>,
90}
91
92// ---------------------------------------------------------------------------
93// Convert Position
94// ---------------------------------------------------------------------------
95
96/// Request body for converting a position product type.
97///
98/// Used by `POST /v2/positions/convert`.
99#[derive(Debug, Clone, Serialize)]
100#[serde(rename_all = "camelCase")]
101pub struct ConvertPositionRequest {
102    pub dhan_client_id: String,
103    pub from_product_type: ProductType,
104    pub exchange_segment: ExchangeSegment,
105    pub position_type: PositionType,
106    pub security_id: String,
107    #[serde(skip_serializing_if = "Option::is_none")]
108    pub trading_symbol: Option<String>,
109    pub convert_qty: u64,
110    pub to_product_type: ProductType,
111}
112
113// ---------------------------------------------------------------------------
114// Exit All Positions
115// ---------------------------------------------------------------------------
116
117/// Response from exiting all positions.
118#[derive(Debug, Clone, Deserialize)]
119pub struct ExitAllResponse {
120    pub status: String,
121    pub message: String,
122}