CPPKiteConnect
mf.hpp
1 /*
2  * Licensed under the MIT License <http://opensource.org/licenses/MIT>.
3  * SPDX-License-Identifier: MIT
4  *
5  * Copyright (c) 2020-2022 Bhumit Attarde
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a
8  * copy of this software and associated documentation files (the "Software"),
9  * to deal in the Software without restriction, including without limitation
10  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11  * and/or sell copies of the Software, and to permit persons to whom the
12  * Software is furnished to do so, subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included in
15  * all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
20  * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
21  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
22  * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
23  * USE OR OTHER DEALINGS IN THE SOFTWARE.
24  */
25 
26 #pragma once
27 
28 #include <string>
29 
30 #include "../utils.hpp"
31 #include "rapidjson/include/rapidjson/document.h"
32 #include "rapidjson/include/rapidjson/rapidjson.h"
33 
34 namespace kiteconnect {
35 
36 using std::string;
37 namespace rj = rapidjson;
38 namespace kc = kiteconnect;
39 namespace utils = kc::internal::utils;
40 
43  GENERATE_FLUENT_METHOD(placeMfOrderParams, int, quantity, Quantity);
44  GENERATE_FLUENT_METHOD(placeMfOrderParams, double, amount, Amount);
45  GENERATE_FLUENT_METHOD(placeMfOrderParams, const string&, symbol, Symbol);
46  GENERATE_FLUENT_METHOD(
47  placeMfOrderParams, const string&, transactionType, TransactionType);
48  GENERATE_FLUENT_METHOD(placeMfOrderParams, const string&, tag, Tag);
49 
50  std::optional<int> quantity;
51  std::optional<double> amount;
52  string symbol;
53  string transactionType;
54  std::optional<string> tag;
55 };
56 
59  GENERATE_FLUENT_METHOD(placeMfSipParams, int, installments, Installments);
60  GENERATE_FLUENT_METHOD(
61  placeMfSipParams, int, installmentDay, InstallmentDay);
62  GENERATE_FLUENT_METHOD(placeMfSipParams, double, amount, Amount);
63  GENERATE_FLUENT_METHOD(
64  placeMfSipParams, double, initialAmount, InitialAmount);
65  GENERATE_FLUENT_METHOD(placeMfSipParams, const string&, symbol, Symbol);
66  GENERATE_FLUENT_METHOD(
67  placeMfSipParams, const string&, frequency, Frequency);
68  GENERATE_FLUENT_METHOD(placeMfSipParams, const string&, tag, Tag);
69 
70  int installments;
71  std::optional<int> installmentDay;
72  double amount;
73  std::optional<double> initialAmount;
74  string symbol;
75  string frequency;
76  std::optional<string> tag;
77 };
78 
81  placeMfSipResponse() = default;
82  explicit placeMfSipResponse(const rj::Value::Object& val) { parse(val); };
83 
84  void parse(const rj::Value::Object& val) {
85  orderId = utils::json::get<string>(val, "order_id");
86  sipId = utils::json::get<string>(val, "sip_id");
87  };
88 
89  string orderId;
90  string sipId;
91 };
92 
95  GENERATE_FLUENT_METHOD(modifyMfSipParams, int, installments, Installments);
96  GENERATE_FLUENT_METHOD(
97  modifyMfSipParams, int, installmentDay, InstallmentDay);
98  GENERATE_FLUENT_METHOD(modifyMfSipParams, double, amount, Amount);
99  GENERATE_FLUENT_METHOD(modifyMfSipParams, const string&, sipId, SipId);
100  GENERATE_FLUENT_METHOD(modifyMfSipParams, const string&, status, Status);
101  GENERATE_FLUENT_METHOD(
102  modifyMfSipParams, const string&, frequency, Frequency);
103 
104  std::optional<int> installmentDay;
105  std::optional<int> installments;
106  std::optional<double> amount;
107  string sipId;
108  std::optional<string> status;
109  std::optional<string> frequency;
110 };
111 
113 struct mfOrder {
114  mfOrder() = default;
115  explicit mfOrder(const rj::Value::Object& val) { parse(val); };
116 
117  void parse(const rj::Value::Object& val) {
118  orderID = utils::json::get<string>(val, "order_id");
119  exchangeOrderID = utils::json::get<string>(val, "exchange_order_id");
120  tradingsymbol = utils::json::get<string>(val, "tradingsymbol");
121  status = utils::json::get<string>(val, "status");
122  statusMessage = utils::json::get<string>(val, "status_message");
123  folio = utils::json::get<string>(val, "folio");
124  fund = utils::json::get<string>(val, "fund");
125  orderTimestamp = utils::json::get<string>(val, "order_timestamp");
126  exchangeTimestamp = utils::json::get<string>(val, "exchange_timestamp");
127  settlementID = utils::json::get<string>(val, "settlement_id");
128  transactionType = utils::json::get<string>(val, "transaction_type");
129  variety = utils::json::get<string>(val, "variety");
130  purchaseType = utils::json::get<string>(val, "purchase_type");
131  quantity = utils::json::get<double>(val, "quantity");
132  amount = utils::json::get<double>(val, "amount");
133  lastPrice = utils::json::get<double>(val, "last_price");
134  averagePrice = utils::json::get<double>(val, "average_price");
135  placedBy = utils::json::get<string>(val, "placed_by");
136  tag = utils::json::get<string>(val, "tag");
137  };
138 
139  double quantity = -1;
140  double amount = -1;
141  double lastPrice = -1;
142  double averagePrice = -1;
143  string orderID;
144  string exchangeOrderID;
145  string tradingsymbol;
146  string status;
147  string statusMessage;
148  string folio;
149  string fund;
150  string orderTimestamp;
151  string exchangeTimestamp;
152  string settlementID;
153  string transactionType;
154  string variety;
155  string purchaseType;
156  string placedBy;
157  string tag;
158 };
159 
161 struct mfHolding {
162 
163  mfHolding() = default;
164  explicit mfHolding(const rj::Value::Object& val) { parse(val); };
165 
166  void parse(const rj::Value::Object& val) {
167  folio = utils::json::get<string>(val, "folio");
168  fund = utils::json::get<string>(val, "fund");
169  tradingsymbol = utils::json::get<string>(val, "tradingsymbol");
170  averagePrice = utils::json::get<double>(val, "average_price");
171  lastPrice = utils::json::get<double>(val, "last_price");
172  lastPriceDate = utils::json::get<string>(val, "last_price_date");
173  Pnl = utils::json::get<double>(val, "pnl");
174  quantity = utils::json::get<double>(val, "quantity");
175  };
176 
177  double averagePrice = -1;
178  double lastPrice = -1;
179  double Pnl = -1;
180  double quantity = -1;
181  string folio;
182  string fund;
183  string tradingsymbol;
184  string lastPriceDate;
185 };
186 
188 struct mfSip {
189  mfSip() = default;
190  explicit mfSip(const rj::Value::Object& val) { parse(val); };
191 
192  void parse(const rj::Value::Object& val) {
193  ID = utils::json::get<string>(val, "sip_id");
194  tradingsymbol = utils::json::get<string>(val, "tradingsymbol");
195  fundName = utils::json::get<string>(val, "fund");
196  dividendType = utils::json::get<string>(val, "dividend_type");
197  transactionType = utils::json::get<string>(val, "transaction_type");
198  status = utils::json::get<string>(val, "status");
199  SIPType = utils::json::get<string>(val, "sip_type");
200  created = utils::json::get<string>(val, "created");
201  frequency = utils::json::get<string>(val, "frequency");
202  instalmentAmount = utils::json::get<double>(val, "instalment_amount");
203  instalments = utils::json::get<int>(val, "instalments");
204  lastInstalment = utils::json::get<string>(val, "last_instalment");
205  pendingInstalments = utils::json::get<int>(val, "pending_instalments");
206  instalmentDay = utils::json::get<int>(val, "instalment_day");
207  completedInstalments =
208  utils::json::get<int>(val, "completed_instalments");
209  nextInstalment = utils::json::get<string>(val, "next_instalment");
210  triggerPrice = utils::json::get<double>(val, "trigger_price");
211  tag = utils::json::get<string>(val, "tag");
212  };
213 
214  int pendingInstalments = -1;
215  int instalmentDay = -1;
216  int completedInstalments = -1;
217  int instalments = -1;
218  double instalmentAmount = -1;
219  double triggerPrice = -1;
220  string ID;
221  string tradingsymbol;
222  string fundName;
223  string dividendType;
224  string transactionType;
225  string status;
226  string SIPType;
227  string created;
228  string frequency;
229  string lastInstalment;
230  string nextInstalment;
231  string tag;
232 };
233 
235 struct mfInstrument {
236  mfInstrument() = default;
237  explicit mfInstrument(const std::vector<string>& row) { parse(row); };
238 
239  void parse(const std::vector<string>& tokens) {
240  static const auto toDouble = [](const string& str) -> double {
241  return (str.empty()) ? 0.0 : std::stod(str);
242  };
243 
244  tradingsymbol = tokens[TRADINGSYMBOL_IDX];
245  amc = tokens[AMC_IDX];
246  name = tokens[NAME_IDX];
247  purchaseAllowed =
248  static_cast<bool>(std::stoi(tokens[PURCHASE_ALLOWED_IDX]));
249  redemptionAllowed =
250  static_cast<bool>(std::stoi(tokens[REDEMPTION_ALLOWED_IDX]));
251  minimumPurchaseAmount = toDouble(tokens[MIN_PURCHASE_AMOUNT_IDX]);
252  purchaseAmountMultiplier = toDouble(tokens[PURCHASE_AMOUNT_MUL_IDX]);
253  minimumAdditionalPurchaseAmount =
254  toDouble(tokens[MIN_ADDITIONAL_PURCHASE_AMOUNT_IDX]);
255  minimumRedemptionQuantity =
256  toDouble(tokens[MIN_REDEMPTION_QUANTITY_IDX]);
257  redemptionQuantityMultiplier =
258  toDouble(tokens[REDEMPTION_QUANTITY_MUL_IDX]);
259  dividendType = tokens[DIVIDEND_TYPE_IDX];
260  schemeType = tokens[SCHEME_TYPE_IDX];
261  plan = tokens[PLAN_IDX];
262  settlementType = tokens[SETTLEMENT_TYPE_IDX];
263  lastPrice = toDouble(tokens[LAST_PRICE_IDX]);
264  lastPriceDate = tokens[LAST_PRICE_DATE_IDX];
265  };
266 
267  double minimumPurchaseAmount = -1;
268  double purchaseAmountMultiplier = -1;
269  double minimumAdditionalPurchaseAmount = -1;
270  double minimumRedemptionQuantity = -1;
271  double redemptionQuantityMultiplier = -1;
272  double lastPrice = -1;
273  bool purchaseAllowed = false;
274  bool redemptionAllowed = false;
275  string tradingsymbol;
276  string amc;
277  string name;
278  string dividendType;
279  string schemeType;
280  string plan;
281  string settlementType;
282  string lastPriceDate;
283 
284  static constexpr uint8_t TRADINGSYMBOL_IDX = 0;
285  static constexpr uint8_t AMC_IDX = 1;
286  static constexpr uint8_t NAME_IDX = 2;
287  static constexpr uint8_t PURCHASE_ALLOWED_IDX = 3;
288  static constexpr uint8_t REDEMPTION_ALLOWED_IDX = 4;
289  static constexpr uint8_t MIN_PURCHASE_AMOUNT_IDX = 5;
290  static constexpr uint8_t PURCHASE_AMOUNT_MUL_IDX = 6;
291  static constexpr uint8_t MIN_ADDITIONAL_PURCHASE_AMOUNT_IDX = 7;
292  static constexpr uint8_t MIN_REDEMPTION_QUANTITY_IDX = 8;
293  static constexpr uint8_t REDEMPTION_QUANTITY_MUL_IDX = 9;
294  static constexpr uint8_t DIVIDEND_TYPE_IDX = 10;
295  static constexpr uint8_t SCHEME_TYPE_IDX = 11;
296  static constexpr uint8_t PLAN_IDX = 12;
297  static constexpr uint8_t SETTLEMENT_TYPE_IDX = 13;
298  static constexpr uint8_t LAST_PRICE_IDX = 14;
299  static constexpr uint8_t LAST_PRICE_DATE_IDX = 15;
300 };
301 
302 } // namespace kiteconnect
kiteconnect::mfOrder
Represents information of a mutual fund order.
Definition: mf.hpp:113
kiteconnect::placeMfOrderParams
Parameters required for the placeMfOrder method.
Definition: mf.hpp:42
kiteconnect::mfSip
Represents information of a mutual fund SIP.
Definition: mf.hpp:188
kiteconnect::mfHolding
Represents information of a mutual fund holding.
Definition: mf.hpp:161
kiteconnect::placeMfSipResponse
Represents response returned by the placeMfSip method.
Definition: mf.hpp:80
kiteconnect::mfInstrument
Represents information about a mutual fund instrument.
Definition: mf.hpp:235
kiteconnect::modifyMfSipParams
Parameters required for the modifyMfSip method.
Definition: mf.hpp:94
kiteconnect::placeMfSipParams
Parameters required for the placeMfSip method.
Definition: mf.hpp:58