trd-utils 0.0.29__py3-none-any.whl → 0.0.31__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.

Potentially problematic release.


This version of trd-utils might be problematic. Click here for more details.

trd_utils/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
1
 
2
- __version__ = "0.0.29"
2
+ __version__ = "0.0.31"
3
3
 
@@ -59,6 +59,8 @@ class BlofinClient(ExchangeBase):
59
59
  self.account_name = account_name
60
60
  self._fav_letter = fav_letter
61
61
  self.sessions_dir = sessions_dir
62
+
63
+ super().__init__()
62
64
 
63
65
  if read_session_file:
64
66
  self.read_from_session_file(f"{sessions_dir}/{self.account_name}.bf")
@@ -636,6 +636,17 @@ class CopyTraderResumeResult(BaseModel):
636
636
  swap_copy_trade_label_type: int = None
637
637
  is_pro: int = None
638
638
 
639
+ def get_account_identity_by_filter(self, filter_text: str):
640
+ if not self.trader_sharing_accounts:
641
+ return 0
642
+
643
+ for current in self.trader_sharing_accounts:
644
+ if current.display_name.lower().find(filter_text) != -1 or \
645
+ current.copy_trade_account_enum.lower().find(filter_text) != -1:
646
+ if current.api_identity:
647
+ return current.api_identity
648
+ return 0
649
+
639
650
 
640
651
  class CopyTraderResumeResponse(BxApiResponse):
641
652
  data: CopyTraderResumeResult = None
@@ -50,6 +50,7 @@ from trd_utils.exchanges.bx_ultra.bx_types import (
50
50
  )
51
51
  from trd_utils.cipher import AESCipher
52
52
 
53
+ from trd_utils.exchanges.errors import ExchangeError
53
54
  from trd_utils.exchanges.exchange_base import ExchangeBase, JWTManager
54
55
 
55
56
  PLATFORM_ID_ANDROID = "10"
@@ -123,14 +124,12 @@ class BXUltraClient(ExchangeBase):
123
124
  self._fav_letter = fav_letter
124
125
  self.sessions_dir = sessions_dir
125
126
 
127
+ super().__init__()
126
128
  self.read_from_session_file(
127
129
  file_path=f"{self.sessions_dir}/{self.account_name}.bx"
128
130
  )
129
131
  self.__last_candle_storage = {}
130
132
  self.__last_candle_lock = asyncio.Lock()
131
- self._internal_lock = asyncio.Lock()
132
- self.extra_tasks = []
133
- self.ws_connections = []
134
133
 
135
134
  # endregion
136
135
  ###########################################################
@@ -701,6 +700,7 @@ class BXUltraClient(ExchangeBase):
701
700
  async def get_trader_api_identity(
702
701
  self,
703
702
  uid: int | str,
703
+ sub_account_filter: str = "futures",
704
704
  ) -> int | str:
705
705
  global user_api_identity_cache
706
706
  api_identity = user_api_identity_cache.get(uid, None)
@@ -709,6 +709,12 @@ class BXUltraClient(ExchangeBase):
709
709
  uid=uid,
710
710
  )
711
711
  api_identity = resume.data.api_identity
712
+ if not api_identity:
713
+ # second try: try to use one of the sub-accounts' identity
714
+ api_identity = resume.data.get_account_identity_by_filter(sub_account_filter)
715
+
716
+ # maybe also try to fetch it in other ways later?
717
+ # ...
712
718
  user_api_identity_cache[uid] = api_identity
713
719
  return api_identity
714
720
 
@@ -837,7 +843,8 @@ class BXUltraClient(ExchangeBase):
837
843
  aes = AESCipher(key=f"bx_{self.account_name}_bx", fav_letter=self._fav_letter)
838
844
  target_path = Path(file_path)
839
845
  if not target_path.exists():
840
- target_path.mkdir(parents=True)
846
+ target_path.parent.mkdir(parents=True, exist_ok=True)
847
+ target_path.touch()
841
848
  target_path.write_text(aes.encrypt(json.dumps(json_data)))
842
849
 
843
850
  # endregion
@@ -847,16 +854,30 @@ class BXUltraClient(ExchangeBase):
847
854
  async def get_unified_trader_positions(
848
855
  self,
849
856
  uid: int | str,
857
+ api_identity: int | str | None = None,
858
+ sub_account_filter: str = "futures",
850
859
  ) -> UnifiedTraderPositions:
851
- api_identity = await self.get_trader_api_identity(
852
- uid=uid,
853
- )
860
+ if not api_identity:
861
+ api_identity = await self.get_trader_api_identity(
862
+ uid=uid,
863
+ sub_account_filter=sub_account_filter,
864
+ )
865
+
866
+ if not api_identity:
867
+ raise ValueError(f"Failed to fetch api_identity for user {uid}")
854
868
 
855
869
  result = await self.get_copy_trader_positions(
856
870
  uid=uid,
857
871
  api_identity=api_identity,
858
872
  page_size=50, # TODO: make this dynamic I guess...
859
873
  )
874
+ if not result.data:
875
+ if result.msg:
876
+ raise ExchangeError(result.msg)
877
+ raise ExchangeError(
878
+ f"Unknown error happened while fetching positions of {uid}, "
879
+ f"code: {result.code}"
880
+ )
860
881
  if result.data.hide == 0 and not result.data.positions:
861
882
  # TODO: do proper exceptions here...
862
883
  raise ValueError("The trader has made their positions hidden")
@@ -66,7 +66,15 @@ class ExchangeBase(ABC):
66
66
  ws_connections: list[WSConnection] = None
67
67
  # endregion
68
68
  ###########################################################
69
+ # region constructor method
69
70
 
71
+ def __init__(self):
72
+ self._internal_lock = asyncio.Lock()
73
+ self.extra_tasks = []
74
+ self.ws_connections = []
75
+
76
+ # endregion
77
+ ###########################################################
70
78
  # region abstract trading methods
71
79
 
72
80
  async def get_unified_trader_positions(
@@ -96,7 +104,6 @@ class ExchangeBase(ABC):
96
104
  )
97
105
 
98
106
  # endregion
99
-
100
107
  ###########################################################
101
108
  # region client helper methods
102
109
  def get_headers(self, payload=None, needs_auth: bool = False) -> dict:
@@ -47,6 +47,8 @@ class HyperLiquidClient(ExchangeBase):
47
47
  self._fav_letter = fav_letter
48
48
  self.sessions_dir = sessions_dir
49
49
 
50
+ super().__init__()
51
+
50
52
  if read_session_file:
51
53
  self.read_from_session_file(f"{sessions_dir}/{self.account_name}.hl")
52
54
 
@@ -55,6 +55,8 @@ class OkxClient(ExchangeBase):
55
55
  self._fav_letter = fav_letter
56
56
  self.sessions_dir = sessions_dir
57
57
 
58
+ super().__init__()
59
+
58
60
  if read_session_file:
59
61
  self.read_from_session_file(f"{sessions_dir}/{self.account_name}.okx")
60
62
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: trd_utils
3
- Version: 0.0.29
3
+ Version: 0.0.31
4
4
  Summary: Common Basic Utils for Python3. By ALiwoto.
5
5
  Keywords: utils,trd_utils,basic-utils,common-utils
6
6
  Author: ALiwoto
@@ -1,4 +1,4 @@
1
- trd_utils/__init__.py,sha256=QVkUKrH6_jXreZzHGabcwlgKo-3pDf_WePHH5Vkg6u0,25
1
+ trd_utils/__init__.py,sha256=O97248lgCS5nee4fQ2cNH-783s7siiDuLQOhN5Lzeiw,25
2
2
  trd_utils/cipher/__init__.py,sha256=V05KNuzQwCic-ihMVHlC8sENaJGc3I8MCb4pg4849X8,1765
3
3
  trd_utils/common_utils/float_utils.py,sha256=aYPwJ005LmrRhXAngojwvdDdtRgeb1FfR6hKeQ5ndMU,470
4
4
  trd_utils/common_utils/wallet_utils.py,sha256=OX9q2fymP0VfIWTRIRBP8W33cfyjLXimxMgPOsZe-3g,727
@@ -8,20 +8,20 @@ trd_utils/exchanges/README.md,sha256=UwkpsfcoLCJaMvJe4yBsFkDpf8P6DOLYhtybb6xWMLc
8
8
  trd_utils/exchanges/__init__.py,sha256=sZRyp24q0KyMYASshAfsP-AfvsCADTYqqefxiRulPKE,484
9
9
  trd_utils/exchanges/base_types.py,sha256=NGykHGyY97mcc4gqxa0RLNElro0y3cQsdSCM1XAtIz8,3625
10
10
  trd_utils/exchanges/blofin/__init__.py,sha256=X4r9o4Nyjla4UeOBG8lrgtnGYO2aErFMKaJ7yQrFasE,76
11
- trd_utils/exchanges/blofin/blofin_client.py,sha256=x0CU75_wWRA6RmVfm2wh7y-jNjohpcMG6HJ1tqkD1ok,12342
11
+ trd_utils/exchanges/blofin/blofin_client.py,sha256=RJcyET62cjxczEdHqQ-Cy6CT8veJYio_efublNBvEo8,12378
12
12
  trd_utils/exchanges/blofin/blofin_types.py,sha256=ZlHX1ClYTd2pDRTQIlZYyBu5ReGpMgxXxKASsPeBQug,4090
13
13
  trd_utils/exchanges/bx_ultra/__init__.py,sha256=8Ssy-eOemQR32Nv1-FoPHm87nRqRO4Fm2PU5GHEFKfQ,80
14
- trd_utils/exchanges/bx_ultra/bx_types.py,sha256=oEXd825UVTINiQTKuUsJqG0qUo4bkl4Bay6cEDOAS_g,34532
15
- trd_utils/exchanges/bx_ultra/bx_ultra_client.py,sha256=WCAAPbrKoJ5f0e21mmno2z_mA7ADX2InoU_oHGrSi_Y,33467
14
+ trd_utils/exchanges/bx_ultra/bx_types.py,sha256=qg_MoaZRpfRf29Eh-W0JXUklQWt5ckoP-Ktk4faX9io,34985
15
+ trd_utils/exchanges/bx_ultra/bx_ultra_client.py,sha256=jQ2eeyiB3Y8-furMuEf-76WrlGExKsnpWQtdI3RJ66M,34391
16
16
  trd_utils/exchanges/bx_ultra/bx_utils.py,sha256=PwapomwDW33arVmKIDj6cL-aP0ptu4BYy_lOCqSAPOo,1392
17
17
  trd_utils/exchanges/errors.py,sha256=P_NTuc389XL7rFegomP59BydWmHv8ckiGyNU-_l5qNQ,167
18
- trd_utils/exchanges/exchange_base.py,sha256=6vlwQXogZaxg1wNgZWvGZ0BYv0hfjdQNdXBpV-tvHkE,7665
18
+ trd_utils/exchanges/exchange_base.py,sha256=c9SV-XyZNonbPa8DDujHGSF4CR-iweGUojsPGvphjlU,7909
19
19
  trd_utils/exchanges/hyperliquid/README.md,sha256=-qaxmDt_9NTus2xRuzyFGkKgYDWgWk7ufHVTSkyn3t4,105
20
20
  trd_utils/exchanges/hyperliquid/__init__.py,sha256=QhwGRcneGFHREM-MMdYpbcx-aWdsWsu2WznHzx7LaUM,92
21
- trd_utils/exchanges/hyperliquid/hyperliquid_client.py,sha256=dE-WIj1_H_5qHnO2Uu4DBVl1qEPdLdQFJW0IIwia1UM,6804
21
+ trd_utils/exchanges/hyperliquid/hyperliquid_client.py,sha256=FOOEDY1wOvyDlUcnSHf0Vp-8KNK2_AkI6Z7h3lls3Co,6832
22
22
  trd_utils/exchanges/hyperliquid/hyperliquid_types.py,sha256=MiGG5fRU7wHqOMtCzQXD1fwwbeUK1HEcQwW5rl-9D4c,2678
23
23
  trd_utils/exchanges/okx/__init__.py,sha256=OjVpvcwB9mrCTofLt14JRHV2-fMAzGz9-YkJAMwl6dM,67
24
- trd_utils/exchanges/okx/okx_client.py,sha256=M6P1lDJ2UDqT7WMvXgiK4BbUwa73OHvh-8Dbo51oOqo,7118
24
+ trd_utils/exchanges/okx/okx_client.py,sha256=lUf507ovd4D3fI7Z3Iy1fGvxNJWdm4wTcdzTCkMw13U,7146
25
25
  trd_utils/exchanges/okx/okx_types.py,sha256=IkFOfgivcvvIw950jyGHAVfFFGbGqfZcYGfZLWfNLvc,5013
26
26
  trd_utils/html_utils/__init__.py,sha256=1WWs8C7JszRjTkmzIRLHpxWECHur_DrulTPGIeX88oM,426
27
27
  trd_utils/html_utils/html_formats.py,sha256=unKsvOiiDmYTTaM0DYZEUNLEUzWQKKrqASJXvY54kvU,2299
@@ -30,7 +30,7 @@ trd_utils/tradingview/tradingview_client.py,sha256=g_eWYaCRQAL8Kvd-r6AnAdbH7Jha6
30
30
  trd_utils/tradingview/tradingview_types.py,sha256=z21MXPVdWHAduEl3gSeMIRhxtBN9yK-jPYHfZSMIbSA,6144
31
31
  trd_utils/types_helper/__init__.py,sha256=lLbUiW1jUV1gjzTMFLthwkvF0hwauH-F_J2JZq--1U0,67
32
32
  trd_utils/types_helper/base_model.py,sha256=Q2KK0r4UXP9PlWeIl6nxdAeCGB5InU5IkTNGAfJasfM,11808
33
- trd_utils-0.0.29.dist-info/LICENSE,sha256=J1EP2xt87RjjmsTV1jTjHDQMLIM9FjdwEftTpw8hyv4,1067
34
- trd_utils-0.0.29.dist-info/METADATA,sha256=qCh4SCHg_FdeJ0s2p06wDWzcUv_LkzFKse2Sk2mIg8s,1179
35
- trd_utils-0.0.29.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
36
- trd_utils-0.0.29.dist-info/RECORD,,
33
+ trd_utils-0.0.31.dist-info/LICENSE,sha256=J1EP2xt87RjjmsTV1jTjHDQMLIM9FjdwEftTpw8hyv4,1067
34
+ trd_utils-0.0.31.dist-info/METADATA,sha256=RFw0zRRFdg7zTNzVlNfH4W2g3J6I4NfYNea1jHohbsY,1179
35
+ trd_utils-0.0.31.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
36
+ trd_utils-0.0.31.dist-info/RECORD,,