1515
1616import warnings
1717from decimal import Decimal
18- from typing import Self
18+ from typing import Self , cast
1919
2020from kraken .base_api import SpotClient , defined , ensure_string
2121
@@ -911,10 +911,9 @@ def get_ledgers(
911911 extra_params = extra_params ,
912912 )
913913
914- @ensure_string ("pair" )
915914 def get_trade_volume (
916915 self : User ,
917- pair : str | list [str ] | None = None ,
916+ pair : str | list [str ] | list [ dict [ str , str ]] | None = None ,
918917 * ,
919918 fee_info : bool | None = None ,
920919 fee_schedule : bool | None = None ,
@@ -927,9 +926,11 @@ def get_trade_volume(
927926
928927 - https://docs.kraken.com/api/docs/rest-api/get-trade-volume
929928
930- :param pair: Asset pair, list of asset pairs or comma delimited list (as
931- string) of asset pairs to filter
932- :type pair: str | list[str], optional
929+ :param pair: Asset pair, list of asset pairs, or comma delimited list
930+ (as string) of asset pairs to filter. For non-forex asset classes
931+ (e.g., ``derivatives``, ``equity_pair``), pass a list of
932+ ``{"asset": ..., "aclass": ...}`` objects instead.
933+ :type pair: str | list[str] | list[dict[str, str]], optional
933934 :param fee_info: Deprecated and without effect (default: ``None``).
934935 Kraken now derives fee inclusion from ``pair`` alone and treats
935936 this as a legacy no-op parameter. Passing it emits a
@@ -1002,6 +1003,24 @@ def get_trade_volume(
10021003 }
10031004 ]
10041005 }
1006+ >>> u.get_trade_volume(
1007+ ... pair=[{"asset": "PF_XBTUSD", "aclass": "derivatives"}],
1008+ ... )
1009+ {
1010+ 'currency': 'ZUSD',
1011+ 'volume': '212243.1210',
1012+ 'fees': {
1013+ 'PF_XBTUSD': {
1014+ 'fee': '0.2200',
1015+ 'minfee': '0.1000',
1016+ 'maxfee': '0.2200',
1017+ 'nextfee': '0.2000',
1018+ 'tiervolume': '0.0000',
1019+ 'nextvolume': '250000.0000'
1020+ }
1021+ },
1022+ 'fees_maker': {...}
1023+ }
10051024
10061025 """
10071026 if defined (fee_info ):
@@ -1014,8 +1033,19 @@ def get_trade_volume(
10141033 stacklevel = 3 ,
10151034 )
10161035 params : dict = {}
1036+ # A list of {"asset": ..., "aclass": ...} objects is required to
1037+ # request fees for non-forex classes (e.g., derivatives, equity_pair)
1038+ # and must be sent as a JSON body rather than joined into a string.
1039+ pair_is_objects = (
1040+ isinstance (pair , list ) and bool (pair ) and isinstance (pair [0 ], dict )
1041+ )
10171042 if defined (pair ):
1018- params ["pair" ] = pair
1043+ if pair_is_objects :
1044+ params ["pair" ] = pair
1045+ elif isinstance (pair , list ):
1046+ params ["pair" ] = "," .join (cast ("list[str]" , pair ))
1047+ else :
1048+ params ["pair" ] = pair
10191049 if defined (fee_schedule ):
10201050 # Kraken validates this parameter strictly against the JSON
10211051 # boolean literals "true"/"false" and rejects the default
@@ -1026,6 +1056,7 @@ def get_trade_volume(
10261056 method = "POST" ,
10271057 uri = "/0/private/TradeVolume" ,
10281058 params = params ,
1059+ do_json = pair_is_objects ,
10291060 extra_params = extra_params ,
10301061 )
10311062
0 commit comments