trd-utils 0.0.39__tar.gz → 0.0.41__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.

Potentially problematic release.


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

Files changed (38) hide show
  1. {trd_utils-0.0.39 → trd_utils-0.0.41}/PKG-INFO +1 -1
  2. {trd_utils-0.0.39 → trd_utils-0.0.41}/pyproject.toml +1 -1
  3. trd_utils-0.0.41/trd_utils/__init__.py +3 -0
  4. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/exchanges/base_types.py +28 -0
  5. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/exchanges/bx_ultra/bx_ultra_client.py +14 -4
  6. trd_utils-0.0.39/trd_utils/__init__.py +0 -3
  7. {trd_utils-0.0.39 → trd_utils-0.0.41}/LICENSE +0 -0
  8. {trd_utils-0.0.39 → trd_utils-0.0.41}/README.md +0 -0
  9. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/cipher/__init__.py +0 -0
  10. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/common_utils/float_utils.py +0 -0
  11. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/common_utils/wallet_utils.py +0 -0
  12. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/date_utils/__init__.py +0 -0
  13. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/date_utils/datetime_helpers.py +0 -0
  14. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/exchanges/README.md +0 -0
  15. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/exchanges/__init__.py +0 -0
  16. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/exchanges/blofin/__init__.py +0 -0
  17. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/exchanges/blofin/blofin_client.py +0 -0
  18. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/exchanges/blofin/blofin_types.py +0 -0
  19. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/exchanges/bx_ultra/__init__.py +0 -0
  20. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/exchanges/bx_ultra/bx_types.py +0 -0
  21. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/exchanges/bx_ultra/bx_utils.py +0 -0
  22. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/exchanges/errors.py +0 -0
  23. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/exchanges/exchange_base.py +0 -0
  24. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/exchanges/hyperliquid/README.md +0 -0
  25. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/exchanges/hyperliquid/__init__.py +0 -0
  26. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/exchanges/hyperliquid/hyperliquid_client.py +0 -0
  27. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/exchanges/hyperliquid/hyperliquid_types.py +0 -0
  28. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/exchanges/okx/__init__.py +0 -0
  29. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/exchanges/okx/okx_client.py +0 -0
  30. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/exchanges/okx/okx_types.py +0 -0
  31. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/exchanges/price_fetcher.py +0 -0
  32. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/html_utils/__init__.py +0 -0
  33. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/html_utils/html_formats.py +0 -0
  34. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/tradingview/__init__.py +0 -0
  35. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/tradingview/tradingview_client.py +0 -0
  36. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/tradingview/tradingview_types.py +0 -0
  37. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/types_helper/__init__.py +0 -0
  38. {trd_utils-0.0.39 → trd_utils-0.0.41}/trd_utils/types_helper/base_model.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: trd_utils
3
- Version: 0.0.39
3
+ Version: 0.0.41
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,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "trd_utils"
3
- version = "0.0.39"
3
+ version = "0.0.41"
4
4
  description = "Common Basic Utils for Python3. By ALiwoto."
5
5
  authors = ["ALiwoto <aminnimaj@gmail.com>"]
6
6
  packages = [
@@ -0,0 +1,3 @@
1
+
2
+ __version__ = "0.0.41"
3
+
@@ -50,6 +50,34 @@ class UnifiedPositionInfo(BaseModel):
50
50
  # not all exchanges support this yet, so use it with caution.
51
51
  last_volume: Decimal | None = None
52
52
 
53
+ def recalculate_pnl(self) -> tuple[Decimal, Decimal]:
54
+ """
55
+ Recalculates the PnL based on the available data.
56
+ This requires `last_price`, `open_price`, `initial_margin`,
57
+ and `position_leverage` to be set.
58
+
59
+ Returns:
60
+ The recalculated (PnL, percentage) as a Decimal, or None if calculation
61
+ is not possible with the current data.
62
+ """
63
+ if not self.position_leverage:
64
+ self.position_leverage = 1
65
+
66
+ if not all([self.last_price, self.open_price, self.initial_margin]):
67
+ # Not enough data to calculate PnL.
68
+ return None
69
+
70
+ price_change_percentage = (self.last_price - self.open_price) / self.open_price
71
+ if self.position_side == "SHORT":
72
+ # For a short position, profit is made when the price goes down.
73
+ price_change_percentage *= -1
74
+
75
+ pnl_percentage = self.position_leverage * price_change_percentage
76
+ # PnL = Initial Margin * Leverage * Price Change %
77
+ pnl = self.initial_margin * pnl_percentage
78
+ self.position_pnl = pnl
79
+ return (pnl, pnl_percentage)
80
+
53
81
  def __str__(self):
54
82
  parts = []
55
83
 
@@ -83,7 +83,8 @@ class BXUltraClient(ExchangeBase, IPriceFetcher):
83
83
  # region client parameters
84
84
  we_api_base_host: str = "\u0061pi-\u0061pp.w\u0065-\u0061pi.com"
85
85
  we_api_base_url: str = "https://\u0061pi-\u0061pp.w\u0065-\u0061pi.com/\u0061pi"
86
- ws_we_api_base_url: str = "wss://ws-market-swap.w\u0065-\u0061pi.com/ws"
86
+ ws_we_api_base_url: str = "wss://ws-market-sw\u0061p.w\u0065-\u0061pi.com/ws"
87
+ f_ws_we_api_base_url: str = "wss://f-ws-\u0061pp.w\u0065-\u0061pi.com/market"
87
88
  original_base_host: str = "https://\u0062ing\u0078.co\u006d"
88
89
  qq_os_base_host: str = "https://\u0061pi-\u0061pp.\u0071\u0071-os.com"
89
90
  qq_os_base_url: str = "https://\u0061pi-\u0061pp.\u0071\u0071-os.com/\u0061pi"
@@ -283,7 +284,7 @@ class BXUltraClient(ExchangeBase, IPriceFetcher):
283
284
 
284
285
  # endregion
285
286
  ###########################################################
286
- # region ws-subscribes
287
+ # region ws last-candle methods
287
288
  async def do_price_subscribe(self) -> None:
288
289
  """
289
290
  Subscribes to the price changes coming from the exchange.
@@ -922,6 +923,9 @@ class BXUltraClient(ExchangeBase, IPriceFetcher):
922
923
  ) -> UnifiedTraderPositions:
923
924
  perp_positions = []
924
925
  std_positions = []
926
+ perp_ex: str = None
927
+ std_ex: str = None
928
+
925
929
  try:
926
930
  result = await self.get_unified_trader_positions_perp(
927
931
  uid=uid,
@@ -930,7 +934,7 @@ class BXUltraClient(ExchangeBase, IPriceFetcher):
930
934
  perp_positions = result.positions
931
935
  except Exception as ex:
932
936
  if not no_warn:
933
- logger.warning(f"Failed to fetch perp positions of {uid}: {ex}")
937
+ perp_ex = f"{ex}"
934
938
 
935
939
  try:
936
940
  result = await self.get_unified_trader_positions_std(
@@ -939,7 +943,13 @@ class BXUltraClient(ExchangeBase, IPriceFetcher):
939
943
  std_positions = result.positions
940
944
  except Exception as ex:
941
945
  if not no_warn:
942
- logger.warning(f"Failed to fetch std positions of {uid}: {ex}")
946
+ std_ex = f"{ex}"
947
+
948
+ if not perp_positions and not std_positions:
949
+ if perp_ex:
950
+ logger.warning(f"Failed to fetch perp positions of {uid}: {perp_ex}")
951
+ if std_ex:
952
+ logger.warning(f"Failed to fetch std positions of {uid}: {std_ex}")
943
953
 
944
954
  unified_result = UnifiedTraderPositions()
945
955
  unified_result.positions = perp_positions + std_positions
@@ -1,3 +0,0 @@
1
-
2
- __version__ = "0.0.39"
3
-
File without changes
File without changes