HedgeTech 0.2.3__tar.gz → 0.2.5__tar.gz

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.
Files changed (29) hide show
  1. {hedgetech-0.2.3 → hedgetech-0.2.5}/HedgeTech/DataEngine/__tse_ifb/__AsyncClient.py +24 -11
  2. {hedgetech-0.2.3 → hedgetech-0.2.5}/HedgeTech/DataEngine/__tse_ifb/__SyncClient.py +10 -11
  3. {hedgetech-0.2.3 → hedgetech-0.2.5}/HedgeTech/EmsEngine/__tse_ifb/__AsyncClient.py +80 -64
  4. {hedgetech-0.2.3 → hedgetech-0.2.5}/HedgeTech/EmsEngine/__tse_ifb/__SyncClient.py +82 -65
  5. {hedgetech-0.2.3 → hedgetech-0.2.5}/HedgeTech.egg-info/PKG-INFO +1 -1
  6. {hedgetech-0.2.3 → hedgetech-0.2.5}/PKG-INFO +1 -1
  7. {hedgetech-0.2.3 → hedgetech-0.2.5}/pyproject.toml +1 -1
  8. {hedgetech-0.2.3 → hedgetech-0.2.5}/HedgeTech/Auth/__AuthAsyncClient.py +0 -0
  9. {hedgetech-0.2.3 → hedgetech-0.2.5}/HedgeTech/Auth/__AuthSyncClient.py +0 -0
  10. {hedgetech-0.2.3 → hedgetech-0.2.5}/HedgeTech/Auth/__init__.py +0 -0
  11. {hedgetech-0.2.3 → hedgetech-0.2.5}/HedgeTech/Auth/__utils/__RetriableAsyncClient.py +0 -0
  12. {hedgetech-0.2.3 → hedgetech-0.2.5}/HedgeTech/Auth/__utils/__RetriableSyncClient.py +0 -0
  13. {hedgetech-0.2.3 → hedgetech-0.2.5}/HedgeTech/Auth/__utils/__init__.py +0 -0
  14. {hedgetech-0.2.3 → hedgetech-0.2.5}/HedgeTech/DataEngine/__init__.py +0 -0
  15. {hedgetech-0.2.3 → hedgetech-0.2.5}/HedgeTech/DataEngine/__tse_ifb/__init__.py +0 -0
  16. {hedgetech-0.2.3 → hedgetech-0.2.5}/HedgeTech/DataEngine/__tse_ifb/__io_types/__init__.py +0 -0
  17. {hedgetech-0.2.3 → hedgetech-0.2.5}/HedgeTech/DataEngine/__tse_ifb/__io_types/__response.py +0 -0
  18. {hedgetech-0.2.3 → hedgetech-0.2.5}/HedgeTech/EmsEngine/__init__.py +0 -0
  19. {hedgetech-0.2.3 → hedgetech-0.2.5}/HedgeTech/EmsEngine/__tse_ifb/__init__.py +0 -0
  20. {hedgetech-0.2.3 → hedgetech-0.2.5}/HedgeTech/EmsEngine/__tse_ifb/__io_types/__init__.py +0 -0
  21. {hedgetech-0.2.3 → hedgetech-0.2.5}/HedgeTech/EmsEngine/__tse_ifb/__io_types/__response.py +0 -0
  22. {hedgetech-0.2.3 → hedgetech-0.2.5}/HedgeTech.egg-info/SOURCES.txt +0 -0
  23. {hedgetech-0.2.3 → hedgetech-0.2.5}/HedgeTech.egg-info/dependency_links.txt +0 -0
  24. {hedgetech-0.2.3 → hedgetech-0.2.5}/HedgeTech.egg-info/requires.txt +0 -0
  25. {hedgetech-0.2.3 → hedgetech-0.2.5}/HedgeTech.egg-info/top_level.txt +0 -0
  26. {hedgetech-0.2.3 → hedgetech-0.2.5}/LICENSE +0 -0
  27. {hedgetech-0.2.3 → hedgetech-0.2.5}/NOTICE +0 -0
  28. {hedgetech-0.2.3 → hedgetech-0.2.5}/README.md +0 -0
  29. {hedgetech-0.2.3 → hedgetech-0.2.5}/setup.cfg +0 -0
@@ -2,7 +2,12 @@
2
2
  # Imports #
3
3
  # ========================================|======================================== #
4
4
 
5
- from asyncio import Event
5
+ from asyncio import (
6
+ Event,
7
+ wait_for,
8
+ TimeoutError,
9
+ sleep,
10
+ )
6
11
  from websockets.asyncio.client import connect
7
12
  from json import loads
8
13
  from HedgeTech.Auth import AuthAsyncClient
@@ -1461,7 +1466,7 @@ class DataEngine_TseIfb_AsyncClient:
1461
1466
  ... print(update["data"])
1462
1467
  """
1463
1468
 
1464
- if event is None :
1469
+ if not isinstance(event,Event):
1465
1470
  event = Event()
1466
1471
  event.set()
1467
1472
 
@@ -1473,12 +1478,16 @@ class DataEngine_TseIfb_AsyncClient:
1473
1478
  ),
1474
1479
  additional_headers=self.__AuthAsyncClient.token
1475
1480
  ) as ws:
1476
-
1481
+
1477
1482
  while event.is_set():
1478
1483
 
1479
- try:
1480
- yield loads(await ws.recv())
1481
- except :
1484
+ try : yield loads(await wait_for(ws.recv(), timeout=2))
1485
+
1486
+ except TimeoutError:
1487
+ await sleep(0)
1488
+ continue
1489
+
1490
+ except Exception:
1482
1491
  await ws.close()
1483
1492
  break
1484
1493
 
@@ -1566,10 +1575,10 @@ class DataEngine_TseIfb_AsyncClient:
1566
1575
  ... print(update["data"])
1567
1576
  """
1568
1577
 
1569
- if event is None :
1578
+ if not isinstance(event,Event):
1570
1579
  event = Event()
1571
1580
  event.set()
1572
-
1581
+
1573
1582
  async with connect(
1574
1583
  uri=(
1575
1584
  f"wss://core.hedgetech.ir/data-engine/tse-ifb/live/data/websocket/symbol/isin?"
@@ -1581,8 +1590,12 @@ class DataEngine_TseIfb_AsyncClient:
1581
1590
 
1582
1591
  while event.is_set():
1583
1592
 
1584
- try:
1585
- yield loads(await ws.recv())
1586
- except :
1593
+ try: yield loads(await wait_for(ws.recv(), timeout=2))
1594
+
1595
+ except TimeoutError:
1596
+ await sleep(0)
1597
+ continue
1598
+
1599
+ except Exception:
1587
1600
  await ws.close()
1588
1601
  break
@@ -1425,10 +1425,10 @@ class DataEngine_TseIfb_SyncClient:
1425
1425
  ... print(update) # This will not run; method is not implemented
1426
1426
  """
1427
1427
 
1428
- if event is None :
1428
+ if not isinstance(event,Event):
1429
1429
  event = Event()
1430
1430
  event.set()
1431
-
1431
+
1432
1432
  with connect(
1433
1433
  uri=(
1434
1434
  f"wss://core.hedgetech.ir/data-engine/tse-ifb/live/data/websocket/symbol/name?"
@@ -1440,13 +1440,12 @@ class DataEngine_TseIfb_SyncClient:
1440
1440
 
1441
1441
  while event.is_set():
1442
1442
 
1443
- try :
1444
- yield loads(ws.recv())
1445
- except :
1443
+ try : yield loads(ws.recv(timeout=2))
1444
+ except TimeoutError : continue
1445
+ except Exception:
1446
1446
  ws.close()
1447
1447
  break
1448
1448
 
1449
-
1450
1449
  # +--------------------------------------------------------------------------------------+ #
1451
1450
 
1452
1451
  def websocket_by_isin(
@@ -1520,10 +1519,10 @@ class DataEngine_TseIfb_SyncClient:
1520
1519
  ... print(update) # This will not run; method is not implemented
1521
1520
  """
1522
1521
 
1523
- if event is None :
1522
+ if not isinstance(event,Event):
1524
1523
  event = Event()
1525
1524
  event.set()
1526
-
1525
+
1527
1526
  with connect(
1528
1527
  uri=(
1529
1528
  f"wss://core.hedgetech.ir/data-engine/tse-ifb/live/data/websocket/symbol/isin?"
@@ -1535,8 +1534,8 @@ class DataEngine_TseIfb_SyncClient:
1535
1534
 
1536
1535
  while event.is_set():
1537
1536
 
1538
- try :
1539
- yield loads(ws.recv())
1540
- except :
1537
+ try : yield loads(ws.recv(timeout=2))
1538
+ except TimeoutError : continue
1539
+ except Exception:
1541
1540
  ws.close()
1542
1541
  break
@@ -118,20 +118,24 @@ class Order:
118
118
  '953097ac6ced45ca8ef205b76ca6faf2'
119
119
  """
120
120
 
121
- if self.OrderId is None :
121
+ try :
122
122
 
123
- SendOrder_Response = await self.__AuthASyncClient.httpx_Client.post(**self.__SendOrder_RequestInfo)
123
+ if self.OrderId is None :
124
124
 
125
- match SendOrder_Response.status_code :
125
+ SendOrder_Response = await self.__AuthASyncClient.httpx_Client.post(**self.__SendOrder_RequestInfo)
126
126
 
127
- case 200 :
127
+ match SendOrder_Response.status_code :
128
128
 
129
- self.OrderId = SendOrder_Response.json()['Data']['order_uuid']
130
- return None
131
-
132
- case _ : return None
133
-
134
- else : return None
129
+ case 200 :
130
+
131
+ self.OrderId = SendOrder_Response.json()['Data']['order_uuid']
132
+ return None
133
+
134
+ case _ : return None
135
+
136
+ else : return None
137
+
138
+ except : return None
135
139
 
136
140
  # +--------------------------------------------------------------------------------------+ #
137
141
  async def Edit(
@@ -177,38 +181,42 @@ class Order:
177
181
  )
178
182
  """
179
183
 
180
- if self.OrderId is not None:
181
-
182
- Edit_response = await self.__AuthASyncClient.httpx_Client.patch(
183
- url='https://core.hedgetech.ir/ems-engine/tse-ifb/order/edit',
184
- data={
185
- 'order_uuid' : self.OrderId,
186
- 'Order_ValidityType' : Order_ValidityType,
187
- 'ValidityDate' : ValidityDate,
188
- 'Price' : Price,
189
- 'Volume' : Volume
190
- }
191
- )
184
+ try :
192
185
 
186
+ if self.OrderId is not None:
193
187
 
194
- match Edit_response.status_code:
188
+ Edit_response = await self.__AuthASyncClient.httpx_Client.patch(
189
+ url='https://core.hedgetech.ir/ems-engine/tse-ifb/order/edit',
190
+ data={
191
+ 'order_uuid' : self.OrderId,
192
+ 'Order_ValidityType' : Order_ValidityType,
193
+ 'ValidityDate' : ValidityDate,
194
+ 'Price' : Price,
195
+ 'Volume' : Volume
196
+ }
197
+ )
195
198
 
196
- case 200:
197
-
198
- Edit_response = Edit_response.json()
199
+
200
+ match Edit_response.status_code:
199
201
 
200
- self.OrderId = Edit_response['Data']['order_uuid']
201
- self.ValidityType = Edit_response['Data']['order_validity_type']
202
- self.ValidityDate = ValidityDate
203
- self.Price = Edit_response['Data']['order_price']
204
- self.Volume = Edit_response['Data']['order_volume']
202
+ case 200:
203
+
204
+ Edit_response = Edit_response.json()
205
+
206
+ self.OrderId = Edit_response['Data']['order_uuid']
207
+ self.ValidityType = Edit_response['Data']['order_validity_type']
208
+ self.ValidityDate = ValidityDate
209
+ self.Price = Edit_response['Data']['order_price']
210
+ self.Volume = Edit_response['Data']['order_volume']
211
+
212
+ return None
213
+
214
+ case _ : return None
205
215
 
206
- return None
207
-
208
- case _ : return None
209
-
210
- else : return None
216
+ else : return None
211
217
 
218
+ except : return None
219
+
212
220
  # +--------------------------------------------------------------------------------------+ #
213
221
 
214
222
  async def Status(self)-> OrderStatus | None:
@@ -246,24 +254,27 @@ class Order:
246
254
  'ValidityDate': 0
247
255
  }
248
256
  """
249
-
250
- if self.OrderId is not None:
251
-
252
- status_respnse = await self.__AuthASyncClient.httpx_Client.get(
253
- url='https://core.hedgetech.ir/ems-engine/tse-ifb/order/status',
254
- params={'order_uuid' : self.OrderId}
255
- )
257
+ try :
258
+
259
+ if self.OrderId is not None:
256
260
 
257
- match status_respnse.status_code :
261
+ status_respnse = await self.__AuthASyncClient.httpx_Client.get(
262
+ url='https://core.hedgetech.ir/ems-engine/tse-ifb/order/status',
263
+ params={'order_uuid' : self.OrderId}
264
+ )
258
265
 
259
- case 200:
266
+ match status_respnse.status_code :
260
267
 
261
- return status_respnse.json()['Data']
268
+ case 200:
269
+
270
+ return status_respnse.json()['Data']
271
+
272
+ case _ : return None
262
273
 
263
- case _ : return None
264
-
265
- else : return None
274
+ else : return None
266
275
 
276
+ except : return None
277
+
267
278
  # +--------------------------------------------------------------------------------------+ #
268
279
 
269
280
  async def Delete(self)-> None:
@@ -283,26 +294,30 @@ class Order:
283
294
  >>> print(order.is_deleted)
284
295
  True
285
296
  """
286
-
287
- if self.OrderId is not None:
288
297
 
289
- Delete_respnse = await self.__AuthASyncClient.httpx_Client.delete(
290
- url= 'https://core.hedgetech.ir/ems-engine/tse-ifb/order/delete',
291
- params={'order_uuid' : self.OrderId}
292
- )
298
+ try :
293
299
 
294
-
295
- match Delete_respnse.status_code :
300
+ if self.OrderId is not None:
301
+
302
+ Delete_respnse = await self.__AuthASyncClient.httpx_Client.delete(
303
+ url= 'https://core.hedgetech.ir/ems-engine/tse-ifb/order/delete',
304
+ params={'order_uuid' : self.OrderId}
305
+ )
296
306
 
297
- case 200:
307
+
308
+ match Delete_respnse.status_code :
298
309
 
299
- self.is_deleted = True
300
- return None
301
-
302
- case _ : return None
303
-
304
- else : return None
310
+ case 200:
311
+
312
+ self.is_deleted = True
313
+ return None
314
+
315
+ case _ : return None
316
+
317
+ else : return None
305
318
 
319
+ except : return None
320
+
306
321
  # ================================================================================= #
307
322
 
308
323
  class EmsEngine_TseIfb_AsyncClient:
@@ -369,6 +384,7 @@ class EmsEngine_TseIfb_AsyncClient:
369
384
  OMS : Literal[
370
385
  'Omex | Parsian',
371
386
  'Sahra | Karamad',
387
+ 'Sahra | NIBB',
372
388
  ]
373
389
  )-> ImageFile:
374
390
 
@@ -122,20 +122,24 @@ class Order:
122
122
  '0xA23F...'
123
123
  """
124
124
 
125
- if self.OrderId is None :
126
-
127
- SendOrder_Response = self.__AuthSyncClient.httpx_Client.post(**self.__SendOrder_RequestInfo)
125
+ try :
126
+
127
+ if self.OrderId is None :
128
128
 
129
- match SendOrder_Response.status_code :
129
+ SendOrder_Response = self.__AuthSyncClient.httpx_Client.post(**self.__SendOrder_RequestInfo)
130
130
 
131
- case 200 :
132
-
133
- self.OrderId = SendOrder_Response.json()['Data']['order_uuid']
134
- return None
131
+ match SendOrder_Response.status_code :
135
132
 
136
- case _ : return None
133
+ case 200 :
134
+
135
+ self.OrderId = SendOrder_Response.json()['Data']['order_uuid']
136
+ return None
137
+
138
+ case _ : return None
139
+
140
+ else : return None
137
141
 
138
- else : return None
142
+ except : return None
139
143
 
140
144
  # +--------------------------------------------------------------------------------------+ #
141
145
 
@@ -189,37 +193,41 @@ class Order:
189
193
  )
190
194
  """
191
195
 
192
- if self.OrderId is not None:
196
+ try :
193
197
 
194
- Edit_response = self.__AuthSyncClient.httpx_Client.patch(
195
- url='https://core.hedgetech.ir/ems-engine/tse-ifb/order/edit',
196
- data={
197
- 'order_uuid' : self.OrderId,
198
- 'Order_ValidityType' : Order_ValidityType,
199
- 'ValidityDate' : ValidityDate,
200
- 'Price' : Price,
201
- 'Volume' : Volume
202
- }
203
- )
198
+ if self.OrderId is not None:
204
199
 
205
-
206
- match Edit_response.status_code:
200
+ Edit_response = self.__AuthSyncClient.httpx_Client.patch(
201
+ url='https://core.hedgetech.ir/ems-engine/tse-ifb/order/edit',
202
+ data={
203
+ 'order_uuid' : self.OrderId,
204
+ 'Order_ValidityType' : Order_ValidityType,
205
+ 'ValidityDate' : ValidityDate,
206
+ 'Price' : Price,
207
+ 'Volume' : Volume
208
+ }
209
+ )
207
210
 
208
- case 200:
209
-
210
- Edit_response = Edit_response.json()
211
-
212
- self.OrderId = Edit_response['Data']['order_uuid']
213
- self.ValidityType = Edit_response['Data']['order_validity_type']
214
- self.ValidityDate = ValidityDate
215
- self.Price = Edit_response['Data']['order_price']
216
- self.Volume = Edit_response['Data']['order_volume']
211
+
212
+ match Edit_response.status_code:
217
213
 
218
- return None
219
-
220
- case _ : return None
221
-
222
- else : return None
214
+ case 200:
215
+
216
+ Edit_response = Edit_response.json()
217
+
218
+ self.OrderId = Edit_response['Data']['order_uuid']
219
+ self.ValidityType = Edit_response['Data']['order_validity_type']
220
+ self.ValidityDate = ValidityDate
221
+ self.Price = Edit_response['Data']['order_price']
222
+ self.Volume = Edit_response['Data']['order_volume']
223
+
224
+ return None
225
+
226
+ case _ : return None
227
+
228
+ else : return None
229
+
230
+ except : return None
223
231
 
224
232
  # +--------------------------------------------------------------------------------------+ #
225
233
 
@@ -310,22 +318,26 @@ class Order:
310
318
  }
311
319
  """
312
320
 
313
- if self.OrderId is not None:
314
-
315
- status_respnse = self.__AuthSyncClient.httpx_Client.get(
316
- url='https://core.hedgetech.ir/ems-engine/tse-ifb/order/status',
317
- params={'order_uuid' : self.OrderId}
318
- )
321
+ try :
319
322
 
320
- match status_respnse.status_code :
323
+ if self.OrderId is not None:
324
+
325
+ status_respnse = self.__AuthSyncClient.httpx_Client.get(
326
+ url='https://core.hedgetech.ir/ems-engine/tse-ifb/order/status',
327
+ params={'order_uuid' : self.OrderId}
328
+ )
321
329
 
322
- case 200:
330
+ match status_respnse.status_code :
323
331
 
324
- return status_respnse.json()['Data']
332
+ case 200:
333
+
334
+ return status_respnse.json()['Data']
335
+
336
+ case _ : return None
325
337
 
326
- case _ : return None
327
-
328
- else : return None
338
+ else : return None
339
+
340
+ except : return None
329
341
 
330
342
  # +--------------------------------------------------------------------------------------+ #
331
343
 
@@ -351,24 +363,28 @@ class Order:
351
363
  True
352
364
  """
353
365
 
354
- if self.OrderId is not None:
355
-
356
- Delete_respnse = self.__AuthSyncClient.httpx_Client.delete(
357
- url= 'https://core.hedgetech.ir/ems-engine/tse-ifb/order/delete',
358
- params={'order_uuid' : self.OrderId}
359
- )
360
-
361
-
362
- match Delete_respnse.status_code :
366
+ try :
367
+
368
+ if self.OrderId is not None:
363
369
 
364
- case 200:
365
-
366
- self.is_deleted = True
367
- return None
370
+ Delete_respnse = self.__AuthSyncClient.httpx_Client.delete(
371
+ url= 'https://core.hedgetech.ir/ems-engine/tse-ifb/order/delete',
372
+ params={'order_uuid' : self.OrderId}
373
+ )
368
374
 
369
- case _ : return None
370
-
371
- else : return None
375
+
376
+ match Delete_respnse.status_code :
377
+
378
+ case 200:
379
+
380
+ self.is_deleted = True
381
+ return None
382
+
383
+ case _ : return None
384
+
385
+ else : return None
386
+
387
+ except : return None
372
388
 
373
389
  # ================================================================================= #
374
390
 
@@ -401,6 +417,7 @@ class EmsEngine_TseIfb_SyncClient:
401
417
  OMS : Literal[
402
418
  'Omex | Parsian',
403
419
  'Sahra | Karamad',
420
+ 'Sahra | NIBB',
404
421
  ]
405
422
  )-> ImageFile:
406
423
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: HedgeTech
3
- Version: 0.2.3
3
+ Version: 0.2.5
4
4
  Summary: A unified, high-performance API layer that powers all trading infrastructure across the HedgeTech ecosystem, providing modular, scalable, and real-time interfaces for market data, order management, and execution systems.
5
5
  Author-email: "hedgetech.ir" <info@hedgetech.ir>
6
6
  License: Apache License
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: HedgeTech
3
- Version: 0.2.3
3
+ Version: 0.2.5
4
4
  Summary: A unified, high-performance API layer that powers all trading infrastructure across the HedgeTech ecosystem, providing modular, scalable, and real-time interfaces for market data, order management, and execution systems.
5
5
  Author-email: "hedgetech.ir" <info@hedgetech.ir>
6
6
  License: Apache License
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "HedgeTech"
7
- version = "0.2.3"
7
+ version = "0.2.5"
8
8
  description = "A unified, high-performance API layer that powers all trading infrastructure across the HedgeTech ecosystem, providing modular, scalable, and real-time interfaces for market data, order management, and execution systems."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
File without changes
File without changes
File without changes
File without changes