chore: type _ft_has

This commit is contained in:
Matthias 2024-09-04 07:15:17 +02:00
parent d49c556291
commit 964d437c7a
17 changed files with 87 additions and 32 deletions

View File

@ -11,7 +11,7 @@ from freqtrade.enums import CandleType, MarginMode, PriceType, TradingMode
from freqtrade.exceptions import DDosProtection, OperationalException, TemporaryError from freqtrade.exceptions import DDosProtection, OperationalException, TemporaryError
from freqtrade.exchange import Exchange from freqtrade.exchange import Exchange
from freqtrade.exchange.common import retrier from freqtrade.exchange.common import retrier
from freqtrade.exchange.exchange_types import OHLCVResponse, Tickers from freqtrade.exchange.exchange_types import FtHas, OHLCVResponse, Tickers
from freqtrade.misc import deep_merge_dicts, json_load from freqtrade.misc import deep_merge_dicts, json_load
@ -19,7 +19,7 @@ logger = logging.getLogger(__name__)
class Binance(Exchange): class Binance(Exchange):
_ft_has: Dict = { _ft_has: FtHas = {
"stoploss_on_exchange": True, "stoploss_on_exchange": True,
"stop_price_param": "stopPrice", "stop_price_param": "stopPrice",
"stop_price_prop": "stopPrice", "stop_price_prop": "stopPrice",
@ -32,7 +32,7 @@ class Binance(Exchange):
"l2_limit_range": [5, 10, 20, 50, 100, 500, 1000], "l2_limit_range": [5, 10, 20, 50, 100, 500, 1000],
"ws_enabled": True, "ws_enabled": True,
} }
_ft_has_futures: Dict = { _ft_has_futures: FtHas = {
"stoploss_order_types": {"limit": "stop", "market": "stop_market"}, "stoploss_order_types": {"limit": "stop", "market": "stop_market"},
"order_time_in_force": ["GTC", "FOK", "IOC"], "order_time_in_force": ["GTC", "FOK", "IOC"],
"tickers_have_price": False, "tickers_have_price": False,

View File

@ -1,9 +1,9 @@
"""Bingx exchange subclass""" """Bingx exchange subclass"""
import logging import logging
from typing import Dict
from freqtrade.exchange import Exchange from freqtrade.exchange import Exchange
from freqtrade.exchange.exchange_types import FtHas
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -15,7 +15,7 @@ class Bingx(Exchange):
with this exchange. with this exchange.
""" """
_ft_has: Dict = { _ft_has: FtHas = {
"ohlcv_candle_limit": 1000, "ohlcv_candle_limit": 1000,
"stoploss_on_exchange": True, "stoploss_on_exchange": True,
"stoploss_order_types": {"limit": "limit", "market": "market"}, "stoploss_order_types": {"limit": "limit", "market": "market"},

View File

@ -1,9 +1,9 @@
"""Bitmart exchange subclass""" """Bitmart exchange subclass"""
import logging import logging
from typing import Dict
from freqtrade.exchange import Exchange from freqtrade.exchange import Exchange
from freqtrade.exchange.exchange_types import FtHas
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -15,7 +15,7 @@ class Bitmart(Exchange):
with this exchange. with this exchange.
""" """
_ft_has: Dict = { _ft_has: FtHas = {
"stoploss_on_exchange": False, # Bitmart API does not support stoploss orders "stoploss_on_exchange": False, # Bitmart API does not support stoploss orders
"ohlcv_candle_limit": 200, "ohlcv_candle_limit": 200,
"trades_has_history": False, # Endpoint doesn't seem to support pagination "trades_has_history": False, # Endpoint doesn't seem to support pagination

View File

@ -1,11 +1,11 @@
"""Bitvavo exchange subclass.""" """Bitvavo exchange subclass."""
import logging import logging
from typing import Dict
from ccxt import DECIMAL_PLACES from ccxt import DECIMAL_PLACES
from freqtrade.exchange import Exchange from freqtrade.exchange import Exchange
from freqtrade.exchange.exchange_types import FtHas
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -21,7 +21,7 @@ class Bitvavo(Exchange):
may still not work as expected. may still not work as expected.
""" """
_ft_has: Dict = { _ft_has: FtHas = {
"ohlcv_candle_limit": 1440, "ohlcv_candle_limit": 1440,
} }

View File

@ -11,6 +11,7 @@ from freqtrade.enums import CandleType, MarginMode, PriceType, TradingMode
from freqtrade.exceptions import DDosProtection, ExchangeError, OperationalException, TemporaryError from freqtrade.exceptions import DDosProtection, ExchangeError, OperationalException, TemporaryError
from freqtrade.exchange import Exchange from freqtrade.exchange import Exchange
from freqtrade.exchange.common import retrier from freqtrade.exchange.common import retrier
from freqtrade.exchange.exchange_types import FtHas
from freqtrade.util.datetime_helpers import dt_now, dt_ts from freqtrade.util.datetime_helpers import dt_now, dt_ts
@ -29,14 +30,14 @@ class Bybit(Exchange):
unified_account = False unified_account = False
_ft_has: Dict = { _ft_has: FtHas = {
"ohlcv_candle_limit": 1000, "ohlcv_candle_limit": 1000,
"ohlcv_has_history": True, "ohlcv_has_history": True,
"order_time_in_force": ["GTC", "FOK", "IOC", "PO"], "order_time_in_force": ["GTC", "FOK", "IOC", "PO"],
"ws_enabled": True, "ws_enabled": True,
"trades_has_history": False, # Endpoint doesn't support pagination "trades_has_history": False, # Endpoint doesn't support pagination
} }
_ft_has_futures: Dict = { _ft_has_futures: FtHas = {
"ohlcv_has_history": True, "ohlcv_has_history": True,
"mark_ohlcv_timeframe": "4h", "mark_ohlcv_timeframe": "4h",
"funding_fee_timeframe": "8h", "funding_fee_timeframe": "8h",

View File

@ -1,9 +1,9 @@
"""CoinbasePro exchange subclass""" """CoinbasePro exchange subclass"""
import logging import logging
from typing import Dict
from freqtrade.exchange import Exchange from freqtrade.exchange import Exchange
from freqtrade.exchange.exchange_types import FtHas
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -19,6 +19,6 @@ class Coinbasepro(Exchange):
may still not work as expected. may still not work as expected.
""" """
_ft_has: Dict = { _ft_has: FtHas = {
"ohlcv_candle_limit": 300, "ohlcv_candle_limit": 300,
} }

View File

@ -1,9 +1,9 @@
"""Crypto.com exchange subclass""" """Crypto.com exchange subclass"""
import logging import logging
from typing import Dict
from freqtrade.exchange import Exchange from freqtrade.exchange import Exchange
from freqtrade.exchange.exchange_types import FtHas
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -14,6 +14,6 @@ class Cryptocom(Exchange):
Contains adjustments needed for Freqtrade to work with this exchange. Contains adjustments needed for Freqtrade to work with this exchange.
""" """
_ft_has: Dict = { _ft_has: FtHas = {
"ohlcv_candle_limit": 300, "ohlcv_candle_limit": 300,
} }

View File

@ -70,6 +70,7 @@ from freqtrade.exchange.common import (
from freqtrade.exchange.exchange_types import ( from freqtrade.exchange.exchange_types import (
CcxtBalances, CcxtBalances,
CcxtPosition, CcxtPosition,
FtHas,
OHLCVResponse, OHLCVResponse,
OrderBook, OrderBook,
Ticker, Ticker,
@ -122,10 +123,11 @@ class Exchange:
# Dict to specify which options each exchange implements # Dict to specify which options each exchange implements
# This defines defaults, which can be selectively overridden by subclasses using _ft_has # This defines defaults, which can be selectively overridden by subclasses using _ft_has
# or by specifying them in the configuration. # or by specifying them in the configuration.
_ft_has_default: Dict = { _ft_has_default: FtHas = {
"stoploss_on_exchange": False, "stoploss_on_exchange": False,
"stop_price_param": "stopLossPrice", # Used for stoploss_on_exchange request "stop_price_param": "stopLossPrice", # Used for stoploss_on_exchange request
"stop_price_prop": "stopLossPrice", # Used for stoploss_on_exchange response parsing "stop_price_prop": "stopLossPrice", # Used for stoploss_on_exchange response parsing
"stoploss_order_types": {},
"order_time_in_force": ["GTC"], "order_time_in_force": ["GTC"],
"ohlcv_params": {}, "ohlcv_params": {},
"ohlcv_candle_limit": 500, "ohlcv_candle_limit": 500,
@ -156,8 +158,8 @@ class Exchange:
# Expected to be in the format {"fetchOHLCV": True} or {"fetchOHLCV": False} # Expected to be in the format {"fetchOHLCV": True} or {"fetchOHLCV": False}
"ws_enabled": False, # Set to true for exchanges with tested websocket support "ws_enabled": False, # Set to true for exchanges with tested websocket support
} }
_ft_has: Dict = {} _ft_has: FtHas = {}
_ft_has_futures: Dict = {} _ft_has_futures: FtHas = {}
_supported_trading_mode_margin_pairs: List[Tuple[TradingMode, MarginMode]] = [ _supported_trading_mode_margin_pairs: List[Tuple[TradingMode, MarginMode]] = [
# TradingMode.SPOT always supported and not required in this list # TradingMode.SPOT always supported and not required in this list
@ -466,7 +468,7 @@ class Exchange:
""" """
return int( return int(
self._ft_has.get("ohlcv_candle_limit_per_timeframe", {}).get( self._ft_has.get("ohlcv_candle_limit_per_timeframe", {}).get(
timeframe, self._ft_has.get("ohlcv_candle_limit") timeframe, str(self._ft_has.get("ohlcv_candle_limit"))
) )
) )

View File

@ -3,6 +3,53 @@ from typing import Dict, List, Optional, Tuple, TypedDict
from freqtrade.enums import CandleType from freqtrade.enums import CandleType
class FtHas(TypedDict, total=False):
order_time_in_force: List[str]
exchange_has_overrides: Dict[str, bool]
marketOrderRequiresPrice: bool
# Stoploss on exchange
stoploss_on_exchange: bool
stop_price_param: str
stop_price_prop: str
stop_price_type_field: str
stop_price_type_value_mapping: Dict
stoploss_order_types: Dict[str, str]
# ohlcv
ohlcv_params: Dict
ohlcv_candle_limit: int
ohlcv_has_history: bool
ohlcv_partial_candle: bool
ohlcv_require_since: bool
ohlcv_volume_currency: str
ohlcv_candle_limit_per_timeframe: Dict[str, int]
# Tickers
tickers_have_quoteVolume: bool
tickers_have_percentage: bool
tickers_have_bid_ask: bool
tickers_have_price: bool
# Trades
trades_limit: int
trades_pagination: str
trades_pagination_arg: str
trades_has_history: bool
trades_pagination_overlap: bool
# Orderbook
l2_limit_range: Optional[List[int]]
l2_limit_range_required: bool
# Futures
ccxt_futures_name: str # usually swap
mark_ohlcv_price: str
mark_ohlcv_timeframe: str
funding_fee_timeframe: str
floor_leverage: bool
needs_trading_fees: bool
order_props_in_contracts: List[str]
# Websocket control
ws_enabled: bool
class Ticker(TypedDict): class Ticker(TypedDict):
symbol: str symbol: str
ask: Optional[float] ask: Optional[float]

View File

@ -7,6 +7,7 @@ from typing import Any, Dict, List, Optional, Tuple
from freqtrade.constants import BuySell from freqtrade.constants import BuySell
from freqtrade.enums import MarginMode, PriceType, TradingMode from freqtrade.enums import MarginMode, PriceType, TradingMode
from freqtrade.exchange import Exchange from freqtrade.exchange import Exchange
from freqtrade.exchange.exchange_types import FtHas
from freqtrade.misc import safe_value_fallback2 from freqtrade.misc import safe_value_fallback2
@ -23,7 +24,7 @@ class Gate(Exchange):
may still not work as expected. may still not work as expected.
""" """
_ft_has: Dict = { _ft_has: FtHas = {
"ohlcv_candle_limit": 1000, "ohlcv_candle_limit": 1000,
"order_time_in_force": ["GTC", "IOC"], "order_time_in_force": ["GTC", "IOC"],
"stoploss_on_exchange": True, "stoploss_on_exchange": True,
@ -34,7 +35,7 @@ class Gate(Exchange):
"trades_has_history": False, # Endpoint would support this - but ccxt doesn't. "trades_has_history": False, # Endpoint would support this - but ccxt doesn't.
} }
_ft_has_futures: Dict = { _ft_has_futures: FtHas = {
"needs_trading_fees": True, "needs_trading_fees": True,
"marketOrderRequiresPrice": False, "marketOrderRequiresPrice": False,
"stop_price_type_field": "price_type", "stop_price_type_field": "price_type",

View File

@ -1,7 +1,7 @@
import logging import logging
from typing import Dict
from freqtrade.exchange import Exchange from freqtrade.exchange import Exchange
from freqtrade.exchange.exchange_types import FtHas
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -17,6 +17,6 @@ class Hitbtc(Exchange):
may still not work as expected. may still not work as expected.
""" """
_ft_has: Dict = { _ft_has: FtHas = {
"ohlcv_candle_limit": 1000, "ohlcv_candle_limit": 1000,
} }

View File

@ -5,6 +5,7 @@ from typing import Dict
from freqtrade.constants import BuySell from freqtrade.constants import BuySell
from freqtrade.exchange import Exchange from freqtrade.exchange import Exchange
from freqtrade.exchange.exchange_types import FtHas
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -16,7 +17,7 @@ class Htx(Exchange):
with this exchange. with this exchange.
""" """
_ft_has: Dict = { _ft_has: FtHas = {
"stoploss_on_exchange": True, "stoploss_on_exchange": True,
"stop_price_param": "stopPrice", "stop_price_param": "stopPrice",
"stop_price_prop": "stopPrice", "stop_price_prop": "stopPrice",

View File

@ -7,6 +7,7 @@ from ccxt import SIGNIFICANT_DIGITS
from freqtrade.enums import TradingMode from freqtrade.enums import TradingMode
from freqtrade.exchange import Exchange from freqtrade.exchange import Exchange
from freqtrade.exchange.exchange_types import FtHas
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -17,7 +18,7 @@ class Hyperliquid(Exchange):
Contains adjustments needed for Freqtrade to work with this exchange. Contains adjustments needed for Freqtrade to work with this exchange.
""" """
_ft_has: Dict = { _ft_has: FtHas = {
# Only the most recent 5000 candles are available according to the # Only the most recent 5000 candles are available according to the
# exchange's API documentation. # exchange's API documentation.
"ohlcv_has_history": False, "ohlcv_has_history": False,

View File

@ -1,9 +1,9 @@
"""Idex exchange subclass""" """Idex exchange subclass"""
import logging import logging
from typing import Dict
from freqtrade.exchange import Exchange from freqtrade.exchange import Exchange
from freqtrade.exchange.exchange_types import FtHas
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -15,6 +15,6 @@ class Idex(Exchange):
with this exchange. with this exchange.
""" """
_ft_has: Dict = { _ft_has: FtHas = {
"ohlcv_candle_limit": 1000, "ohlcv_candle_limit": 1000,
} }

View File

@ -12,7 +12,7 @@ from freqtrade.enums import MarginMode, TradingMode
from freqtrade.exceptions import DDosProtection, OperationalException, TemporaryError from freqtrade.exceptions import DDosProtection, OperationalException, TemporaryError
from freqtrade.exchange import Exchange from freqtrade.exchange import Exchange
from freqtrade.exchange.common import retrier from freqtrade.exchange.common import retrier
from freqtrade.exchange.exchange_types import CcxtBalances, Tickers from freqtrade.exchange.exchange_types import CcxtBalances, FtHas, Tickers
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -20,7 +20,7 @@ logger = logging.getLogger(__name__)
class Kraken(Exchange): class Kraken(Exchange):
_params: Dict = {"trading_agreement": "agree"} _params: Dict = {"trading_agreement": "agree"}
_ft_has: Dict = { _ft_has: FtHas = {
"stoploss_on_exchange": True, "stoploss_on_exchange": True,
"stop_price_param": "stopLossPrice", "stop_price_param": "stopLossPrice",
"stop_price_prop": "stopLossPrice", "stop_price_prop": "stopLossPrice",

View File

@ -5,6 +5,7 @@ from typing import Dict
from freqtrade.constants import BuySell from freqtrade.constants import BuySell
from freqtrade.exchange import Exchange from freqtrade.exchange import Exchange
from freqtrade.exchange.exchange_types import FtHas
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -20,7 +21,7 @@ class Kucoin(Exchange):
may still not work as expected. may still not work as expected.
""" """
_ft_has: Dict = { _ft_has: FtHas = {
"stoploss_on_exchange": True, "stoploss_on_exchange": True,
"stop_price_param": "stopPrice", "stop_price_param": "stopPrice",
"stop_price_prop": "stopPrice", "stop_price_prop": "stopPrice",

View File

@ -14,6 +14,7 @@ from freqtrade.exceptions import (
) )
from freqtrade.exchange import Exchange, date_minus_candles from freqtrade.exchange import Exchange, date_minus_candles
from freqtrade.exchange.common import retrier from freqtrade.exchange.common import retrier
from freqtrade.exchange.exchange_types import FtHas
from freqtrade.misc import safe_value_fallback2 from freqtrade.misc import safe_value_fallback2
from freqtrade.util import dt_now, dt_ts from freqtrade.util import dt_now, dt_ts
@ -27,7 +28,7 @@ class Okx(Exchange):
Contains adjustments needed for Freqtrade to work with this exchange. Contains adjustments needed for Freqtrade to work with this exchange.
""" """
_ft_has: Dict = { _ft_has: FtHas = {
"ohlcv_candle_limit": 100, # Warning, special case with data prior to X months "ohlcv_candle_limit": 100, # Warning, special case with data prior to X months
"mark_ohlcv_timeframe": "4h", "mark_ohlcv_timeframe": "4h",
"funding_fee_timeframe": "8h", "funding_fee_timeframe": "8h",
@ -36,7 +37,7 @@ class Okx(Exchange):
"trades_has_history": False, # Endpoint doesn't have a "since" parameter "trades_has_history": False, # Endpoint doesn't have a "since" parameter
"ws_enabled": True, "ws_enabled": True,
} }
_ft_has_futures: Dict = { _ft_has_futures: FtHas = {
"tickers_have_quoteVolume": False, "tickers_have_quoteVolume": False,
"stop_price_type_field": "slTriggerPxType", "stop_price_type_field": "slTriggerPxType",
"stop_price_type_value_mapping": { "stop_price_type_value_mapping": {