tcbs-api 0.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
tcbs_api/__init__.py ADDED
@@ -0,0 +1,8 @@
1
+ """Python client library for the TCBS Open API.
2
+
3
+ See the official API documentation at https://developers.tcbs.com.vn/.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ __version__ = "0.0.1"
@@ -0,0 +1,18 @@
1
+ """Request and response models, grouped by API domain.
2
+
3
+ Every model is a plain ``dataclass`` whose field names match the JSON keys TCBS sends and
4
+ expects, keeping their original camelCase — ``OrderInfo.orderID`` and
5
+ ``TotalCashDerivativeResponse.cashavaiwithdraw`` are spelled the way the API spells them
6
+ rather than the way Python normally would. That keeps the mapping between code and API
7
+ payloads obvious, and is why responses can be decoded straight onto these classes.
8
+
9
+ Sub-packages:
10
+
11
+ * :mod:`tcbs_api.dto.account` — profile information for a sub-account
12
+ * :mod:`tcbs_api.dto.auth` — the JWT token response
13
+ * :mod:`tcbs_api.dto.money` — cash transfers, margin deposit and withdrawal
14
+ * :mod:`tcbs_api.dto.stock_normal` — stock orders, purchasing power, assets and cash
15
+ * :mod:`tcbs_api.dto.derivative_dto` — derivatives cash, positions, orders and market data
16
+ """
17
+
18
+ from __future__ import annotations
@@ -0,0 +1,3 @@
1
+ from __future__ import annotations
2
+
3
+ from .account_information_response import *
@@ -0,0 +1,79 @@
1
+ """Profile information for a sub-account, as returned by ``get_subaccount_info``.
2
+
3
+ ``BasicInfo``, ``PersonalInfo``, ``BankAccount`` and ``BankSubAccount`` are only populated
4
+ when they are named in the endpoint's ``fields`` query parameter; the others come back as
5
+ ``None``.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from dataclasses import dataclass, field
11
+
12
+
13
+ @dataclass
14
+ class BasicInfo:
15
+ tcbsId: str | None = None
16
+ code105C: str | None = None
17
+ status: str | None = None
18
+ type: str | None = None
19
+ depository: bool | None = None
20
+
21
+
22
+ @dataclass
23
+ class PersonalInfo:
24
+ fullName: str | None = None
25
+ fullNameNoAccent: str | None = None
26
+ firstName: str | None = None
27
+ lastName: str | None = None
28
+ email: str | None = None
29
+ phoneNumber: str | None = None
30
+ gender: str | None = None
31
+ birthday: str | None = None
32
+ contactAddress: str | None = None
33
+ permanentAddress: str | None = None
34
+ nationality: str | None = None
35
+ nationalityName: str | None = None
36
+ taxIdNumber: str | None = None
37
+ acronym: str | None = None
38
+ createdDate: str | None = None
39
+ updatedDate: str | None = None
40
+ flowOpenAccount: str | None = None
41
+ avatarUrl: str | None = None
42
+ businessType: str | None = None
43
+ ppBusinessType: str | None = None
44
+ ppBusinessField: str | None = None
45
+ ppBusinessTypeName: str | None = None
46
+ ppBusinessFieldName: str | None = None
47
+ identityCard: dict | None = None
48
+
49
+
50
+ @dataclass
51
+ class BankAccount:
52
+ accountNo: str | None = None
53
+ accountName: str | None = None
54
+ accountNameNoAccent: str | None = None
55
+ bankCode: str | None = None
56
+ bankName: str | None = None
57
+ branchCode: str | None = None
58
+ bankType: str | None = None
59
+ bankSys: str | None = None
60
+ authorized: bool | None = None
61
+ bankAccountType: str | None = None
62
+
63
+
64
+ @dataclass
65
+ class BankSubAccount:
66
+ accountNo: str | None = None
67
+ accountName: str | None = None
68
+ accountType: str | None = None
69
+ accountTypeName: str | None = None
70
+ status: str | None = None
71
+ isDefault: str | None = None
72
+
73
+
74
+ @dataclass
75
+ class AccountInformationResponse:
76
+ basicInfo: BasicInfo | None = None
77
+ personalInfo: PersonalInfo | None = None
78
+ bankAccounts: list[BankAccount] | None = field(default_factory=list)
79
+ bankSubAccounts: list[BankSubAccount] | None = field(default_factory=list)
@@ -0,0 +1,3 @@
1
+ from __future__ import annotations
2
+
3
+ from .token_response_dto import *
@@ -0,0 +1,10 @@
1
+ """The JWT token response returned by ``get_token``."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass
6
+
7
+
8
+ @dataclass
9
+ class TokenResponseDto:
10
+ token: str | None = None
@@ -0,0 +1,3 @@
1
+ from __future__ import annotations
2
+
3
+ from .derivative_dto import *
@@ -0,0 +1,378 @@
1
+ """Derivatives models, including the envelope that every derivative endpoint returns.
2
+
3
+ ``DerivativeResponse[T]`` is that envelope — ``{cmd, rc, rs, oID, data}``. The response
4
+ models used as its ``T`` carry ``@dataclass_json`` so they can be decoded with
5
+ ``from_json()``; the remaining classes are request bodies, plus two market-information
6
+ models that are decoded with ``dacite`` like the rest of the library.
7
+
8
+ Beware that a field annotated ``Optional[...]`` is not optional at decode time unless it
9
+ also has a ``= None`` default — ``from_dict``/``from_json`` raise ``KeyError`` for a field
10
+ the API omits. See the README's known limitations.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ from dataclasses import dataclass
16
+ from typing import Generic, TypeVar
17
+
18
+ from dataclasses_json import dataclass_json
19
+
20
+ T = TypeVar("T")
21
+
22
+
23
+ @dataclass_json
24
+ @dataclass
25
+ class DerivativeResponse(Generic[T]):
26
+ """The ``{cmd, rc, rs, oID, data}`` envelope every derivative endpoint returns.
27
+
28
+ ``T`` is the response model for the endpoint. It is not applied at runtime — see this
29
+ module's docstring and the README's known limitations.
30
+ """
31
+
32
+ cmd: str
33
+ rc: str
34
+ rs: str
35
+ oID: str
36
+ data: T
37
+
38
+
39
+ @dataclass_json
40
+ @dataclass
41
+ class TotalCashDerivativeResponse:
42
+ """Derivatives cash, margin and collateral summary."""
43
+
44
+ cash: float | None
45
+ stock: float | None
46
+ collateral: float | None
47
+ type: str | None
48
+ net: float | None
49
+ tyle: float | None
50
+ im: float | None
51
+ vm: float | None
52
+ dm: float | None
53
+ mr: float | None
54
+ avaiCash: float | None
55
+ avaiColla: float | None
56
+ vmunpay: float | None
57
+ info: str | None
58
+ color: str | None
59
+ vm_eod: float | None
60
+ others: float | None
61
+ tax: float | None
62
+ feeCTCK: float | None
63
+ feeHNX: float | None
64
+ cashWithdraw: float | None
65
+ tienbosung: float | None
66
+ cashavaiwithdraw: float | None
67
+ assets: float | None
68
+ nav: float | None
69
+ cashOut: float | None
70
+ unrelizeVM: float | None
71
+ feePos: float | None
72
+ feeMan: float | None
73
+ product: str | None
74
+ status: str | None
75
+ debt: float | None
76
+ w1: float | None
77
+ w2: float | None
78
+ limit: float | None
79
+ package: str | None
80
+
81
+
82
+ @dataclass_json
83
+ @dataclass
84
+ class AssetPositionCloseDerivativeResponse:
85
+ symbol: str
86
+ side: str
87
+ openPrice: float
88
+ closePrice: float
89
+ closePosition: str
90
+ fee: float
91
+ tax: float
92
+ closeVM: float
93
+ unrealize: float
94
+ closePC: float
95
+ time: str
96
+
97
+
98
+ @dataclass_json
99
+ @dataclass
100
+ class AssetPositionOpenDerivativeResponse:
101
+ symbol: str
102
+ im: str
103
+ deliver: str
104
+ receive: str
105
+ net: int
106
+ side: str
107
+ account: str
108
+ wasp: float
109
+ wapb: float
110
+ lastPrice: float
111
+ imValue: float
112
+ vmValue: float
113
+ mrValue: float
114
+ duedate: str
115
+ netoffvol: int
116
+ avg_remain: float
117
+ vm_remain: float
118
+ pc_remain: str
119
+ stoploss: str | None
120
+ takeprofit: str | None
121
+
122
+
123
+ @dataclass_json
124
+ @dataclass
125
+ class ListOrderNormalDerivativeResponse:
126
+ orderNo: str
127
+ pk_orderNo: str
128
+ orderTime: str
129
+ accountCode: str
130
+ side: str
131
+ symbol: str
132
+ volume: int
133
+ showPrice: float
134
+ matchVolume: int
135
+ matchPriceBQ: float
136
+ status: str
137
+ orderStatus: str
138
+ channel: str
139
+ group: str
140
+ cancelTime: str | None
141
+ isCancel: bool
142
+ isAmend: bool
143
+ info: str | None
144
+ maxPrice: float | None
145
+ matchValue: float | None
146
+ quote: str | None
147
+ autoType: str | None
148
+ product: str | None
149
+ orderType: str | None
150
+ source: str | None
151
+
152
+
153
+ @dataclass_json
154
+ @dataclass
155
+ class ListOrderConditionDerivativeResponse:
156
+ orderNo: str
157
+ groupOrder: str
158
+ pk_orderNo: str
159
+ accountCode: str
160
+ side: str
161
+ symbol: str
162
+ showPrice: float
163
+ volume: int
164
+ condition: str
165
+ result: str
166
+ active_time: str
167
+ send_time: str
168
+ cancel_time: str | None
169
+ group: str
170
+ channel: str
171
+ maxPrice: float | None
172
+ soPrice: float
173
+ orderType: str
174
+ from_time: str
175
+ exp_time: str
176
+ status: str
177
+ details: str
178
+ notes: str
179
+
180
+
181
+ @dataclass_json
182
+ @dataclass
183
+ class OrderNormalDerivativeResponse:
184
+ symbol: str
185
+ status: str
186
+ msg_type: str
187
+ showPrice: float
188
+ orderTime: str
189
+ type: str
190
+ accountCode: str
191
+ orderNo: str
192
+ matchVolume: float
193
+ side: str
194
+ volume: float
195
+ pk_orderNo: str
196
+ channel: str
197
+ group: str
198
+ quote: str
199
+ accType: str | None = None
200
+ shareStatus: str | None = None
201
+ market: str | None = None
202
+ refID: str | None = None
203
+ autoType: str | None = None
204
+ product: str | None = None
205
+
206
+
207
+ @dataclass
208
+ class PlaceOrderDto:
209
+ accountId: str
210
+ subAccountId: str
211
+ side: str
212
+ symbol: str
213
+ price: float
214
+ volume: int
215
+ refId: str
216
+ orderType: str
217
+ advance: int | None = None
218
+ pin: str | None = None
219
+
220
+
221
+ @dataclass
222
+ class OrderConditionDerivativeRequestDTO:
223
+ subAccountId: str
224
+ accountId: str
225
+ side: str
226
+ symbol: str
227
+ price: float
228
+ volume: float
229
+ orderType: str
230
+ callbackPoint: float
231
+ activationPrice: float
232
+ soPrice: float
233
+ advance: str | None = None
234
+ refId: str | None = None
235
+ pin: str | None = None
236
+ type: str | None = None
237
+ cmd: str | None = None
238
+
239
+
240
+ @dataclass_json
241
+ @dataclass
242
+ class OrderConditionDerivativeResponseDTO:
243
+ symbol: str
244
+ status: str
245
+ msg_type: str
246
+ showPrice: float
247
+ orderTime: str
248
+ type: str
249
+ accountCode: str
250
+ orderNo: int
251
+ matchVolume: float
252
+ side: str
253
+ volume: float
254
+ pk_orderNo: str
255
+ channel: str
256
+ group: str
257
+ quote: str
258
+ shareStatus: str | None = None
259
+ market: str | None = None
260
+ refID: str | None = None
261
+ accType: str | None = None
262
+ autoType: str | None = None
263
+ product: str | None = None
264
+
265
+
266
+ @dataclass
267
+ class EditOrderNormalDerivativeRequestDTO:
268
+ accountId: str
269
+ subAccountId: str
270
+ orderNo: str
271
+ refId: str
272
+ nvol: float
273
+ nprice: float
274
+
275
+
276
+ @dataclass_json
277
+ @dataclass
278
+ class EditOrderNormalDerivativeResponseDTO:
279
+ orderNo: str
280
+ msg_type: str
281
+ status: str
282
+ pk_orderNo: str
283
+ volume: float
284
+ showPrice: float
285
+
286
+
287
+ @dataclass
288
+ class EditOrderConditionDerivativeRequestDTO:
289
+ accountId: str
290
+ pkOrderNo: str
291
+ type: str
292
+ refId: str
293
+ soPrice: float
294
+ cmd: str | None = None
295
+
296
+
297
+ @dataclass_json
298
+ @dataclass
299
+ class EditOrderConditionDerivativeResponseDTO:
300
+ showPrice: str
301
+ price: str
302
+ volume: str
303
+ pkOrderNo: str
304
+ notes: str
305
+
306
+
307
+ @dataclass
308
+ class CancelOrderNormalDerivativeRequestDTO:
309
+ accountId: str
310
+ orderNo: str
311
+ cmd: str | None = None
312
+ pin: str | None = None
313
+ refId: str | None = None
314
+
315
+
316
+ @dataclass_json
317
+ @dataclass
318
+ class CancelOrderNormalDerivativeResponseDTO:
319
+ orderNo: str
320
+ msg_type: str | None = None
321
+ status: str | None = None
322
+ pk_orderNo: str | None = None
323
+ cancelTime: str | None = None
324
+
325
+
326
+ @dataclass
327
+ class CancelOrderConditionDerivativeRequestDTO:
328
+ accountId: str
329
+ orderNo: str
330
+ subAccountId: str | None = None
331
+
332
+
333
+ @dataclass_json
334
+ @dataclass
335
+ class CancelOrderConditionDerivativeResponseDTO:
336
+ """Intentionally empty: for this operation TCBS reports only the surrounding envelope."""
337
+
338
+ pass
339
+
340
+
341
+ @dataclass
342
+ class MarketInformationDerivativeResponseDTO:
343
+ symbol: str | None = None
344
+ ceilPrice: float | None = None
345
+ floorPrice: float | None = None
346
+ refPrice: float | None = None
347
+ bidPrice01: float | None = None
348
+ bidPrice02: float | None = None
349
+ bidPrice03: float | None = None
350
+ bidQtty01: float | None = None
351
+ bidQtty02: float | None = None
352
+ bidQtty03: float | None = None
353
+ offerPrice01: float | None = None
354
+ offerPrice02: float | None = None
355
+ offerPrice03: float | None = None
356
+ offerQtty01: float | None = None
357
+ offerQtty02: float | None = None
358
+ offerQtty03: float | None = None
359
+ matchPrice: float | None = None
360
+ matchQtty: float | None = None
361
+ change: float | None = None
362
+ changePercent: float | None = None
363
+ open: float | None = None
364
+ high: float | None = None
365
+ low: float | None = None
366
+ totalVol: float | None = None
367
+ openVol: float | None = None
368
+ buyForeignQtty: float | None = None
369
+ sellForeignQtty: float | None = None
370
+ expiryDate: str | None = None
371
+ avg: float | None = None
372
+
373
+
374
+ @dataclass
375
+ class MarketInformationResponseDTO:
376
+ """Price board for every derivatives symbol."""
377
+
378
+ data: list[MarketInformationDerivativeResponseDTO]
@@ -0,0 +1,3 @@
1
+ from __future__ import annotations
2
+
3
+ from .money import *
@@ -0,0 +1,62 @@
1
+ """Cash-transfer and margin deposit/withdrawal models.
2
+
3
+ The ``*RequestDTO`` models are the bodies sent to TCBS, serialized with
4
+ :func:`dataclasses.asdict`; the ``*ResponseDTO`` models are what comes back.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from dataclasses import dataclass
10
+
11
+
12
+ @dataclass
13
+ class TransferBetweenSubaccountRequestDTO:
14
+ sourceAccountNumber: str
15
+ destinationAccountNumber: str
16
+ amount: float
17
+ description: str
18
+
19
+
20
+ @dataclass
21
+ class TransferBetweenSubaccountResponseDTO:
22
+ code: str
23
+ message: str
24
+
25
+
26
+ @dataclass
27
+ class WithdrawalDerivativeRequestDTO:
28
+ accountId: str
29
+ subAccountId: str
30
+ amount: float
31
+ paymentContent: str
32
+
33
+
34
+ @dataclass
35
+ class WithdrawalDerivativeResponseDTO:
36
+ cmd: str
37
+ rc: str
38
+ rs: str
39
+ oID: str
40
+ data: list
41
+
42
+
43
+ @dataclass
44
+ class DepositDerivativeRequestDTO:
45
+ accountId: str
46
+ subAccountId: str
47
+ amount: float
48
+ paymentContent: str
49
+
50
+
51
+ @dataclass
52
+ class DepositDerivativeResponseDTO:
53
+ transactionId: str
54
+
55
+
56
+ @dataclass
57
+ class DepositDerivativeMarginResponseDTO:
58
+ cmd: str
59
+ rc: str
60
+ rs: str
61
+ oID: str
62
+ data: list[DepositDerivativeResponseDTO]
@@ -0,0 +1,3 @@
1
+ from __future__ import annotations
2
+
3
+ from .stock_normal_dto import *