diff --git a/freqtrade/constants.py b/freqtrade/constants.py index 08048c3e7..b2e707d1a 100644 --- a/freqtrade/constants.py +++ b/freqtrade/constants.py @@ -681,6 +681,7 @@ EntryExit = Literal['entry', 'exit'] BuySell = Literal['buy', 'sell'] MakerTaker = Literal['maker', 'taker'] BidAsk = Literal['bid', 'ask'] +OBLiteral = Literal['asks', 'bids'] Config = Dict[str, Any] IntOrInf = float diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 60a058952..78390e3a4 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -18,6 +18,7 @@ from freqtrade.data.history import load_pair_history from freqtrade.enums import CandleType, RPCMessageType, RunMode from freqtrade.exceptions import ExchangeError, OperationalException from freqtrade.exchange import Exchange, timeframe_to_seconds +from freqtrade.exchange.types import OrderBook from freqtrade.misc import append_candles_to_dataframe from freqtrade.rpc import RPCManager from freqtrade.util import PeriodicCache @@ -489,7 +490,7 @@ class DataProvider: except ExchangeError: return {} - def orderbook(self, pair: str, maximum: int) -> Dict[str, List]: + def orderbook(self, pair: str, maximum: int) -> OrderBook: """ Fetch latest l2 orderbook data Warning: Does a network request - so use with common sense. diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 3a32824fc..77d4ff4c7 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -21,7 +21,7 @@ from pandas import DataFrame, concat from freqtrade.constants import (DEFAULT_AMOUNT_RESERVE_PERCENT, NON_OPEN_EXCHANGE_STATES, BidAsk, BuySell, Config, EntryExit, ListPairsWithTimeframes, MakerTaker, - PairWithTimeframe) + OBLiteral, PairWithTimeframe) from freqtrade.data.converter import clean_ohlcv_dataframe, ohlcv_to_dataframe, trades_dict_to_list from freqtrade.enums import OPTIMIZE_MODES, CandleType, MarginMode, TradingMode from freqtrade.enums.pricetype import PriceType @@ -37,7 +37,7 @@ from freqtrade.exchange.exchange_utils import (CcxtModuleType, amount_to_contrac price_to_precision, timeframe_to_minutes, timeframe_to_msecs, timeframe_to_next_date, timeframe_to_prev_date, timeframe_to_seconds) -from freqtrade.exchange.types import OHLCVResponse, Ticker, Tickers +from freqtrade.exchange.types import OHLCVResponse, OrderBook, Ticker, Tickers from freqtrade.misc import (chunks, deep_merge_dicts, file_dump_json, file_load_json, safe_value_fallback2) from freqtrade.plugins.pairlist.pairlist_helpers import expand_pairlist @@ -901,7 +901,7 @@ class Exchange: """ if self.exchange_has('fetchL2OrderBook'): ob = self.fetch_l2_order_book(pair, 20) - ob_type = 'asks' if side == 'buy' else 'bids' + ob_type: OBLiteral = 'asks' if side == 'buy' else 'bids' slippage = 0.05 max_slippage_val = rate * ((1 + slippage) if side == 'buy' else (1 - slippage)) @@ -1511,7 +1511,7 @@ class Exchange: return result @retrier - def fetch_l2_order_book(self, pair: str, limit: int = 100) -> dict: + def fetch_l2_order_book(self, pair: str, limit: int = 100) -> OrderBook: """ Get L2 order book from exchange. Can be limited to a certain amount (if supported). @@ -1554,7 +1554,7 @@ class Exchange: def get_rate(self, pair: str, refresh: bool, side: EntryExit, is_short: bool, - order_book: Optional[dict] = None, ticker: Optional[Ticker] = None) -> float: + order_book: Optional[OrderBook] = None, ticker: Optional[Ticker] = None) -> float: """ Calculates bid/ask target bid rate - between current ask price and last price @@ -1592,7 +1592,8 @@ class Exchange: logger.debug('order_book %s', order_book) # top 1 = index 0 try: - rate = order_book[f"{price_side}s"][order_book_top - 1][0] + obside: OBLiteral = 'bids' if price_side == 'bid' else 'asks' + rate = order_book[obside][order_book_top - 1][0] except (IndexError, KeyError) as e: logger.warning( f"{pair} - {name} Price at location {order_book_top} from orderbook " diff --git a/freqtrade/exchange/types.py b/freqtrade/exchange/types.py index 813b09297..1b71c9708 100644 --- a/freqtrade/exchange/types.py +++ b/freqtrade/exchange/types.py @@ -15,6 +15,15 @@ class Ticker(TypedDict): # Several more - only listing required. +class OrderBook(TypedDict): + symbol: str + bids: List[Tuple[float, float]] + asks: List[Tuple[float, float]] + timestamp: int + datetime: str + nonce: int + + Tickers = Dict[str, Ticker] # pair, timeframe, candleType, OHLCV, drop last?,