diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 94867b0a4..5b3b9eab4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ "ubuntu-20.04", "ubuntu-22.04", "ubuntu-24.04" ] + os: [ "ubuntu-22.04", "ubuntu-24.04" ] python-version: ["3.10", "3.11", "3.12"] steps: diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c29be656b..2c284eb6f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,7 +9,7 @@ repos: # stages: [push] - repo: https://github.com/pre-commit/mirrors-mypy - rev: "v1.14.1" + rev: "v1.15.0" hooks: - id: mypy exclude: build_helpers @@ -19,11 +19,11 @@ repos: - types-requests==2.32.0.20241016 - types-tabulate==0.9.0.20241207 - types-python-dateutil==2.9.0.20241206 - - SQLAlchemy==2.0.37 + - SQLAlchemy==2.0.38 # stages: [push] - repo: https://github.com/pycqa/isort - rev: "5.13.2" + rev: "6.0.0" hooks: - id: isort name: isort (python) @@ -31,7 +31,7 @@ repos: - repo: https://github.com/charliermarsh/ruff-pre-commit # Ruff version. - rev: 'v0.9.2' + rev: 'v0.9.6' hooks: - id: ruff - id: ruff-format @@ -62,7 +62,7 @@ repos: - id: strip-exif - repo: https://github.com/codespell-project/codespell - rev: v2.3.0 + rev: v2.4.1 hooks: - id: codespell additional_dependencies: diff --git a/Dockerfile b/Dockerfile index 13be64923..8398492ce 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.7-slim-bookworm as base +FROM python:3.12.8-slim-bookworm as base # Setup env ENV LANG C.UTF-8 diff --git a/build_helpers/ta_lib-0.4.34-cp311-cp311-win_amd64.whl b/build_helpers/ta_lib-0.4.38-cp310-cp310-win_amd64.whl similarity index 67% rename from build_helpers/ta_lib-0.4.34-cp311-cp311-win_amd64.whl rename to build_helpers/ta_lib-0.4.38-cp310-cp310-win_amd64.whl index 3513df4ba..00610d687 100644 Binary files a/build_helpers/ta_lib-0.4.34-cp311-cp311-win_amd64.whl and b/build_helpers/ta_lib-0.4.38-cp310-cp310-win_amd64.whl differ diff --git a/build_helpers/ta_lib-0.4.34-cp311-cp311-linux_armv7l.whl b/build_helpers/ta_lib-0.4.38-cp311-cp311-linux_armv7l.whl similarity index 50% rename from build_helpers/ta_lib-0.4.34-cp311-cp311-linux_armv7l.whl rename to build_helpers/ta_lib-0.4.38-cp311-cp311-linux_armv7l.whl index 581361925..a255164d0 100644 Binary files a/build_helpers/ta_lib-0.4.34-cp311-cp311-linux_armv7l.whl and b/build_helpers/ta_lib-0.4.38-cp311-cp311-linux_armv7l.whl differ diff --git a/build_helpers/ta_lib-0.4.34-cp310-cp310-win_amd64.whl b/build_helpers/ta_lib-0.4.38-cp311-cp311-win_amd64.whl similarity index 67% rename from build_helpers/ta_lib-0.4.34-cp310-cp310-win_amd64.whl rename to build_helpers/ta_lib-0.4.38-cp311-cp311-win_amd64.whl index 32bb10e4f..7237604ba 100644 Binary files a/build_helpers/ta_lib-0.4.34-cp310-cp310-win_amd64.whl and b/build_helpers/ta_lib-0.4.38-cp311-cp311-win_amd64.whl differ diff --git a/build_helpers/ta_lib-0.4.34-cp312-cp312-win_amd64.whl b/build_helpers/ta_lib-0.4.38-cp312-cp312-win_amd64.whl similarity index 67% rename from build_helpers/ta_lib-0.4.34-cp312-cp312-win_amd64.whl rename to build_helpers/ta_lib-0.4.38-cp312-cp312-win_amd64.whl index 212668e58..fe37c8468 100644 Binary files a/build_helpers/ta_lib-0.4.34-cp312-cp312-win_amd64.whl and b/build_helpers/ta_lib-0.4.38-cp312-cp312-win_amd64.whl differ diff --git a/docker/Dockerfile.armhf b/docker/Dockerfile.armhf index 1ee0ded9e..ccc039a9d 100644 --- a/docker/Dockerfile.armhf +++ b/docker/Dockerfile.armhf @@ -1,4 +1,4 @@ -FROM python:3.11.10-slim-bookworm as base +FROM python:3.11.11-slim-bookworm as base # Setup env ENV LANG C.UTF-8 diff --git a/docs/requirements-docs.txt b/docs/requirements-docs.txt index 333e4d08d..b71ff4682 100644 --- a/docs/requirements-docs.txt +++ b/docs/requirements-docs.txt @@ -1,7 +1,7 @@ markdown==3.7 mkdocs==1.6.1 -mkdocs-material==9.5.50 +mkdocs-material==9.6.3 mdx_truly_sane_lists==1.3 -pymdown-extensions==10.14.1 +pymdown-extensions==10.14.3 jinja2==3.1.5 mike==2.1.3 diff --git a/freqtrade/__init__.py b/freqtrade/__init__.py index dd95367bf..e93de1dbc 100644 --- a/freqtrade/__init__.py +++ b/freqtrade/__init__.py @@ -1,6 +1,6 @@ """Freqtrade bot""" -__version__ = "2025.1-dev" +__version__ = "2025.2-dev" if "dev" in __version__: from pathlib import Path diff --git a/freqtrade/data/history/history_utils.py b/freqtrade/data/history/history_utils.py index 47c323152..806fd49da 100644 --- a/freqtrade/data/history/history_utils.py +++ b/freqtrade/data/history/history_utils.py @@ -18,8 +18,7 @@ from freqtrade.enums import CandleType, TradingMode from freqtrade.exceptions import OperationalException from freqtrade.exchange import Exchange from freqtrade.plugins.pairlist.pairlist_helpers import dynamic_expand_pairlist -from freqtrade.util import dt_now, dt_ts, format_ms_time -from freqtrade.util.datetime_helpers import format_ms_time_det +from freqtrade.util import dt_now, dt_ts, format_ms_time, format_ms_time_det from freqtrade.util.migrations import migrate_data from freqtrade.util.progress_tracker import CustomProgress, retrieve_progress_tracker diff --git a/freqtrade/exchange/__init__.py b/freqtrade/exchange/__init__.py index 0d1176b35..01f9d93ed 100644 --- a/freqtrade/exchange/__init__.py +++ b/freqtrade/exchange/__init__.py @@ -10,7 +10,6 @@ from freqtrade.exchange.bitmart import Bitmart from freqtrade.exchange.bitpanda import Bitpanda from freqtrade.exchange.bitvavo import Bitvavo from freqtrade.exchange.bybit import Bybit -from freqtrade.exchange.coinbasepro import Coinbasepro from freqtrade.exchange.cryptocom import Cryptocom from freqtrade.exchange.exchange_utils import ( ROUND_DOWN, diff --git a/freqtrade/exchange/binance.py b/freqtrade/exchange/binance.py index be7d5db92..28fc8c031 100644 --- a/freqtrade/exchange/binance.py +++ b/freqtrade/exchange/binance.py @@ -33,7 +33,6 @@ class Binance(Exchange): "stop_price_prop": "stopPrice", "stoploss_order_types": {"limit": "stop_loss_limit"}, "order_time_in_force": ["GTC", "FOK", "IOC", "PO"], - "ohlcv_candle_limit": 1000, "trades_pagination": "id", "trades_pagination_arg": "fromId", "trades_has_history": True, @@ -41,6 +40,7 @@ class Binance(Exchange): "ws_enabled": True, } _ft_has_futures: FtHas = { + "funding_fee_candle_limit": 1000, "stoploss_order_types": {"limit": "stop", "market": "stop_market"}, "order_time_in_force": ["GTC", "FOK", "IOC"], "tickers_have_price": False, @@ -144,9 +144,10 @@ class Binance(Exchange): :param candle_type: Any of the enum CandleType (must match trading mode!) """ if is_new_pair: - x = self.loop.run_until_complete( - self._async_get_candle_history(pair, timeframe, candle_type, 0) - ) + with self._loop_lock: + x = self.loop.run_until_complete( + self._async_get_candle_history(pair, timeframe, candle_type, 0) + ) if x and x[3] and x[3][0] and x[3][0][0] > since_ms: # Set starting date to first available candle. since_ms = x[3][0][0] @@ -205,16 +206,17 @@ class Binance(Exchange): """ Fastly fetch OHLCV data by leveraging https://data.binance.vision. """ - df = self.loop.run_until_complete( - download_archive_ohlcv( - candle_type=candle_type, - pair=pair, - timeframe=timeframe, - since_ms=since_ms, - until_ms=until_ms, - markets=self.markets, + with self._loop_lock: + df = self.loop.run_until_complete( + download_archive_ohlcv( + candle_type=candle_type, + pair=pair, + timeframe=timeframe, + since_ms=since_ms, + until_ms=until_ms, + markets=self.markets, + ) ) - ) # download the remaining data from rest API if df.empty: diff --git a/freqtrade/exchange/binance_leverage_tiers.json b/freqtrade/exchange/binance_leverage_tiers.json index 3a2be5e84..d0b977e44 100644 --- a/freqtrade/exchange/binance_leverage_tiers.json +++ b/freqtrade/exchange/binance_leverage_tiers.json @@ -7,10 +7,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -24,10 +24,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -41,10 +41,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -58,10 +58,10 @@ "minNotional": 30000.0, "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "60000", "notionalFloor": "30000", "maintMarginRatio": "0.025", @@ -75,10 +75,10 @@ "minNotional": 60000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "8", "notionalCap": "300000", "notionalFloor": "60000", "maintMarginRatio": "0.05", @@ -141,13 +141,13 @@ "symbol": "1000000MOG/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "3000000", + "notionalCap": "2000000", "notionalFloor": "1500000", "maintMarginRatio": "0.5", "cum": "500475.0" @@ -610,10 +610,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -627,10 +627,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -644,10 +644,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 15.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "15", + "initialLeverage": "8", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -661,10 +661,10 @@ "minNotional": 30000.0, "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "10", + "initialLeverage": "7", "notionalCap": "60000", "notionalFloor": "30000", "maintMarginRatio": "0.025", @@ -678,10 +678,10 @@ "minNotional": 60000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "8", + "initialLeverage": "6", "notionalCap": "300000", "notionalFloor": "60000", "maintMarginRatio": "0.05", @@ -1606,13 +1606,13 @@ "symbol": "1000SATS/USDT:USDT", "currency": "USDT", "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "maxNotional": 7000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "7500000", + "notionalCap": "7000000", "notionalFloor": "6000000", "maintMarginRatio": "0.125", "cum": "316850.0" @@ -1622,34 +1622,34 @@ "tier": 8.0, "symbol": "1000SATS/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 7000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "8000000", + "notionalFloor": "7000000", "maintMarginRatio": "0.25", - "cum": "1254350.0" + "cum": "1191850.0" } }, { "tier": 9.0, "symbol": "1000SATS/USDT:USDT", "currency": "USDT", - "minNotional": 15000000.0, - "maxNotional": 30000000.0, + "minNotional": 8000000.0, + "maxNotional": 9000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "15000000", + "notionalCap": "9000000", + "notionalFloor": "8000000", "maintMarginRatio": "0.5", - "cum": "5004350.0" + "cum": "3191850.0" } } ], @@ -1988,10 +1988,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -2005,10 +2005,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -2022,10 +2022,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -2039,10 +2039,10 @@ "minNotional": 30000.0, "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "60000", "notionalFloor": "30000", "maintMarginRatio": "0.025", @@ -2056,10 +2056,10 @@ "minNotional": 60000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "8", "notionalCap": "300000", "notionalFloor": "60000", "maintMarginRatio": "0.05", @@ -2105,13 +2105,13 @@ "symbol": "1000WHY/USDT:USDT", "currency": "USDT", "minNotional": 750000.0, - "maxNotional": 1500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "1500000", + "notionalCap": "1000000", "notionalFloor": "750000", "maintMarginRatio": "0.25", "cum": "125475.0" @@ -2121,17 +2121,17 @@ "tier": 9.0, "symbol": "1000WHY/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 1000000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "1500000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "500475.0" + "cum": "375475.0" } } ], @@ -2143,10 +2143,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -2160,10 +2160,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -2177,10 +2177,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -2194,10 +2194,10 @@ "minNotional": 30000.0, "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "60000", "notionalFloor": "30000", "maintMarginRatio": "0.025", @@ -2211,10 +2211,10 @@ "minNotional": 60000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "8", "notionalCap": "300000", "notionalFloor": "60000", "maintMarginRatio": "0.05", @@ -2243,13 +2243,13 @@ "symbol": "1000X/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, - "maxNotional": 750000.0, + "maxNotional": 700000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "750000", + "notionalCap": "700000", "notionalFloor": "600000", "maintMarginRatio": "0.125", "cum": "31725.0" @@ -2259,34 +2259,34 @@ "tier": 8.0, "symbol": "1000X/USDT:USDT", "currency": "USDT", - "minNotional": 750000.0, - "maxNotional": 1500000.0, + "minNotional": 700000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "1500000", - "notionalFloor": "750000", + "notionalCap": "800000", + "notionalFloor": "700000", "maintMarginRatio": "0.25", - "cum": "125475.0" + "cum": "119225.0" } }, { "tier": 9.0, "symbol": "1000X/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 800000.0, + "maxNotional": 900000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "900000", + "notionalFloor": "800000", "maintMarginRatio": "0.5", - "cum": "500475.0" + "cum": "319225.0" } } ], @@ -3056,10 +3056,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.015", @@ -3073,10 +3073,10 @@ "minNotional": 5000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "20000", "notionalFloor": "5000", "maintMarginRatio": "0.02", @@ -3090,10 +3090,10 @@ "minNotional": 20000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "25000", "notionalFloor": "20000", "maintMarginRatio": "0.025", @@ -3107,10 +3107,10 @@ "minNotional": 25000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "4", - "initialLeverage": "10", + "initialLeverage": "8", "notionalCap": "200000", "notionalFloor": "25000", "maintMarginRatio": "0.05", @@ -3173,13 +3173,13 @@ "symbol": "ACH/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "2000000", + "notionalCap": "1500000", "notionalFloor": "1000000", "maintMarginRatio": "0.5", "cum": "333250.0" @@ -3311,13 +3311,13 @@ "symbol": "ACT/USDT:USDT", "currency": "USDT", "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "maxNotional": 12000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "20000000", + "notionalCap": "12000000", "notionalFloor": "10000000", "maintMarginRatio": "0.25", "cum": "1672450.0" @@ -3327,17 +3327,17 @@ "tier": 9.0, "symbol": "ACT/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 40000000.0, + "minNotional": 12000000.0, + "maxNotional": 14000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "40000000", - "notionalFloor": "20000000", + "notionalCap": "14000000", + "notionalFloor": "12000000", "maintMarginRatio": "0.5", - "cum": "6672450.0" + "cum": "4672450.0" } } ], @@ -3831,10 +3831,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -3848,10 +3848,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -3865,10 +3865,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -3882,10 +3882,10 @@ "minNotional": 30000.0, "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "60000", "notionalFloor": "30000", "maintMarginRatio": "0.025", @@ -3899,10 +3899,10 @@ "minNotional": 60000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "8", "notionalCap": "300000", "notionalFloor": "60000", "maintMarginRatio": "0.05", @@ -3965,13 +3965,13 @@ "symbol": "AERO/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "3000000", + "notionalCap": "2000000", "notionalFloor": "1500000", "maintMarginRatio": "0.5", "cum": "500475.0" @@ -5003,10 +5003,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -5020,10 +5020,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -5037,10 +5037,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -5054,10 +5054,10 @@ "minNotional": 30000.0, "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "60000", "notionalFloor": "30000", "maintMarginRatio": "0.025", @@ -5071,10 +5071,10 @@ "minNotional": 60000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "8", "notionalCap": "300000", "notionalFloor": "60000", "maintMarginRatio": "0.05", @@ -5137,13 +5137,13 @@ "symbol": "ALCH/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "3000000", + "notionalCap": "2000000", "notionalFloor": "1500000", "maintMarginRatio": "0.5", "cum": "500475.0" @@ -6012,6 +6012,161 @@ } } ], + "ANIME/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "ANIME/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "ANIME/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "ANIME/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "ANIME/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "ANIME/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "ANIME/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "16725.0" + } + }, + { + "tier": 7.0, + "symbol": "ANIME/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "ANIME/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "125475.0" + } + }, + { + "tier": 9.0, + "symbol": "ANIME/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "500475.0" + } + } + ], "ANKR/USDT:USDT": [ { "tier": 1.0, @@ -6224,13 +6379,13 @@ "symbol": "APE/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 5000000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "6", "initialLeverage": "10", - "notionalCap": "5000000", + "notionalCap": "3000000", "notionalFloor": "1000000", "maintMarginRatio": "0.05", "cum": "28337.5" @@ -6240,68 +6395,68 @@ "tier": 7.0, "symbol": "APE/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 3000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "7", "initialLeverage": "5", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "4000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.1", - "cum": "278337.5" + "cum": "178337.5" } }, { "tier": 8.0, "symbol": "APE/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 12500000.0, + "minNotional": 4000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "8", "initialLeverage": "4", - "notionalCap": "12500000", - "notionalFloor": "10000000", + "notionalCap": "5000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.125", - "cum": "528337.5" + "cum": "278337.5" } }, { "tier": 9.0, "symbol": "APE/USDT:USDT", "currency": "USDT", - "minNotional": 12500000.0, - "maxNotional": 25000000.0, + "minNotional": 5000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "25000000", - "notionalFloor": "12500000", + "notionalCap": "6000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.25", - "cum": "2090837.5" + "cum": "903337.5" } }, { "tier": 10.0, "symbol": "APE/USDT:USDT", "currency": "USDT", - "minNotional": 25000000.0, - "maxNotional": 50000000.0, + "minNotional": 6000000.0, + "maxNotional": 7000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "25000000", + "notionalCap": "7000000", + "notionalFloor": "6000000", "maintMarginRatio": "0.5", - "cum": "8340837.5" + "cum": "2403337.5" } } ], @@ -6899,10 +7054,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.006, - "maxLeverage": 75.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.006", @@ -6916,10 +7071,10 @@ "minNotional": 5000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "50000", "notionalFloor": "5000", "maintMarginRatio": "0.01", @@ -6933,10 +7088,10 @@ "minNotional": 50000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 40.0, + "maxLeverage": 15.0, "info": { "bracket": "3", - "initialLeverage": "40", + "initialLeverage": "15", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.015", @@ -6950,10 +7105,10 @@ "minNotional": 100000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "500000", "notionalFloor": "100000", "maintMarginRatio": "0.02", @@ -6967,10 +7122,10 @@ "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "5", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.025", @@ -6984,10 +7139,10 @@ "minNotional": 1000000.0, "maxNotional": 5000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "6", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "5000000", "notionalFloor": "1000000", "maintMarginRatio": "0.05", @@ -6999,13 +7154,13 @@ "symbol": "ARB/USDT:USDT", "currency": "USDT", "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "7", "initialLeverage": "5", - "notionalCap": "10000000", + "notionalCap": "6000000", "notionalFloor": "5000000", "maintMarginRatio": "0.1", "cum": "278270.0" @@ -7015,51 +7170,51 @@ "tier": 8.0, "symbol": "ARB/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 12500000.0, + "minNotional": 6000000.0, + "maxNotional": 7000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "8", "initialLeverage": "4", - "notionalCap": "12500000", - "notionalFloor": "10000000", + "notionalCap": "7000000", + "notionalFloor": "6000000", "maintMarginRatio": "0.125", - "cum": "528270.0" + "cum": "428270.0" } }, { "tier": 9.0, "symbol": "ARB/USDT:USDT", "currency": "USDT", - "minNotional": 12500000.0, - "maxNotional": 25000000.0, + "minNotional": 7000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "25000000", - "notionalFloor": "12500000", + "notionalCap": "8000000", + "notionalFloor": "7000000", "maintMarginRatio": "0.25", - "cum": "2090770.0" + "cum": "1303270.0" } }, { "tier": 10.0, "symbol": "ARB/USDT:USDT", "currency": "USDT", - "minNotional": 25000000.0, - "maxNotional": 50000000.0, + "minNotional": 8000000.0, + "maxNotional": 9000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "25000000", + "notionalCap": "9000000", + "notionalFloor": "8000000", "maintMarginRatio": "0.5", - "cum": "8340770.0" + "cum": "3303270.0" } } ], @@ -9468,10 +9623,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -9485,10 +9640,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 20.0, + "maxLeverage": 9.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "9", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -9502,10 +9657,10 @@ "minNotional": 30000.0, "maxNotional": 150000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 15.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "15", + "initialLeverage": "8", "notionalCap": "150000", "notionalFloor": "30000", "maintMarginRatio": "0.02", @@ -9519,10 +9674,10 @@ "minNotional": 150000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "10", + "initialLeverage": "7", "notionalCap": "300000", "notionalFloor": "150000", "maintMarginRatio": "0.025", @@ -9536,10 +9691,10 @@ "minNotional": 300000.0, "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "8", + "initialLeverage": "6", "notionalCap": "1500000", "notionalFloor": "300000", "maintMarginRatio": "0.05", @@ -9602,13 +9757,13 @@ "symbol": "BAN/USDT:USDT", "currency": "USDT", "minNotional": 4000000.0, - "maxNotional": 4500000.0, + "maxNotional": 4100000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "4500000", + "notionalCap": "4100000", "notionalFloor": "4000000", "maintMarginRatio": "0.5", "cum": "1595950.0" @@ -10804,6 +10959,161 @@ } } ], + "BERA/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "BERA/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "BERA/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "BERA/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "BERA/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "BERA/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "BERA/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "16725.0" + } + }, + { + "tier": 7.0, + "symbol": "BERA/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "BERA/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "125475.0" + } + }, + { + "tier": 9.0, + "symbol": "BERA/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "500475.0" + } + } + ], "BICO/USDT:USDT": [ { "tier": 1.0, @@ -11984,10 +12294,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 26.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "26", + "initialLeverage": "10", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -12001,10 +12311,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 25.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "8", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -12018,10 +12328,10 @@ "minNotional": 20000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "3", - "initialLeverage": "20", + "initialLeverage": "7", "notionalCap": "100000", "notionalFloor": "20000", "maintMarginRatio": "0.02", @@ -12035,10 +12345,10 @@ "minNotional": 100000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "15", + "initialLeverage": "6", "notionalCap": "200000", "notionalFloor": "100000", "maintMarginRatio": "0.025", @@ -12052,10 +12362,10 @@ "minNotional": 200000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "1000000", "notionalFloor": "200000", "maintMarginRatio": "0.05", @@ -12069,10 +12379,10 @@ "minNotional": 1000000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "2000000", "notionalFloor": "1000000", "maintMarginRatio": "0.1", @@ -12086,10 +12396,10 @@ "minNotional": 2000000.0, "maxNotional": 2500000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "2500000", "notionalFloor": "2000000", "maintMarginRatio": "0.125", @@ -14774,13 +15084,13 @@ "symbol": "CFX/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, - "maxNotional": 3000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "3000000", + "notionalCap": "2000000", "notionalFloor": "600000", "maintMarginRatio": "0.05", "cum": "17350.0" @@ -14790,68 +15100,68 @@ "tier": 6.0, "symbol": "CFX/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.1", - "cum": "167350.0" + "cum": "117350.0" } }, { "tier": 7.0, "symbol": "CFX/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "minNotional": 2500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "7500000", - "notionalFloor": "6000000", + "notionalCap": "3000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.125", - "cum": "317350.0" + "cum": "179850.0" } }, { "tier": 8.0, "symbol": "CFX/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 18000000.0, + "minNotional": 3000000.0, + "maxNotional": 3500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "18000000", - "notionalFloor": "7500000", + "notionalCap": "3500000", + "notionalFloor": "3000000", "maintMarginRatio": "0.25", - "cum": "1254850.0" + "cum": "554850.0" } }, { "tier": 9.0, "symbol": "CFX/USDT:USDT", "currency": "USDT", - "minNotional": 18000000.0, - "maxNotional": 30000000.0, + "minNotional": 3500000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "18000000", + "notionalCap": "4000000", + "notionalFloor": "3500000", "maintMarginRatio": "0.5", - "cum": "5754850.0" + "cum": "1429850.0" } } ], @@ -19619,13 +19929,13 @@ "symbol": "DOGS/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, - "maxNotional": 3000000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "3000000", + "notionalCap": "1500000", "notionalFloor": "600000", "maintMarginRatio": "0.05", "cum": "16850.0" @@ -19635,68 +19945,68 @@ "tier": 6.0, "symbol": "DOGS/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "minNotional": 1500000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "2000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.1", - "cum": "166850.0" + "cum": "91850.0" } }, { "tier": 7.0, "symbol": "DOGS/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "7500000", - "notionalFloor": "6000000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "316850.0" + "cum": "141850.0" } }, { "tier": 8.0, "symbol": "DOGS/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 2500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "3000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.25", - "cum": "1254350.0" + "cum": "454350.0" } }, { "tier": 9.0, "symbol": "DOGS/USDT:USDT", "currency": "USDT", - "minNotional": 15000000.0, - "maxNotional": 30000000.0, + "minNotional": 3000000.0, + "maxNotional": 3500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "15000000", + "notionalCap": "3500000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "5004350.0" + "cum": "1204350.0" } } ], @@ -22980,10 +23290,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -22997,10 +23307,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -23014,10 +23324,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -23031,10 +23341,10 @@ "minNotional": 30000.0, "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "60000", "notionalFloor": "30000", "maintMarginRatio": "0.025", @@ -23048,10 +23358,10 @@ "minNotional": 60000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "8", "notionalCap": "300000", "notionalFloor": "60000", "maintMarginRatio": "0.05", @@ -23114,13 +23424,13 @@ "symbol": "ETHW/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "3000000", + "notionalCap": "2000000", "notionalFloor": "1500000", "maintMarginRatio": "0.5", "cum": "500475.0" @@ -26307,10 +26617,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -26324,10 +26634,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -26341,10 +26651,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -26358,10 +26668,10 @@ "minNotional": 30000.0, "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "60000", "notionalFloor": "30000", "maintMarginRatio": "0.025", @@ -26375,10 +26685,10 @@ "minNotional": 60000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "8", "notionalCap": "300000", "notionalFloor": "60000", "maintMarginRatio": "0.05", @@ -30963,10 +31273,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -30980,10 +31290,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -30997,10 +31307,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -31014,10 +31324,10 @@ "minNotional": 30000.0, "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "60000", "notionalFloor": "30000", "maintMarginRatio": "0.025", @@ -31031,10 +31341,10 @@ "minNotional": 60000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "8", "notionalCap": "300000", "notionalFloor": "60000", "maintMarginRatio": "0.05", @@ -31080,13 +31390,13 @@ "symbol": "KMNO/USDT:USDT", "currency": "USDT", "minNotional": 750000.0, - "maxNotional": 1500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "1500000", + "notionalCap": "1000000", "notionalFloor": "750000", "maintMarginRatio": "0.25", "cum": "125475.0" @@ -31096,17 +31406,17 @@ "tier": 9.0, "symbol": "KMNO/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 1000000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "1500000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "500475.0" + "cum": "375475.0" } } ], @@ -31541,6 +31851,161 @@ } } ], + "LAYER/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "LAYER/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 25.0, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "LAYER/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "LAYER/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 15.0, + "info": { + "bracket": "3", + "initialLeverage": "15", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "LAYER/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "LAYER/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 8.0, + "info": { + "bracket": "5", + "initialLeverage": "8", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "LAYER/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "16725.0" + } + }, + { + "tier": 7.0, + "symbol": "LAYER/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "LAYER/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "125475.0" + } + }, + { + "tier": 9.0, + "symbol": "LAYER/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "2000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "500475.0" + } + } + ], "LDO/USDT:USDT": [ { "tier": 1.0, @@ -35135,10 +35600,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "25", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -35152,10 +35617,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -35169,10 +35634,10 @@ "minNotional": 30000.0, "maxNotional": 150000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "150000", "notionalFloor": "30000", "maintMarginRatio": "0.02", @@ -35186,10 +35651,10 @@ "minNotional": 150000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "300000", "notionalFloor": "150000", "maintMarginRatio": "0.025", @@ -35203,10 +35668,10 @@ "minNotional": 300000.0, "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "8", "notionalCap": "1500000", "notionalFloor": "300000", "maintMarginRatio": "0.05", @@ -35235,13 +35700,13 @@ "symbol": "ME/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, - "maxNotional": 3750000.0, + "maxNotional": 3100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "3750000", + "notionalCap": "3100000", "notionalFloor": "3000000", "maintMarginRatio": "0.125", "cum": "158450.0" @@ -35251,34 +35716,34 @@ "tier": 8.0, "symbol": "ME/USDT:USDT", "currency": "USDT", - "minNotional": 3750000.0, - "maxNotional": 7500000.0, + "minNotional": 3100000.0, + "maxNotional": 3300000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "3750000", + "notionalCap": "3300000", + "notionalFloor": "3100000", "maintMarginRatio": "0.25", - "cum": "627200.0" + "cum": "545950.0" } }, { "tier": 9.0, "symbol": "ME/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 3300000.0, + "maxNotional": 3500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "3500000", + "notionalFloor": "3300000", "maintMarginRatio": "0.5", - "cum": "2502200.0" + "cum": "1370950.0" } } ], @@ -35753,13 +36218,13 @@ "symbol": "MEW/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, - "maxNotional": 3000000.0, + "maxNotional": 900000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "3000000", + "notionalCap": "900000", "notionalFloor": "600000", "maintMarginRatio": "0.05", "cum": "16850.0" @@ -35769,68 +36234,68 @@ "tier": 6.0, "symbol": "MEW/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "minNotional": 900000.0, + "maxNotional": 1200000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "1200000", + "notionalFloor": "900000", "maintMarginRatio": "0.1", - "cum": "166850.0" + "cum": "61850.0" } }, { "tier": 7.0, "symbol": "MEW/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "minNotional": 1200000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "7500000", - "notionalFloor": "6000000", + "notionalCap": "1500000", + "notionalFloor": "1200000", "maintMarginRatio": "0.125", - "cum": "316850.0" + "cum": "91850.0" } }, { "tier": 8.0, "symbol": "MEW/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 1500000.0, + "maxNotional": 1800000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "1800000", + "notionalFloor": "1500000", "maintMarginRatio": "0.25", - "cum": "1254350.0" + "cum": "279350.0" } }, { "tier": 9.0, "symbol": "MEW/USDT:USDT", "currency": "USDT", - "minNotional": 15000000.0, - "maxNotional": 30000000.0, + "minNotional": 1800000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "15000000", + "notionalCap": "2000000", + "notionalFloor": "1800000", "maintMarginRatio": "0.5", - "cum": "5004350.0" + "cum": "729350.0" } } ], @@ -36445,10 +36910,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -36462,10 +36927,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -36479,10 +36944,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -36496,10 +36961,10 @@ "minNotional": 30000.0, "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "60000", "notionalFloor": "30000", "maintMarginRatio": "0.025", @@ -36513,10 +36978,10 @@ "minNotional": 60000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "8", "notionalCap": "300000", "notionalFloor": "60000", "maintMarginRatio": "0.05", @@ -36579,13 +37044,13 @@ "symbol": "MORPHO/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "3000000", + "notionalCap": "2000000", "notionalFloor": "1500000", "maintMarginRatio": "0.5", "cum": "500475.0" @@ -37407,13 +37872,13 @@ "symbol": "NEAR/USDT:USDT", "currency": "USDT", "minNotional": 25000000.0, - "maxNotional": 50000000.0, + "maxNotional": 30000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "50000000", + "notionalCap": "30000000", "notionalFloor": "25000000", "maintMarginRatio": "0.25", "cum": "4181100.0" @@ -37423,17 +37888,17 @@ "tier": 9.0, "symbol": "NEAR/USDT:USDT", "currency": "USDT", - "minNotional": 50000000.0, - "maxNotional": 100000000.0, + "minNotional": 30000000.0, + "maxNotional": 35000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "100000000", - "notionalFloor": "50000000", + "notionalCap": "35000000", + "notionalFloor": "30000000", "maintMarginRatio": "0.5", - "cum": "16681100.0" + "cum": "11681100.0" } } ], @@ -38460,13 +38925,13 @@ "symbol": "NOT/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, - "maxNotional": 3000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "3000000", + "notionalCap": "2000000", "notionalFloor": "600000", "maintMarginRatio": "0.05", "cum": "16850.0" @@ -38476,68 +38941,68 @@ "tier": 6.0, "symbol": "NOT/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "minNotional": 2000000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "3000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.1", - "cum": "166850.0" + "cum": "116850.0" } }, { "tier": 7.0, "symbol": "NOT/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "minNotional": 3000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "7500000", - "notionalFloor": "6000000", + "notionalCap": "4000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.125", - "cum": "316850.0" + "cum": "191850.0" } }, { "tier": 8.0, "symbol": "NOT/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 4000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.25", - "cum": "1254350.0" + "cum": "691850.0" } }, { "tier": 9.0, "symbol": "NOT/USDT:USDT", "currency": "USDT", - "minNotional": 15000000.0, - "maxNotional": 30000000.0, + "minNotional": 5000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "15000000", + "notionalCap": "6000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "5004350.0" + "cum": "1941850.0" } } ], @@ -39067,10 +39532,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "10", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -39084,10 +39549,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 9.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "9", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -39101,10 +39566,10 @@ "minNotional": 20000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "8", "notionalCap": "100000", "notionalFloor": "20000", "maintMarginRatio": "0.02", @@ -39118,10 +39583,10 @@ "minNotional": 100000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "7", "notionalCap": "200000", "notionalFloor": "100000", "maintMarginRatio": "0.025", @@ -39135,10 +39600,10 @@ "minNotional": 200000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "1000000", "notionalFloor": "200000", "maintMarginRatio": "0.05", @@ -39201,13 +39666,13 @@ "symbol": "OM/USDT:USDT", "currency": "USDT", "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "maxNotional": 5100000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "10000000", + "notionalCap": "5100000", "notionalFloor": "5000000", "maintMarginRatio": "0.5", "cum": "1668150.0" @@ -41356,13 +41821,13 @@ "symbol": "PEOPLE/USDT:USDT", "currency": "USDT", "minNotional": 400000.0, - "maxNotional": 2000000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "2000000", + "notionalCap": "1500000", "notionalFloor": "400000", "maintMarginRatio": "0.05", "cum": "11250.0" @@ -41372,68 +41837,68 @@ "tier": 6.0, "symbol": "PEOPLE/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, + "minNotional": 1500000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "4000000", - "notionalFloor": "2000000", + "notionalCap": "2000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.1", - "cum": "111250.0" + "cum": "86250.0" } }, { "tier": 7.0, "symbol": "PEOPLE/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 5000000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "5000000", - "notionalFloor": "4000000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "211250.0" + "cum": "136250.0" } }, { "tier": 8.0, "symbol": "PEOPLE/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 2500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "3000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.25", - "cum": "836250.0" + "cum": "448750.0" } }, { "tier": 9.0, "symbol": "PEOPLE/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "minNotional": 3000000.0, + "maxNotional": 3500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "3500000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "3336250.0" + "cum": "1198750.0" } } ], @@ -41817,6 +42282,127 @@ } } ], + "PIPPIN/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "PIPPIN/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.02", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "PIPPIN/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "PIPPIN/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "200000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "650.0" + } + }, + { + "tier": 4.0, + "symbol": "PIPPIN/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "200000", + "maintMarginRatio": "0.1", + "cum": "10650.0" + } + }, + { + "tier": 5.0, + "symbol": "PIPPIN/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "23150.0" + } + }, + { + "tier": 6.0, + "symbol": "PIPPIN/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "116900.0" + } + }, + { + "tier": 7.0, + "symbol": "PIPPIN/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "491900.0" + } + } + ], "PIXEL/USDT:USDT": [ { "tier": 1.0, @@ -42428,10 +43014,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -42445,10 +43031,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -42462,10 +43048,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -42479,10 +43065,10 @@ "minNotional": 30000.0, "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "60000", "notionalFloor": "30000", "maintMarginRatio": "0.025", @@ -42496,10 +43082,10 @@ "minNotional": 60000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "8", "notionalCap": "300000", "notionalFloor": "60000", "maintMarginRatio": "0.05", @@ -42562,13 +43148,13 @@ "symbol": "PONKE/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "3000000", + "notionalCap": "2000000", "notionalFloor": "1500000", "maintMarginRatio": "0.5", "cum": "500475.0" @@ -45929,10 +46515,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "25", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -45946,10 +46532,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -45963,10 +46549,10 @@ "minNotional": 30000.0, "maxNotional": 150000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "150000", "notionalFloor": "30000", "maintMarginRatio": "0.02", @@ -45980,10 +46566,10 @@ "minNotional": 150000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "300000", "notionalFloor": "150000", "maintMarginRatio": "0.025", @@ -45997,10 +46583,10 @@ "minNotional": 300000.0, "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "8", "notionalCap": "1500000", "notionalFloor": "300000", "maintMarginRatio": "0.05", @@ -46012,13 +46598,13 @@ "symbol": "RUNE/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "3000000", + "notionalCap": "2000000", "notionalFloor": "1500000", "maintMarginRatio": "0.1", "cum": "83450.0" @@ -46028,51 +46614,51 @@ "tier": 7.0, "symbol": "RUNE/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3750000.0, + "minNotional": 2000000.0, + "maxNotional": 2200000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "3750000", - "notionalFloor": "3000000", + "notionalCap": "2200000", + "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "158450.0" + "cum": "133450.0" } }, { "tier": 8.0, "symbol": "RUNE/USDT:USDT", "currency": "USDT", - "minNotional": 3750000.0, - "maxNotional": 7500000.0, + "minNotional": 2200000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "3750000", + "notionalCap": "2500000", + "notionalFloor": "2200000", "maintMarginRatio": "0.25", - "cum": "627200.0" + "cum": "408450.0" } }, { "tier": 9.0, "symbol": "RUNE/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 2500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "3000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "2502200.0" + "cum": "1033450.0" } } ], @@ -47528,13 +48114,13 @@ "symbol": "SEI/USDT:USDT", "currency": "USDT", "minNotional": 10000000.0, - "maxNotional": 12500000.0, + "maxNotional": 11000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "12500000", + "notionalCap": "11000000", "notionalFloor": "10000000", "maintMarginRatio": "0.125", "cum": "528050.0" @@ -47544,34 +48130,34 @@ "tier": 8.0, "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 12500000.0, - "maxNotional": 25000000.0, + "minNotional": 11000000.0, + "maxNotional": 12000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "25000000", - "notionalFloor": "12500000", + "notionalCap": "12000000", + "notionalFloor": "11000000", "maintMarginRatio": "0.25", - "cum": "2090550.0" + "cum": "1903050.0" } }, { "tier": 9.0, "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 25000000.0, - "maxNotional": 50000000.0, + "minNotional": 12000000.0, + "maxNotional": 13000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "25000000", + "notionalCap": "13000000", + "notionalFloor": "12000000", "maintMarginRatio": "0.5", - "cum": "8340550.0" + "cum": "4903050.0" } } ], @@ -47842,10 +48428,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -47859,10 +48445,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -47876,10 +48462,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -47893,10 +48479,10 @@ "minNotional": 30000.0, "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "60000", "notionalFloor": "30000", "maintMarginRatio": "0.025", @@ -47910,10 +48496,10 @@ "minNotional": 60000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "8", "notionalCap": "300000", "notionalFloor": "60000", "maintMarginRatio": "0.05", @@ -47959,13 +48545,13 @@ "symbol": "SLERF/USDT:USDT", "currency": "USDT", "minNotional": 750000.0, - "maxNotional": 1500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "1500000", + "notionalCap": "1000000", "notionalFloor": "750000", "maintMarginRatio": "0.25", "cum": "125475.0" @@ -47975,17 +48561,17 @@ "tier": 9.0, "symbol": "SLERF/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 1000000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "1500000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "500475.0" + "cum": "375475.0" } } ], @@ -49031,10 +49617,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.015", @@ -49048,10 +49634,10 @@ "minNotional": 5000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "20000", "notionalFloor": "5000", "maintMarginRatio": "0.02", @@ -49065,10 +49651,10 @@ "minNotional": 20000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "25000", "notionalFloor": "20000", "maintMarginRatio": "0.025", @@ -49082,10 +49668,10 @@ "minNotional": 25000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "4", - "initialLeverage": "10", + "initialLeverage": "8", "notionalCap": "200000", "notionalFloor": "25000", "maintMarginRatio": "0.05", @@ -49148,13 +49734,13 @@ "symbol": "SPELL/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "2000000", + "notionalCap": "1500000", "notionalFloor": "1000000", "maintMarginRatio": "0.5", "cum": "333250.0" @@ -51205,10 +51791,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -51222,10 +51808,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -51239,10 +51825,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -51256,10 +51842,10 @@ "minNotional": 30000.0, "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "60000", "notionalFloor": "30000", "maintMarginRatio": "0.025", @@ -51273,10 +51859,10 @@ "minNotional": 60000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "8", "notionalCap": "300000", "notionalFloor": "60000", "maintMarginRatio": "0.05", @@ -51339,13 +51925,13 @@ "symbol": "SWARMS/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "3000000", + "notionalCap": "2000000", "notionalFloor": "1500000", "maintMarginRatio": "0.5", "cum": "500475.0" @@ -51360,10 +51946,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -51377,10 +51963,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -51394,10 +51980,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -51411,10 +51997,10 @@ "minNotional": 30000.0, "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "60000", "notionalFloor": "30000", "maintMarginRatio": "0.025", @@ -51428,10 +52014,10 @@ "minNotional": 60000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "8", "notionalCap": "300000", "notionalFloor": "60000", "maintMarginRatio": "0.05", @@ -51477,13 +52063,13 @@ "symbol": "SWELL/USDT:USDT", "currency": "USDT", "minNotional": 750000.0, - "maxNotional": 1500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "1500000", + "notionalCap": "1000000", "notionalFloor": "750000", "maintMarginRatio": "0.25", "cum": "125475.0" @@ -51493,17 +52079,17 @@ "tier": 9.0, "symbol": "SWELL/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 1000000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "1500000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "500475.0" + "cum": "375475.0" } } ], @@ -52443,13 +53029,13 @@ "symbol": "THETA/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "4", "initialLeverage": "5", - "notionalCap": "2000000", + "notionalCap": "1500000", "notionalFloor": "1000000", "maintMarginRatio": "0.1", "cum": "57750.0" @@ -52459,68 +53045,68 @@ "tier": 5.0, "symbol": "THETA/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 5000000.0, + "minNotional": 1500000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "5000000", - "notionalFloor": "2000000", + "notionalCap": "2000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.125", - "cum": "107750.0" + "cum": "95250.0" } }, { "tier": 6.0, "symbol": "THETA/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.1665, "maxLeverage": 3.0, "info": { "bracket": "6", "initialLeverage": "3", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.1665", - "cum": "315250.0" + "cum": "178250.0" } }, { "tier": 7.0, "symbol": "THETA/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "minNotional": 2500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "3000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.25", - "cum": "1150250.0" + "cum": "387000.0" } }, { "tier": 8.0, "symbol": "THETA/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 30000000.0, + "minNotional": 3000000.0, + "maxNotional": 3500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "20000000", + "notionalCap": "3500000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "6150250.0" + "cum": "1137000.0" } } ], @@ -54144,6 +54730,161 @@ } } ], + "TST/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "TST/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "TST/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "TST/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "TST/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "TST/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "TST/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "16725.0" + } + }, + { + "tier": 7.0, + "symbol": "TST/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "TST/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "125475.0" + } + }, + { + "tier": 9.0, + "symbol": "TST/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "500475.0" + } + } + ], "TURBO/USDT:USDT": [ { "tier": 1.0, @@ -54235,13 +54976,13 @@ "symbol": "TURBO/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "maxNotional": 3500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "6000000", + "notionalCap": "3500000", "notionalFloor": "3000000", "maintMarginRatio": "0.1", "cum": "166850.0" @@ -54251,51 +54992,51 @@ "tier": 7.0, "symbol": "TURBO/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "minNotional": 3500000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "7500000", - "notionalFloor": "6000000", + "notionalCap": "4000000", + "notionalFloor": "3500000", "maintMarginRatio": "0.125", - "cum": "316850.0" + "cum": "254350.0" } }, { "tier": 8.0, "symbol": "TURBO/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 4000000.0, + "maxNotional": 4500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "4500000", + "notionalFloor": "4000000", "maintMarginRatio": "0.25", - "cum": "1254350.0" + "cum": "754350.0" } }, { "tier": 9.0, "symbol": "TURBO/USDT:USDT", "currency": "USDT", - "minNotional": 15000000.0, - "maxNotional": 30000000.0, + "minNotional": 4500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "15000000", + "notionalCap": "5000000", + "notionalFloor": "4500000", "maintMarginRatio": "0.5", - "cum": "5004350.0" + "cum": "1879350.0" } } ], @@ -55428,10 +56169,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "25", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -55445,10 +56186,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -55462,10 +56203,10 @@ "minNotional": 20000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "100000", "notionalFloor": "20000", "maintMarginRatio": "0.02", @@ -55479,10 +56220,10 @@ "minNotional": 100000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "200000", "notionalFloor": "100000", "maintMarginRatio": "0.025", @@ -55496,10 +56237,10 @@ "minNotional": 200000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "8", "notionalCap": "1000000", "notionalFloor": "200000", "maintMarginRatio": "0.05", @@ -55545,13 +56286,13 @@ "symbol": "VANA/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "5000000", + "notionalCap": "3000000", "notionalFloor": "2500000", "maintMarginRatio": "0.25", "cum": "418150.0" @@ -55561,17 +56302,17 @@ "tier": 9.0, "symbol": "VANA/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 3000000.0, + "maxNotional": 3500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "3500000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "1668150.0" + "cum": "1168150.0" } } ], @@ -56178,6 +56919,127 @@ } } ], + "VINE/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "VINE/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.02", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "VINE/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "VINE/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "200000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "650.0" + } + }, + { + "tier": 4.0, + "symbol": "VINE/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "200000", + "maintMarginRatio": "0.1", + "cum": "10650.0" + } + }, + { + "tier": 5.0, + "symbol": "VINE/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "23150.0" + } + }, + { + "tier": 6.0, + "symbol": "VINE/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "116900.0" + } + }, + { + "tier": 7.0, + "symbol": "VINE/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "491900.0" + } + } + ], "VIRTUAL/USDT:USDT": [ { "tier": 1.0, @@ -56626,6 +57488,127 @@ } } ], + "VVV/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "VVV/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.02", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "VVV/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "VVV/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "200000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "650.0" + } + }, + { + "tier": 4.0, + "symbol": "VVV/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "200000", + "maintMarginRatio": "0.1", + "cum": "10650.0" + } + }, + { + "tier": 5.0, + "symbol": "VVV/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "23150.0" + } + }, + { + "tier": 6.0, + "symbol": "VVV/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "116900.0" + } + }, + { + "tier": 7.0, + "symbol": "VVV/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "491900.0" + } + } + ], "W/USDT:USDT": [ { "tier": 1.0, @@ -58307,10 +59290,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.005, - "maxLeverage": 75.0, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.005", @@ -58324,10 +59307,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.006, - "maxLeverage": 50.0, + "maxLeverage": 25.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "25", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.006", @@ -58341,10 +59324,10 @@ "minNotional": 10000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 40.0, + "maxLeverage": 20.0, "info": { "bracket": "3", - "initialLeverage": "40", + "initialLeverage": "20", "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.01", @@ -58358,10 +59341,10 @@ "minNotional": 50000.0, "maxNotional": 750000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "4", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "750000", "notionalFloor": "50000", "maintMarginRatio": "0.02", @@ -58373,37 +59356,54 @@ "symbol": "XRP/USDC:USDC", "currency": "USDC", "minNotional": 750000.0, - "maxNotional": 3000000.0, - "maintenanceMarginRate": 0.05, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.025, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "3000000", + "notionalCap": "1000000", "notionalFloor": "750000", - "maintMarginRatio": "0.05", - "cum": "23045.0" + "maintMarginRatio": "0.025", + "cum": "4295.0" } }, { "tier": 6.0, "symbol": "XRP/USDC:USDC", "currency": "USDC", + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 8.0, + "info": { + "bracket": "6", + "initialLeverage": "8", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.05", + "cum": "29295.0" + } + }, + { + "tier": 7.0, + "symbol": "XRP/USDC:USDC", + "currency": "USDC", "minNotional": 3000000.0, "maxNotional": 10000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "5", "notionalCap": "10000000", "notionalFloor": "3000000", "maintMarginRatio": "0.1", - "cum": "173045.0" + "cum": "179295.0" } }, { - "tier": 7.0, + "tier": 8.0, "symbol": "XRP/USDC:USDC", "currency": "USDC", "minNotional": 10000000.0, @@ -58411,63 +59411,46 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "4", "notionalCap": "12000000", "notionalFloor": "10000000", "maintMarginRatio": "0.125", - "cum": "423045.0" - } - }, - { - "tier": 8.0, - "symbol": "XRP/USDC:USDC", - "currency": "USDC", - "minNotional": 12000000.0, - "maxNotional": 20000000.0, - "maintenanceMarginRate": 0.15, - "maxLeverage": 3.0, - "info": { - "bracket": "8", - "initialLeverage": "3", - "notionalCap": "20000000", - "notionalFloor": "12000000", - "maintMarginRatio": "0.15", - "cum": "723045.0" + "cum": "429295.0" } }, { "tier": 9.0, "symbol": "XRP/USDC:USDC", "currency": "USDC", - "minNotional": 20000000.0, - "maxNotional": 30000000.0, + "minNotional": 12000000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "30000000", - "notionalFloor": "20000000", + "notionalCap": "15000000", + "notionalFloor": "12000000", "maintMarginRatio": "0.25", - "cum": "2723045.0" + "cum": "1929295.0" } }, { "tier": 10.0, "symbol": "XRP/USDC:USDC", "currency": "USDC", - "minNotional": 30000000.0, - "maxNotional": 50000000.0, + "minNotional": 15000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "30000000", + "notionalCap": "20000000", + "notionalFloor": "15000000", "maintMarginRatio": "0.5", - "cum": "10223045.0" + "cum": "5679295.0" } } ], diff --git a/freqtrade/exchange/bybit.py b/freqtrade/exchange/bybit.py index 72cfe52c0..d75aafdc8 100644 --- a/freqtrade/exchange/bybit.py +++ b/freqtrade/exchange/bybit.py @@ -31,7 +31,6 @@ class Bybit(Exchange): unified_account = False _ft_has: FtHas = { - "ohlcv_candle_limit": 1000, "ohlcv_has_history": True, "order_time_in_force": ["GTC", "FOK", "IOC", "PO"], "ws_enabled": True, diff --git a/freqtrade/exchange/coinbasepro.py b/freqtrade/exchange/coinbasepro.py deleted file mode 100644 index cc561e8ce..000000000 --- a/freqtrade/exchange/coinbasepro.py +++ /dev/null @@ -1,24 +0,0 @@ -"""CoinbasePro exchange subclass""" - -import logging - -from freqtrade.exchange import Exchange -from freqtrade.exchange.exchange_types import FtHas - - -logger = logging.getLogger(__name__) - - -class Coinbasepro(Exchange): - """ - CoinbasePro exchange class. Contains adjustments needed for Freqtrade to work - with this exchange. - - Please note that this exchange is not included in the list of exchanges - officially supported by the Freqtrade development team. So some features - may still not work as expected. - """ - - _ft_has: FtHas = { - "ohlcv_candle_limit": 300, - } diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 24656638c..aaf5f2225 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -12,7 +12,7 @@ from copy import deepcopy from datetime import datetime, timedelta, timezone from math import floor, isnan from threading import Lock -from typing import Any, Literal, TypeGuard +from typing import Any, Literal, TypeGuard, TypeVar import ccxt import ccxt.pro as ccxt_pro @@ -113,6 +113,8 @@ from freqtrade.util.periodic_cache import PeriodicCache logger = logging.getLogger(__name__) +T = TypeVar("T") + class Exchange: # Parameters to add directly to buy/sell calls (like agreeing to trading agreement) @@ -131,7 +133,6 @@ class Exchange: "stoploss_order_types": {}, "order_time_in_force": ["GTC"], "ohlcv_params": {}, - "ohlcv_candle_limit": 500, "ohlcv_has_history": True, # Some exchanges (Kraken) don't provide history via ohlcv "ohlcv_partial_candle": True, "ohlcv_require_since": False, @@ -276,6 +277,11 @@ class Exchange: logger.info(f'Using Exchange "{self.name}"') self.required_candle_call_count = 1 + # Converts the interval provided in minutes in config to seconds + self.markets_refresh_interval: int = ( + exchange_conf.get("markets_refresh_interval", 60) * 60 * 1000 + ) + if validate: # Initial markets load self.reload_markets(True, load_leverage_tiers=False) @@ -285,11 +291,6 @@ class Exchange: self._startup_candle_count, config.get("timeframe", "") ) - # Converts the interval provided in minutes in config to seconds - self.markets_refresh_interval: int = ( - exchange_conf.get("markets_refresh_interval", 60) * 60 * 1000 - ) - if self.trading_mode != TradingMode.SPOT and load_leverage_tiers: self.fill_leverage_tiers() self.additional_exchange_init() @@ -466,7 +467,12 @@ class Exchange: :return: Candle limit as integer """ - fallback_val = self._ft_has.get("ohlcv_candle_limit") + ccxt_val = self.features( + "spot" if candle_type == CandleType.SPOT else "futures", "fetchOHLCV", "limit", 500 + ) + if not isinstance(ccxt_val, float | int): + ccxt_val = 500 + fallback_val = self._ft_has.get("ohlcv_candle_limit", ccxt_val) if candle_type == CandleType.FUNDING_RATE: fallback_val = self._ft_has.get("funding_fee_candle_limit", fallback_val) return int( @@ -642,7 +648,8 @@ class Exchange: def _load_async_markets(self, reload: bool = False) -> dict[str, Any]: try: - markets = self.loop.run_until_complete(self._api_reload_markets(reload=reload)) + with self._loop_lock: + markets = self.loop.run_until_complete(self._api_reload_markets(reload=reload)) if isinstance(markets, Exception): raise markets @@ -887,6 +894,24 @@ class Exchange: return self._ft_has["exchange_has_overrides"][endpoint] return endpoint in self._api_async.has and self._api_async.has[endpoint] + def features( + self, market_type: Literal["spot", "futures"], endpoint, attribute, default: T + ) -> T: + """ + Returns the exchange features for the given markettype + https://docs.ccxt.com/#/README?id=features + attributes are in a nested dict, with spot and swap.linear + e.g. spot.fetchOHLCV.limit + swap.linear.fetchOHLCV.limit + """ + feat = ( + self._api_async.features.get("spot", {}) + if market_type == "spot" + else self._api_async.features.get("swap", {}).get("linear", {}) + ) + + return feat.get(endpoint, {}).get(attribute, default) + def get_precision_amount(self, pair: str) -> float | None: """ Returns the amount precision of the exchange. @@ -2318,15 +2343,16 @@ class Exchange: :param until_ms: Timestamp in milliseconds to get history up to :return: Dataframe with candle (OHLCV) data """ - pair, _, _, data, _ = self.loop.run_until_complete( - self._async_get_historic_ohlcv( - pair=pair, - timeframe=timeframe, - since_ms=since_ms, - until_ms=until_ms, - candle_type=candle_type, + with self._loop_lock: + pair, _, _, data, _ = self.loop.run_until_complete( + self._async_get_historic_ohlcv( + pair=pair, + timeframe=timeframe, + since_ms=since_ms, + until_ms=until_ms, + candle_type=candle_type, + ) ) - ) logger.debug(f"Downloaded data for {pair} from ccxt with length {len(data)}.") return ohlcv_to_dataframe(data, timeframe, pair, fill_missing=False, drop_incomplete=True) diff --git a/freqtrade/exchange/exchange_ws.py b/freqtrade/exchange/exchange_ws.py index 0181267c6..cbc9772a3 100644 --- a/freqtrade/exchange/exchange_ws.py +++ b/freqtrade/exchange/exchange_ws.py @@ -9,6 +9,8 @@ import ccxt from freqtrade.constants import Config, PairWithTimeframe from freqtrade.enums.candletype import CandleType +from freqtrade.exceptions import TemporaryError +from freqtrade.exchange.common import retrier from freqtrade.exchange.exchange import timeframe_to_seconds from freqtrade.exchange.exchange_types import OHLCVResponse from freqtrade.util import dt_ts, format_ms_time, format_ms_time_det @@ -82,14 +84,21 @@ class ExchangeWS: Remove history for a pair/timeframe combination from ccxt cache """ self._ccxt_object.ohlcvs.get(paircomb[0], {}).pop(paircomb[1], None) + self.klines_last_refresh.pop(paircomb, None) + @retrier(retries=3) def ohlcvs(self, pair: str, timeframe: str) -> list[list]: """ Returns a copy of the klines for a pair/timeframe combination Note: this will only contain the data received from the websocket so the data will build up over time. """ - return deepcopy(self._ccxt_object.ohlcvs.get(pair, {}).get(timeframe, [])) + try: + return deepcopy(self._ccxt_object.ohlcvs.get(pair, {}).get(timeframe, [])) + except RuntimeError as e: + # Capture runtime errors and retry + # TemporaryError does not cause backoff - so we're essentially retrying immediately + raise TemporaryError(f"Error deepcopying: {e}") from e def cleanup_expired(self) -> None: """ @@ -130,6 +139,15 @@ class ExchangeWS: ) ) + async def _unwatch_ohlcv(self, pair: str, timeframe: str, candle_type: CandleType) -> None: + try: + await self._ccxt_object.un_watch_ohlcv_for_symbols([[pair, timeframe]]) + except ccxt.NotSupported as e: + logger.debug("un_watch_ohlcv_for_symbols not supported: %s", e) + pass + except Exception: + logger.exception("Exception in _unwatch_ohlcv") + def _continuous_stopped( self, task: asyncio.Task, pair: str, timeframe: str, candle_type: CandleType ): @@ -142,6 +160,10 @@ class ExchangeWS: result = str(result1) logger.info(f"{pair}, {timeframe}, {candle_type} - Task finished - {result}") + asyncio.run_coroutine_threadsafe( + self._unwatch_ohlcv(pair, timeframe, candle_type), loop=self._loop + ) + self._klines_scheduled.discard((pair, timeframe, candle_type)) self._pop_history((pair, timeframe, candle_type)) diff --git a/freqtrade/exchange/gate.py b/freqtrade/exchange/gate.py index d9473043f..95e1a00ca 100644 --- a/freqtrade/exchange/gate.py +++ b/freqtrade/exchange/gate.py @@ -30,7 +30,6 @@ class Gate(Exchange): unified_account = False _ft_has: FtHas = { - "ohlcv_candle_limit": 1000, "order_time_in_force": ["GTC", "IOC"], "stoploss_on_exchange": True, "stoploss_order_types": {"limit": "limit"}, diff --git a/freqtrade/exchange/htx.py b/freqtrade/exchange/htx.py index ba158d4c5..9b112ff45 100644 --- a/freqtrade/exchange/htx.py +++ b/freqtrade/exchange/htx.py @@ -21,7 +21,6 @@ class Htx(Exchange): "stop_price_param": "stopPrice", "stop_price_prop": "stopPrice", "stoploss_order_types": {"limit": "stop-limit"}, - "ohlcv_candle_limit": 1000, "l2_limit_range": [5, 10, 20], "l2_limit_range_required": False, "ohlcv_candle_limit_per_timeframe": { diff --git a/freqtrade/exchange/hyperliquid.py b/freqtrade/exchange/hyperliquid.py index d417810c8..a75a77892 100644 --- a/freqtrade/exchange/hyperliquid.py +++ b/freqtrade/exchange/hyperliquid.py @@ -22,7 +22,6 @@ class Hyperliquid(Exchange): _ft_has: FtHas = { "ohlcv_has_history": False, - "ohlcv_candle_limit": 5000, "l2_limit_range": [20], "trades_has_history": False, "tickers_have_bid_ask": False, diff --git a/freqtrade/exchange/kraken.py b/freqtrade/exchange/kraken.py index 22828ce20..03c97569a 100644 --- a/freqtrade/exchange/kraken.py +++ b/freqtrade/exchange/kraken.py @@ -26,7 +26,6 @@ class Kraken(Exchange): "stop_price_prop": "stopLossPrice", "stoploss_order_types": {"limit": "limit", "market": "market"}, "order_time_in_force": ["GTC", "IOC", "PO"], - "ohlcv_candle_limit": 720, "ohlcv_has_history": False, "trades_pagination": "id", "trades_pagination_arg": "since", diff --git a/freqtrade/exchange/kucoin.py b/freqtrade/exchange/kucoin.py index de033dcc0..17afbd63a 100644 --- a/freqtrade/exchange/kucoin.py +++ b/freqtrade/exchange/kucoin.py @@ -28,7 +28,6 @@ class Kucoin(Exchange): "l2_limit_range": [20, 100], "l2_limit_range_required": False, "order_time_in_force": ["GTC", "FOK", "IOC"], - "ohlcv_candle_limit": 1500, } def _get_stop_params(self, side: BuySell, ordertype: str, stop_price: float) -> dict: diff --git a/freqtrade/freqai/base_models/FreqaiMultiOutputRegressor.py b/freqtrade/freqai/base_models/FreqaiMultiOutputRegressor.py index f2d7ff370..15c8db256 100644 --- a/freqtrade/freqai/base_models/FreqaiMultiOutputRegressor.py +++ b/freqtrade/freqai/base_models/FreqaiMultiOutputRegressor.py @@ -6,26 +6,21 @@ from sklearn.utils.validation import has_fit_parameter, validate_data class FreqaiMultiOutputRegressor(MultiOutputRegressor): def fit(self, X, y, sample_weight=None, fit_params=None): """Fit the model to data, separately for each output variable. - Parameters - ---------- - X : {array-like, sparse matrix} of shape (n_samples, n_features) + :param X: {array-like, sparse matrix} of shape (n_samples, n_features) The input data. - y : {array-like, sparse matrix} of shape (n_samples, n_outputs) + :param y: {array-like, sparse matrix} of shape (n_samples, n_outputs) Multi-output targets. An indicator matrix turns on multilabel estimation. - sample_weight : array-like of shape (n_samples,), default=None + :param sample_weight: array-like of shape (n_samples,), default=None Sample weights. If `None`, then samples are equally weighted. Only supported if the underlying regressor supports sample weights. - fit_params : A list of dicts for the fit_params + + :param fit_params: A list of dicts for the fit_params Parameters passed to the ``estimator.fit`` method of each step. Each dict may contain same or different values (e.g. different eval_sets or init_models) - .. versionadded:: 0.23 - Returns - ------- - self : object - Returns a fitted instance. + """ if not hasattr(self.estimator, "fit"): diff --git a/freqtrade/leverage/liquidation_price.py b/freqtrade/leverage/liquidation_price.py index 5440da64a..af34f43fd 100644 --- a/freqtrade/leverage/liquidation_price.py +++ b/freqtrade/leverage/liquidation_price.py @@ -35,19 +35,20 @@ def update_liquidation_prices( open_trades: list[Trade] = Trade.get_open_trades() for t in open_trades: - # TODO: This should be done in a batch update - t.set_liquidation_price( - exchange.get_liquidation_price( - pair=t.pair, - open_rate=t.open_rate, - is_short=t.is_short, - amount=t.amount, - stake_amount=t.stake_amount, - leverage=t.leverage, - wallet_balance=total_wallet_stake, - open_trades=open_trades, + if t.has_open_position: + # TODO: This should be done in a batch update + t.set_liquidation_price( + exchange.get_liquidation_price( + pair=t.pair, + open_rate=t.open_rate, + is_short=t.is_short, + amount=t.amount, + stake_amount=t.stake_amount, + leverage=t.leverage, + wallet_balance=total_wallet_stake, + open_trades=open_trades, + ) ) - ) elif trade: trade.set_liquidation_price( exchange.get_liquidation_price( diff --git a/freqtrade/loggers/ft_rich_handler.py b/freqtrade/loggers/ft_rich_handler.py index bbd3d8fbd..dba402f17 100644 --- a/freqtrade/loggers/ft_rich_handler.py +++ b/freqtrade/loggers/ft_rich_handler.py @@ -4,7 +4,6 @@ from logging import Handler from rich._null_file import NullFile from rich.console import Console from rich.text import Text -from rich.traceback import Traceback class FtRichHandler(Handler): @@ -38,11 +37,6 @@ class FtRichHandler(Handler): self._console.print( Text() + log_time + gray_sep + name + gray_sep + log_level + gray_sep + msg ) - tb = None - if record.exc_info: - exc_type, exc_value, exc_traceback = record.exc_info - tb = Traceback.from_exception(exc_type, exc_value, exc_traceback, extra_lines=1) - self._console.print(tb) except RecursionError: raise diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index 132df1824..d3f1bc63b 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -7,7 +7,7 @@ This module contains the backtesting logic import logging from collections import defaultdict from copy import deepcopy -from datetime import datetime, timedelta, timezone +from datetime import datetime, timedelta from typing import Any from numpy import nan @@ -63,7 +63,7 @@ from freqtrade.plugins.protectionmanager import ProtectionManager from freqtrade.resolvers import ExchangeResolver, StrategyResolver from freqtrade.strategy.interface import IStrategy from freqtrade.strategy.strategy_wrapper import strategy_safe_wrapper -from freqtrade.util import FtPrecise +from freqtrade.util import FtPrecise, dt_now from freqtrade.util.migrations import migrate_data from freqtrade.wallets import Wallets @@ -1656,7 +1656,7 @@ class Backtesting: self.progress.init_step(BacktestState.ANALYZE, 0) strategy_name = strat.get_strategy_name() logger.info(f"Running backtesting for Strategy {strategy_name}") - backtest_start_time = datetime.now(timezone.utc) + backtest_start_time = dt_now() self._set_strategy(strat) # need to reprocess data every time to populate signals @@ -1683,7 +1683,7 @@ class Backtesting: start_date=min_date, end_date=max_date, ) - backtest_end_time = datetime.now(timezone.utc) + backtest_end_time = dt_now() results.update( { "run_id": self.run_ids.get(strategy_name, ""), @@ -1710,14 +1710,14 @@ class Backtesting: def _get_min_cached_backtest_date(self): min_backtest_date = None backtest_cache_age = self.config.get("backtest_cache", constants.BACKTEST_CACHE_DEFAULT) - if self.timerange.stopts == 0 or self.timerange.stopdt > datetime.now(tz=timezone.utc): + if self.timerange.stopts == 0 or self.timerange.stopdt > dt_now(): logger.warning("Backtest result caching disabled due to use of open-ended timerange.") elif backtest_cache_age == "day": - min_backtest_date = datetime.now(tz=timezone.utc) - timedelta(days=1) + min_backtest_date = dt_now() - timedelta(days=1) elif backtest_cache_age == "week": - min_backtest_date = datetime.now(tz=timezone.utc) - timedelta(weeks=1) + min_backtest_date = dt_now() - timedelta(weeks=1) elif backtest_cache_age == "month": - min_backtest_date = datetime.now(tz=timezone.utc) - timedelta(weeks=4) + min_backtest_date = dt_now() - timedelta(weeks=4) return min_backtest_date def load_prior_backtest(self): diff --git a/freqtrade/optimize/hyperopt/hyperopt.py b/freqtrade/optimize/hyperopt/hyperopt.py index 0af2db4ba..ef71860a5 100644 --- a/freqtrade/optimize/hyperopt/hyperopt.py +++ b/freqtrade/optimize/hyperopt/hyperopt.py @@ -6,7 +6,6 @@ This module contains the hyperopt logic import logging import random -import sys from datetime import datetime from math import ceil from multiprocessing import Manager @@ -15,7 +14,6 @@ from typing import Any import rapidjson from joblib import Parallel, cpu_count, delayed, wrap_non_picklable_objects -from joblib.externals import cloudpickle from freqtrade.constants import FTHYPT_FILEVERSION, LAST_BT_RESULT_FN, Config from freqtrade.enums import HyperoptState @@ -110,17 +108,6 @@ class Hyperopt: logger.info(f"Removing `{p}`.") p.unlink() - def hyperopt_pickle_magic(self, bases) -> None: - """ - Hyperopt magic to allow strategy inheritance across files. - For this to properly work, we need to register the module of the imported class - to pickle as value. - """ - for modules in bases: - if modules.__name__ != "IStrategy": - cloudpickle.register_pickle_by_value(sys.modules[modules.__module__]) - self.hyperopt_pickle_magic(modules.__bases__) - def _save_result(self, epoch: dict) -> None: """ Save hyperopt results to file diff --git a/freqtrade/optimize/hyperopt/hyperopt_optimizer.py b/freqtrade/optimize/hyperopt/hyperopt_optimizer.py index c8d18d224..9e4995aca 100644 --- a/freqtrade/optimize/hyperopt/hyperopt_optimizer.py +++ b/freqtrade/optimize/hyperopt/hyperopt_optimizer.py @@ -114,7 +114,7 @@ class HyperOptimizer: def get_strategy_name(self) -> str: return self.backtesting.strategy.get_strategy_name() - def hyperopt_pickle_magic(self, bases) -> None: + def hyperopt_pickle_magic(self, bases: tuple[type, ...]) -> None: """ Hyperopt magic to allow strategy inheritance across files. For this to properly work, we need to register the module of the imported class @@ -122,7 +122,8 @@ class HyperOptimizer: """ for modules in bases: if modules.__name__ != "IStrategy": - cloudpickle.register_pickle_by_value(sys.modules[modules.__module__]) + if mod := sys.modules.get(modules.__module__): + cloudpickle.register_pickle_by_value(mod) self.hyperopt_pickle_magic(modules.__bases__) def _get_params_dict( diff --git a/freqtrade/resolvers/exchange_resolver.py b/freqtrade/resolvers/exchange_resolver.py index 835c3c0af..e6edfb942 100644 --- a/freqtrade/resolvers/exchange_resolver.py +++ b/freqtrade/resolvers/exchange_resolver.py @@ -9,7 +9,7 @@ from typing import Any import freqtrade.exchange as exchanges from freqtrade.constants import Config, ExchangeConfig from freqtrade.exchange import MAP_EXCHANGE_CHILDCLASS, Exchange -from freqtrade.resolvers import IResolver +from freqtrade.resolvers.iresolver import IResolver logger = logging.getLogger(__name__) diff --git a/freqtrade/resolvers/strategy_resolver.py b/freqtrade/resolvers/strategy_resolver.py index 67751b5ae..a3ec03e2b 100644 --- a/freqtrade/resolvers/strategy_resolver.py +++ b/freqtrade/resolvers/strategy_resolver.py @@ -16,7 +16,7 @@ from freqtrade.configuration.config_validation import validate_migrated_strategy from freqtrade.constants import REQUIRED_ORDERTIF, REQUIRED_ORDERTYPES, USERPATH_STRATEGIES, Config from freqtrade.enums import TradingMode from freqtrade.exceptions import OperationalException -from freqtrade.resolvers import IResolver +from freqtrade.resolvers.iresolver import IResolver from freqtrade.strategy.interface import IStrategy diff --git a/freqtrade/rpc/api_server/api_backtest.py b/freqtrade/rpc/api_server/api_backtest.py index 7346b22e0..278922b7d 100644 --- a/freqtrade/rpc/api_server/api_backtest.py +++ b/freqtrade/rpc/api_server/api_backtest.py @@ -99,16 +99,18 @@ def __run_backtest_bg(btconfig: Config): ApiBG.bt["data"], ApiBG.bt["bt"].all_results, min_date=min_date, max_date=max_date ) - if btconfig.get("export", "none") == "trades": - combined_res = combined_dataframes_with_rel_mean(ApiBG.bt["data"], min_date, max_date) - fn = store_backtest_results( - btconfig, - ApiBG.bt["bt"].results, - datetime.now().strftime("%Y-%m-%d_%H-%M-%S"), - market_change_data=combined_res, - ) - ApiBG.bt["bt"].results["metadata"][strategy_name]["filename"] = str(fn.stem) - ApiBG.bt["bt"].results["metadata"][strategy_name]["strategy"] = strategy_name + if btconfig.get("export", "none") == "trades": + combined_res = combined_dataframes_with_rel_mean( + ApiBG.bt["data"], min_date, max_date + ) + fn = store_backtest_results( + btconfig, + ApiBG.bt["bt"].results, + datetime.now().strftime("%Y-%m-%d_%H-%M-%S"), + market_change_data=combined_res, + ) + ApiBG.bt["bt"].results["metadata"][strategy_name]["filename"] = str(fn.stem) + ApiBG.bt["bt"].results["metadata"][strategy_name]["strategy"] = strategy_name logger.info("Backtest finished.") diff --git a/freqtrade/rpc/api_server/api_pair_history.py b/freqtrade/rpc/api_server/api_pair_history.py new file mode 100644 index 000000000..31fd86f46 --- /dev/null +++ b/freqtrade/rpc/api_server/api_pair_history.py @@ -0,0 +1,77 @@ +import logging +from copy import deepcopy + +from fastapi import APIRouter, Depends, HTTPException + +from freqtrade.configuration import validate_config_consistency +from freqtrade.rpc.api_server.api_pairlists import handleExchangePayload +from freqtrade.rpc.api_server.api_schemas import PairHistory, PairHistoryRequest +from freqtrade.rpc.api_server.deps import get_config, get_exchange +from freqtrade.rpc.rpc import RPC + + +logger = logging.getLogger(__name__) + +router = APIRouter() + + +@router.get("/pair_history", response_model=PairHistory, tags=["candle data"]) +def pair_history( + pair: str, + timeframe: str, + timerange: str, + strategy: str, + freqaimodel: str | None = None, + config=Depends(get_config), + exchange=Depends(get_exchange), +): + # The initial call to this endpoint can be slow, as it may need to initialize + # the exchange class. + config_loc = deepcopy(config) + config_loc.update( + { + "timeframe": timeframe, + "strategy": strategy, + "timerange": timerange, + "freqaimodel": freqaimodel if freqaimodel else config_loc.get("freqaimodel"), + } + ) + validate_config_consistency(config_loc) + try: + return RPC._rpc_analysed_history_full(config_loc, pair, timeframe, exchange, None, False) + except Exception as e: + raise HTTPException(status_code=502, detail=str(e)) + + +@router.post("/pair_history", response_model=PairHistory, tags=["candle data"]) +def pair_history_filtered(payload: PairHistoryRequest, config=Depends(get_config)): + # The initial call to this endpoint can be slow, as it may need to initialize + # the exchange class. + config_loc = deepcopy(config) + config_loc.update( + { + "timeframe": payload.timeframe, + "strategy": payload.strategy, + "timerange": payload.timerange, + "freqaimodel": ( + payload.freqaimodel if payload.freqaimodel else config_loc.get("freqaimodel") + ), + } + ) + handleExchangePayload(payload, config_loc) + exchange = get_exchange(config_loc) + + validate_config_consistency(config_loc) + + try: + return RPC._rpc_analysed_history_full( + config_loc, + payload.pair, + payload.timeframe, + exchange, + payload.columns, + payload.live_mode, + ) + except Exception as e: + logger.exception("Error in pair_history_filtered") + raise HTTPException(status_code=502, detail=str(e)) diff --git a/freqtrade/rpc/api_server/api_schemas.py b/freqtrade/rpc/api_server/api_schemas.py index 9d3fde7e2..18007f6f2 100644 --- a/freqtrade/rpc/api_server/api_schemas.py +++ b/freqtrade/rpc/api_server/api_schemas.py @@ -524,10 +524,11 @@ class PairCandlesRequest(BaseModel): columns: list[str] | None = None -class PairHistoryRequest(PairCandlesRequest): +class PairHistoryRequest(PairCandlesRequest, ExchangeModePayloadMixin): timerange: str - strategy: str + strategy: str | None = None freqaimodel: str | None = None + live_mode: bool = False class PairHistory(BaseModel): @@ -606,6 +607,24 @@ class BacktestMarketChange(BaseModel): data: list[list[Any]] +class MarketRequest(ExchangeModePayloadMixin, BaseModel): + base: str | None = None + quote: str | None = None + + +class MarketModel(BaseModel): + symbol: str + base: str + quote: str + spot: bool + swap: bool + + +class MarketResponse(BaseModel): + markets: dict[str, MarketModel] + exchange_id: str + + class SysInfo(BaseModel): cpu_pct: list[float] ram_pct: float diff --git a/freqtrade/rpc/api_server/api_v1.py b/freqtrade/rpc/api_server/api_v1.py index 25fd12efd..8aafa04c6 100644 --- a/freqtrade/rpc/api_server/api_v1.py +++ b/freqtrade/rpc/api_server/api_v1.py @@ -1,14 +1,16 @@ import logging from copy import deepcopy +from typing import Annotated from fastapi import APIRouter, Depends, Query from fastapi.exceptions import HTTPException from freqtrade import __version__ from freqtrade.data.history import get_datahandler -from freqtrade.enums import CandleType, State, TradingMode +from freqtrade.enums import CandleType, RunMode, State, TradingMode from freqtrade.exceptions import OperationalException from freqtrade.rpc import RPC +from freqtrade.rpc.api_server.api_pairlists import handleExchangePayload from freqtrade.rpc.api_server.api_schemas import ( AvailablePairs, Balances, @@ -30,11 +32,12 @@ from freqtrade.rpc.api_server.api_schemas import ( Locks, LocksPayload, Logs, + MarketRequest, + MarketResponse, MixTag, OpenTradeSchema, PairCandlesRequest, PairHistory, - PairHistoryRequest, PerformanceEntry, Ping, PlotConfig, @@ -84,7 +87,8 @@ logger = logging.getLogger(__name__) # 2.35: pair_candles and pair_history endpoints as Post variant # 2.40: Add hyperopt-loss endpoint # 2.41: Add download-data endpoint -API_VERSION = 2.41 +# 2.42: Add /pair_history endpoint with live data +API_VERSION = 2.42 # Public API, requires no auth. router_public = APIRouter() @@ -342,58 +346,6 @@ def pair_candles_filtered(payload: PairCandlesRequest, rpc: RPC = Depends(get_rp ) -@router.get("/pair_history", response_model=PairHistory, tags=["candle data"]) -def pair_history( - pair: str, - timeframe: str, - timerange: str, - strategy: str, - freqaimodel: str | None = None, - config=Depends(get_config), - exchange=Depends(get_exchange), -): - # The initial call to this endpoint can be slow, as it may need to initialize - # the exchange class. - config = deepcopy(config) - config.update( - { - "timeframe": timeframe, - "strategy": strategy, - "timerange": timerange, - "freqaimodel": freqaimodel if freqaimodel else config.get("freqaimodel"), - } - ) - try: - return RPC._rpc_analysed_history_full(config, pair, timeframe, exchange, None) - except Exception as e: - raise HTTPException(status_code=502, detail=str(e)) - - -@router.post("/pair_history", response_model=PairHistory, tags=["candle data"]) -def pair_history_filtered( - payload: PairHistoryRequest, config=Depends(get_config), exchange=Depends(get_exchange) -): - # The initial call to this endpoint can be slow, as it may need to initialize - # the exchange class. - config = deepcopy(config) - config.update( - { - "timeframe": payload.timeframe, - "strategy": payload.strategy, - "timerange": payload.timerange, - "freqaimodel": ( - payload.freqaimodel if payload.freqaimodel else config.get("freqaimodel") - ), - } - ) - try: - return RPC._rpc_analysed_history_full( - config, payload.pair, payload.timeframe, exchange, payload.columns - ) - except Exception as e: - raise HTTPException(status_code=502, detail=str(e)) - - @router.get("/plot_config", response_model=PlotConfig, tags=["candle data"]) def plot_config( strategy: str | None = None, @@ -525,6 +477,29 @@ def list_available_pairs( return result +@router.get("/markets", response_model=MarketResponse, tags=["candle data", "webserver"]) +def markets( + query: Annotated[MarketRequest, Query()], + config=Depends(get_config), + rpc: RPC | None = Depends(get_rpc_optional), +): + if not rpc or config["runmode"] == RunMode.WEBSERVER: + # webserver mode + config_loc = deepcopy(config) + handleExchangePayload(query, config_loc) + exchange = get_exchange(config_loc) + else: + exchange = rpc._freqtrade.exchange + + return { + "markets": exchange.get_markets( + base_currencies=[query.base] if query.base else None, + quote_currencies=[query.quote] if query.quote else None, + ), + "exchange_id": exchange.id, + } + + @router.get("/sysinfo", response_model=SysInfo, tags=["info"]) def sysinfo(): return RPC._rpc_sysinfo() diff --git a/freqtrade/rpc/api_server/webserver.py b/freqtrade/rpc/api_server/webserver.py index e06e77e1e..aa81684fc 100644 --- a/freqtrade/rpc/api_server/webserver.py +++ b/freqtrade/rpc/api_server/webserver.py @@ -120,6 +120,7 @@ class ApiServer(RPCHandler): from freqtrade.rpc.api_server.api_background_tasks import router as api_bg_tasks from freqtrade.rpc.api_server.api_backtest import router as api_backtest from freqtrade.rpc.api_server.api_download_data import router as api_download_data + from freqtrade.rpc.api_server.api_pair_history import router as api_pair_history from freqtrade.rpc.api_server.api_pairlists import router as api_pairlists from freqtrade.rpc.api_server.api_v1 import router as api_v1 from freqtrade.rpc.api_server.api_v1 import router_public as api_v1_public @@ -145,6 +146,11 @@ class ApiServer(RPCHandler): prefix="/api/v1", dependencies=[Depends(http_basic_or_jwt_token), Depends(is_webserver_mode)], ) + app.include_router( + api_pair_history, + prefix="/api/v1", + dependencies=[Depends(http_basic_or_jwt_token), Depends(is_webserver_mode)], + ) app.include_router( api_pairlists, prefix="/api/v1", diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index bf7e53836..21ca0b081 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -31,7 +31,7 @@ from freqtrade.enums import ( TradingMode, ) from freqtrade.exceptions import ExchangeError, PricingError -from freqtrade.exchange import timeframe_to_minutes, timeframe_to_msecs +from freqtrade.exchange import Exchange, timeframe_to_minutes, timeframe_to_msecs from freqtrade.exchange.exchange_utils import price_to_precision from freqtrade.loggers import bufferHandler from freqtrade.persistence import KeyStoreKeys, KeyValueStore, PairLocks, Trade @@ -42,12 +42,13 @@ from freqtrade.rpc.rpc_types import RPCSendMsg from freqtrade.util import ( decimals_per_coin, dt_from_ts, + dt_humanize_delta, dt_now, + dt_ts, dt_ts_def, format_date, shorten_date, ) -from freqtrade.util.datetime_helpers import dt_humanize_delta from freqtrade.wallets import PositionWallet, Wallet @@ -1436,7 +1437,12 @@ class RPC: @staticmethod def _rpc_analysed_history_full( - config: Config, pair: str, timeframe: str, exchange, selected_cols: list[str] | None + config: Config, + pair: str, + timeframe: str, + exchange: Exchange, + selected_cols: list[str] | None, + live: bool, ) -> dict[str, Any]: timerange_parsed = TimeRange.parse_timerange(config.get("timerange")) @@ -1444,31 +1450,53 @@ class RPC: from freqtrade.data.dataprovider import DataProvider from freqtrade.resolvers.strategy_resolver import StrategyResolver - strategy = StrategyResolver.load_strategy(config) - startup_candles = strategy.startup_candle_count + strategy_name = "" + startup_candles = 0 + if config.get("strategy"): + strategy = StrategyResolver.load_strategy(config) + startup_candles = strategy.startup_candle_count + strategy_name = strategy.get_strategy_name() - _data = load_data( - datadir=config["datadir"], - pairs=[pair], - timeframe=timeframe, - timerange=timerange_parsed, - data_format=config["dataformat_ohlcv"], - candle_type=config.get("candle_type_def", CandleType.SPOT), - startup_candles=startup_candles, - ) - if pair not in _data: - raise RPCException( - f"No data for {pair}, {timeframe} in {config.get('timerange')} found." + if live: + data = exchange.get_historic_ohlcv( + pair=pair, + timeframe=timeframe, + since_ms=timerange_parsed.startts * 1000 + if timerange_parsed.startts + else dt_ts(dt_now() - timedelta(days=30)), + is_new_pair=True, # history is never available - so always treat as new pair + candle_type=config.get("candle_type_def", CandleType.SPOT), + until_ms=timerange_parsed.stopts, ) + else: + _data = load_data( + datadir=config["datadir"], + pairs=[pair], + timeframe=timeframe, + timerange=timerange_parsed, + data_format=config["dataformat_ohlcv"], + candle_type=config.get("candle_type_def", CandleType.SPOT), + startup_candles=startup_candles, + ) + if pair not in _data: + raise RPCException( + f"No data for {pair}, {timeframe} in {config.get('timerange')} found." + ) + data = _data[pair] - strategy.dp = DataProvider(config, exchange=exchange, pairlists=None) - strategy.ft_bot_start() + if config.get("strategy"): + strategy.dp = DataProvider(config, exchange=exchange, pairlists=None) + strategy.ft_bot_start() - df_analyzed = strategy.analyze_ticker(_data[pair], {"pair": pair}) - df_analyzed = trim_dataframe(df_analyzed, timerange_parsed, startup_candles=startup_candles) + df_analyzed = strategy.analyze_ticker(data, {"pair": pair}) + df_analyzed = trim_dataframe( + df_analyzed, timerange_parsed, startup_candles=startup_candles + ) + else: + df_analyzed = data return RPC._convert_dataframe_to_dict( - strategy.get_strategy_name(), + strategy_name, pair, timeframe, df_analyzed.copy(), diff --git a/ft_client/freqtrade_client/__init__.py b/ft_client/freqtrade_client/__init__.py index bde0df882..17ecee98b 100644 --- a/ft_client/freqtrade_client/__init__.py +++ b/ft_client/freqtrade_client/__init__.py @@ -1,7 +1,7 @@ from freqtrade_client.ft_rest_client import FtRestClient -__version__ = "2025.1-dev" +__version__ = "2025.2-dev" if "dev" in __version__: from pathlib import Path diff --git a/ft_client/freqtrade_client/ft_rest_client.py b/ft_client/freqtrade_client/ft_rest_client.py index 851583ee0..93e6a2821 100755 --- a/ft_client/freqtrade_client/ft_rest_client.py +++ b/ft_client/freqtrade_client/ft_rest_client.py @@ -23,10 +23,18 @@ PostDataT = dict[str, Any] | list[dict[str, Any]] | None class FtRestClient: def __init__( - self, serverurl, username=None, password=None, *, pool_connections=10, pool_maxsize=10 + self, + serverurl, + username=None, + password=None, + *, + pool_connections=10, + pool_maxsize=10, + timeout=10, ): self._serverurl = serverurl self._session = requests.Session() + self._timeout = timeout # allow configuration of pool adapter = HTTPAdapter(pool_connections=pool_connections, pool_maxsize=pool_maxsize) @@ -50,7 +58,9 @@ class FtRestClient: url = urlunparse((schema, netloc, path, par, query, fragment)) try: - resp = self._session.request(method, url, headers=hd, data=json.dumps(data)) + resp = self._session.request( + method, url, headers=hd, timeout=self._timeout, data=json.dumps(data) + ) # return resp.text return resp.json() except RequestConnectionError: diff --git a/requirements-dev.txt b/requirements-dev.txt index 14006b683..e7afc064d 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -7,22 +7,22 @@ -r docs/requirements-docs.txt coveralls==4.0.1 -ruff==0.9.3 -mypy==1.14.1 +ruff==0.9.5 +mypy==1.15.0 pre-commit==4.1.0 pytest==8.3.4 -pytest-asyncio==0.25.2 +pytest-asyncio==0.25.3 pytest-cov==6.0.0 pytest-mock==3.14.0 pytest-random-order==1.1.1 pytest-timeout==2.3.1 pytest-xdist==3.6.1 -isort==5.13.2 +isort==6.0.0 # For datetime mocking time-machine==2.16.0 # Convert jupyter notebooks to markdown documents -nbconvert==7.16.5 +nbconvert==7.16.6 # mypy types types-cachetools==5.5.0.20240820 diff --git a/requirements-freqai-rl.txt b/requirements-freqai-rl.txt index d17e28d33..413feec8f 100644 --- a/requirements-freqai-rl.txt +++ b/requirements-freqai-rl.txt @@ -3,9 +3,11 @@ # Required for freqai-rl torch==2.2.2; sys_platform == 'darwin' and platform_machine == 'x86_64' -torch==2.5.1; sys_platform != 'darwin' or platform_machine != 'x86_64' +torch==2.6.0; sys_platform != 'darwin' or platform_machine != 'x86_64' gymnasium==0.29.1 -stable_baselines3==2.4.1 +# SB3 >=2.5.0 depends on torch 2.3.0 - which implies it dropped support x86 macos +stable_baselines3==2.4.1; sys_platform == 'darwin' and platform_machine == 'x86_64' +stable_baselines3==2.5.0; sys_platform != 'darwin' or platform_machine != 'x86_64' sb3_contrib>=2.2.1 # Progress bar for stable-baselines3 and sb3-contrib tqdm==4.67.1 diff --git a/requirements-freqai.txt b/requirements-freqai.txt index b66b309c6..c978b63cb 100644 --- a/requirements-freqai.txt +++ b/requirements-freqai.txt @@ -7,6 +7,6 @@ scikit-learn==1.6.1 joblib==1.4.2 catboost==1.2.7; 'arm' not in platform_machine lightgbm==4.5.0 -xgboost==2.1.3 +xgboost==2.1.4 tensorboard==2.18.0 datasieve==0.1.7 diff --git a/requirements-plot.txt b/requirements-plot.txt index a50d56ead..16a162600 100644 --- a/requirements-plot.txt +++ b/requirements-plot.txt @@ -1,4 +1,4 @@ # Include all requirements to run the bot. -r requirements.txt -plotly==5.24.1 +plotly==6.0.0 diff --git a/requirements.txt b/requirements.txt index fe7078f01..34becb2d3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,11 +4,11 @@ bottleneck==1.4.2 numexpr==2.10.2 pandas-ta==0.3.14b -ccxt==4.4.50 +ccxt==4.4.58 cryptography==42.0.8; platform_machine == 'armv7l' -cryptography==44.0.0; platform_machine != 'armv7l' -aiohttp==3.10.11 -SQLAlchemy==2.0.37 +cryptography==44.0.1; platform_machine != 'armv7l' +aiohttp==3.9.5 +SQLAlchemy==2.0.38 python-telegram-bot==21.10 # can't be hard-pinned due to telegram-bot pinning httpx with ~ httpx>=0.24.1 @@ -17,7 +17,7 @@ cachetools==5.5.1 requests==2.32.3 urllib3==2.3.0 jsonschema==4.23.0 -TA-Lib==0.4.34 +TA-Lib==0.4.38 technical==1.5.0 tabulate==0.9.0 pycoingecko==3.2.0 @@ -38,7 +38,7 @@ orjson==3.10.15 sdnotify==0.3.2 # API Server -fastapi==0.115.7 +fastapi==0.115.8 pydantic==2.10.6 uvicorn==0.34.0 pyjwt==2.10.1 @@ -50,7 +50,7 @@ questionary==2.1.0 prompt-toolkit==3.0.50 # Extensions to datetime library python-dateutil==2.9.0.post0 -pytz==2024.2 +pytz==2025.1 #Futures schedule==1.2.2 diff --git a/tests/conftest.py b/tests/conftest.py index 142c8a443..ca382f6ae 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1779,15 +1779,6 @@ def limit_buy_order_open(): } -@pytest.fixture(scope="function") -def limit_buy_order(limit_buy_order_open): - order = deepcopy(limit_buy_order_open) - order["status"] = "closed" - order["filled"] = order["amount"] - order["remaining"] = 0.0 - return order - - @pytest.fixture def limit_buy_order_old(): return { diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 313c11e4d..0ed8e97e9 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -645,7 +645,7 @@ def test_reload_markets(default_conf, mocker, caplog, time_machine): # Tried once, failed lam_spy.reset_mock() - # When forceing (bot startup), it should retry 3 times. + # When forcing (bot startup), it should retry 3 times. exchange.reload_markets(force=True) assert lam_spy.call_count == 4 assert exchange.markets == updated_markets @@ -4439,7 +4439,7 @@ def test_ohlcv_candle_limit(default_conf, mocker, exchange_name): pytest.skip("Tested separately for okx") exchange = get_patched_exchange(mocker, default_conf, exchange=exchange_name) timeframes = ("1m", "5m", "1h") - expected = exchange._ft_has["ohlcv_candle_limit"] + expected = exchange._ft_has.get("ohlcv_candle_limit", 500) for timeframe in timeframes: # if 'ohlcv_candle_limit_per_timeframe' in exchange._ft_has: # expected = exchange._ft_has['ohlcv_candle_limit_per_timeframe'][timeframe] @@ -6262,3 +6262,26 @@ def test_price_to_precision_with_default_conf(default_conf, mocker): prec_price = patched_ex.price_to_precision("XRP/USDT", 1.0000000101) assert prec_price == 1.00000001 assert prec_price == 1.00000001 + + +def test_exchange_features(default_conf, mocker): + conf = copy.deepcopy(default_conf) + exchange = get_patched_exchange(mocker, conf) + exchange._api_async.features = { + "spot": { + "fetchOHLCV": { + "limit": 995, + } + }, + "swap": { + "linear": { + "fetchOHLCV": { + "limit": 997, + } + } + }, + } + assert exchange.features("spot", "fetchOHLCV", "limit", 500) == 995 + assert exchange.features("futures", "fetchOHLCV", "limit", 500) == 997 + # Fall back to default + assert exchange.features("futures", "fetchOHLCV_else", "limit", 601) == 601 diff --git a/tests/exchange/test_exchange_ws.py b/tests/exchange/test_exchange_ws.py index 5f3e676ef..6dee7f339 100644 --- a/tests/exchange/test_exchange_ws.py +++ b/tests/exchange/test_exchange_ws.py @@ -1,9 +1,12 @@ import asyncio +import logging import threading from datetime import timedelta from time import sleep from unittest.mock import AsyncMock, MagicMock +from ccxt import NotSupported + from freqtrade.enums import CandleType from freqtrade.exchange.exchange_ws import ExchangeWS from ft_client.test_client.test_rest_client import log_has_re @@ -61,15 +64,18 @@ def patch_eventloop_threading(exchange): pass -async def test_exchangews_ohlcv(mocker, time_machine): +async def test_exchangews_ohlcv(mocker, time_machine, caplog): config = MagicMock() ccxt_object = MagicMock() + caplog.set_level(logging.DEBUG) async def sleeper(*args, **kwargs): # pass await asyncio.sleep(0.12) return MagicMock() + ccxt_object.un_watch_ohlcv_for_symbols = AsyncMock(side_effect=NotSupported) + ccxt_object.watch_ohlcv = AsyncMock(side_effect=sleeper) ccxt_object.close = AsyncMock() time_machine.move_to("2024-11-01 01:00:02 +00:00") @@ -101,11 +107,14 @@ async def test_exchangews_ohlcv(mocker, time_machine): time_machine.shift(timedelta(minutes=5)) exchange_ws.schedule_ohlcv("ETH/BTC", "1m", CandleType.SPOT) await asyncio.sleep(1) + assert log_has_re("un_watch_ohlcv_for_symbols not supported: ", caplog) # XRP/BTC should be cleaned up. assert exchange_ws._klines_watching == { ("ETH/BTC", "1m", CandleType.SPOT), } + # Cleanup happened. + ccxt_object.un_watch_ohlcv_for_symbols = AsyncMock(side_effect=ValueError) exchange_ws.schedule_ohlcv("ETH/BTC", "1m", CandleType.SPOT) assert exchange_ws._klines_watching == { ("ETH/BTC", "1m", CandleType.SPOT), @@ -117,6 +126,7 @@ async def test_exchangews_ohlcv(mocker, time_machine): finally: # Cleanup exchange_ws.cleanup() + assert log_has_re("Exception in _unwatch_ohlcv", caplog) async def test_exchangews_get_ohlcv(mocker, caplog): diff --git a/tests/exchange_online/conftest.py b/tests/exchange_online/conftest.py index 6c54984a6..8eedcfb01 100644 --- a/tests/exchange_online/conftest.py +++ b/tests/exchange_online/conftest.py @@ -21,6 +21,7 @@ EXCHANGES = { "use_ci_proxy": True, "hasQuoteVolume": True, "timeframe": "1h", + "candle_count": 1000, "futures": True, "futures_pair": "BTC/USDT:USDT", "hasQuoteVolumeFutures": True, @@ -96,6 +97,7 @@ EXCHANGES = { "stake_currency": "USDT", "hasQuoteVolume": True, "timeframe": "1h", + "candle_count": 1000, "futures": False, "skip_ws_tests": True, "sample_order": [ @@ -136,6 +138,7 @@ EXCHANGES = { "stake_currency": "USD", "hasQuoteVolume": True, "timeframe": "1h", + "candle_count": 720, "leverage_tiers_public": False, "leverage_in_spot_market": True, "trades_lookback_hours": 12, @@ -162,6 +165,7 @@ EXCHANGES = { "stake_currency": "USDT", "hasQuoteVolume": True, "timeframe": "1h", + "candle_count": 1500, "leverage_tiers_public": False, "leverage_in_spot_market": True, "sample_order": [ @@ -229,6 +233,7 @@ EXCHANGES = { "stake_currency": "USDT", "hasQuoteVolume": True, "timeframe": "1h", + "candle_count": 1000, "futures": True, "futures_pair": "BTC/USDT:USDT", "hasQuoteVolumeFutures": True, @@ -345,6 +350,7 @@ EXCHANGES = { "stake_currency": "USDT", "hasQuoteVolume": True, "timeframe": "1h", + "candle_count": 300, "futures": True, "futures_pair": "BTC/USDT:USDT", "hasQuoteVolumeFutures": False, @@ -358,6 +364,7 @@ EXCHANGES = { "hasQuoteVolume": True, "use_ci_proxy": True, "timeframe": "1h", + "candle_count": 1000, "futures_pair": "BTC/USDT:USDT", "futures": True, "orderbook_max_entries": 50, @@ -398,6 +405,7 @@ EXCHANGES = { "stake_currency": "USDT", "hasQuoteVolume": True, "timeframe": "1h", + "candle_count": 200, "orderbook_max_entries": 50, }, "htx": { @@ -405,13 +413,14 @@ EXCHANGES = { "stake_currency": "BTC", "hasQuoteVolume": True, "timeframe": "1h", - "futures": False, + "candle_count": 1000, }, "bitvavo": { "pair": "BTC/EUR", "stake_currency": "EUR", "hasQuoteVolume": True, "timeframe": "1h", + "candle_count": 1440, "leverage_tiers_public": False, "leverage_in_spot_market": False, }, @@ -420,6 +429,7 @@ EXCHANGES = { "stake_currency": "USDT", "hasQuoteVolume": True, "timeframe": "1h", + "candle_count": 1000, "futures": False, "sample_order": [ { @@ -482,6 +492,7 @@ EXCHANGES = { "hasQuoteVolume": False, "timeframe": "1h", "futures": True, + "candle_count": 5000, "orderbook_max_entries": 20, "futures_pair": "BTC/USDC:USDC", "hasQuoteVolumeFutures": True, diff --git a/tests/exchange_online/test_ccxt_compat.py b/tests/exchange_online/test_ccxt_compat.py index 42a8862ad..85de9b5ec 100644 --- a/tests/exchange_online/test_ccxt_compat.py +++ b/tests/exchange_online/test_ccxt_compat.py @@ -48,6 +48,22 @@ class TestCCXTExchange: } ) + def test_ohlcv_limit(self, exchange: EXCHANGE_FIXTURE_TYPE): + exch, exchangename = exchange + expected_count = EXCHANGES[exchangename].get("candle_count") + if not expected_count: + pytest.skip("No expected candle count for exchange") + + assert exch.ohlcv_candle_limit("1m", CandleType.SPOT) == expected_count + + def test_ohlcv_limit_futures(self, exchange_futures: EXCHANGE_FIXTURE_TYPE): + exch, exchangename = exchange_futures + expected_count = EXCHANGES[exchangename].get("candle_count") + if not expected_count: + pytest.skip("No expected candle count for exchange") + + assert exch.ohlcv_candle_limit("1m", CandleType.SPOT) == expected_count + def test_load_markets_futures(self, exchange_futures: EXCHANGE_FIXTURE_TYPE): exchange, exchangename = exchange_futures pair = EXCHANGES[exchangename]["pair"] diff --git a/tests/plugins/test_percentchangepairlist.py b/tests/plugins/test_percentchangepairlist.py index 6f399fc9f..7c2f16d76 100644 --- a/tests/plugins/test_percentchangepairlist.py +++ b/tests/plugins/test_percentchangepairlist.py @@ -107,7 +107,7 @@ def test_volume_change_pair_list_init_wrong_lookback_period(mocker, rpl_config): with pytest.raises( OperationalException, match=r"ChangeFilter requires lookback_period to not exceed" - r" exchange max request size \(1000\)", + r" exchange max request size \(\d+\)", ): get_patched_freqtradebot(mocker, rpl_config) diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index 2c895c963..af33cd95c 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -36,6 +36,7 @@ from tests.conftest import ( EXMS, create_mock_trades, create_mock_trades_usdt, + generate_test_data, get_mock_coro, get_patched_freqtradebot, log_has, @@ -220,16 +221,16 @@ def test_api_ws_auth(botclient): bad_token = "bad-ws_token" with pytest.raises(WebSocketDisconnect): - with client.websocket_connect(url(bad_token)) as websocket: - websocket.receive() + with client.websocket_connect(url(bad_token)): + pass good_token = _TEST_WS_TOKEN - with client.websocket_connect(url(good_token)) as websocket: + with client.websocket_connect(url(good_token)): pass jwt_secret = ftbot.config["api_server"].get("jwt_secret_key", "super-secret") jwt_token = create_token({"identity": {"u": "Freqtrade"}}, jwt_secret) - with client.websocket_connect(url(jwt_token)) as websocket: + with client.websocket_connect(url(jwt_token)): pass @@ -1914,6 +1915,15 @@ def test_api_pair_history(botclient, tmp_path, mocker): timeframe = "5m" lfm = mocker.patch("freqtrade.strategy.interface.IStrategy.load_freqAI_model") + # Wrong mode + rc = client_get( + client, + f"{BASE_URI}/pair_history?timeframe={timeframe}" + f"&timerange=20180111-20180112&strategy={CURRENT_TEST_STRATEGY}", + ) + assert_response(rc, 503) + _ftbot.config["runmode"] = RunMode.WEBSERVER + # No pair rc = client_get( client, @@ -2025,6 +2035,87 @@ def test_api_pair_history(botclient, tmp_path, mocker): assert_response(rc, 502) assert rc.json()["detail"] == ("No data for UNITTEST/BTC, 5m in 20200111-20200112 found.") + # No strategy + rc = client_post( + client, + f"{BASE_URI}/pair_history", + data={ + "pair": "UNITTEST/BTC", + "timeframe": timeframe, + "timerange": "20180111-20180112", + # "strategy": CURRENT_TEST_STRATEGY, + "columns": ["rsi", "fastd", "fastk"], + }, + ) + assert_response(rc, 200) + result = rc.json() + assert result["length"] == 289 + assert len(result["data"]) == result["length"] + assert "columns" in result + assert "data" in result + # Result without strategy won't have enter_long assigned. + assert "enter_long" not in result["columns"] + assert result["columns"] == ["date", "open", "high", "low", "close", "volume", "__date_ts"] + + +def test_api_pair_history_live_mode(botclient, tmp_path, mocker): + _ftbot, client = botclient + _ftbot.config["user_data_dir"] = tmp_path + _ftbot.config["runmode"] = RunMode.WEBSERVER + + mocker.patch("freqtrade.strategy.interface.IStrategy.load_freqAI_model") + # no strategy, live data + gho = mocker.patch( + "freqtrade.exchange.binance.Binance.get_historic_ohlcv", + return_value=generate_test_data("1h", 100), + ) + rc = client_post( + client, + f"{BASE_URI}/pair_history", + data={ + "pair": "UNITTEST/BTC", + "timeframe": "1h", + "timerange": "20240101-", + # "strategy": CURRENT_TEST_STRATEGY, + "columns": ["rsi", "fastd", "fastk"], + "live_mode": True, + }, + ) + + assert_response(rc, 200) + result = rc.json() + # 100 candles - as in the generate_test_data call above + assert result["length"] == 100 + assert len(result["data"]) == result["length"] + assert result["columns"] == ["date", "open", "high", "low", "close", "volume", "__date_ts"] + assert gho.call_count == 1 + + gho.reset_mock() + rc = client_post( + client, + f"{BASE_URI}/pair_history", + data={ + "pair": "UNITTEST/BTC", + "timeframe": "1h", + "timerange": "20240101-", + "strategy": CURRENT_TEST_STRATEGY, + "columns": ["rsi", "fastd", "fastk"], + "live_mode": True, + }, + ) + + assert_response(rc, 200) + result = rc.json() + # 80 candles - as in the generate_test_data call above - 20 startup candles + assert result["length"] == 100 - 20 + assert len(result["data"]) == result["length"] + + assert "rsi" in result["columns"] + assert "enter_long" in result["columns"] + assert "fastd" in result["columns"] + assert "date" in result["columns"] + assert gho.call_count == 1 + def test_api_plot_config(botclient, mocker, tmp_path): ftbot, client = botclient @@ -2849,7 +2940,7 @@ def test_api_ws_send_msg(default_conf, mocker, caplog): ApiServer.shutdown() -def test_api_download_data(botclient, mocker, tmp_path, caplog): +def test_api_download_data(botclient, mocker, tmp_path): ftbot, client = botclient rc = client_post(client, f"{BASE_URI}/download_data", data={}) @@ -2918,3 +3009,55 @@ def test_api_download_data(botclient, mocker, tmp_path, caplog): assert response["job_category"] == "download_data" assert response["status"] == "failed" assert response["error"] == "Download error" + + +def test_api_markets_live(botclient): + ftbot, client = botclient + + rc = client_get(client, f"{BASE_URI}/markets") + assert_response(rc, 200) + response = rc.json() + assert "markets" in response + assert len(response["markets"]) >= 0 + assert response["markets"]["XRP/USDT"] == { + "base": "XRP", + "quote": "USDT", + "symbol": "XRP/USDT", + "spot": True, + "swap": False, + } + + assert "BTC/USDT" in response["markets"] + assert "XRP/BTC" in response["markets"] + + rc = client_get( + client, + f"{BASE_URI}/markets?base=XRP", + ) + assert_response(rc, 200) + response = rc.json() + assert "XRP/USDT" in response["markets"] + assert "XRP/BTC" in response["markets"] + + assert "BTC/USDT" not in response["markets"] + + +def test_api_markets_webserver(botclient): + # Ensure webserver exchanges are reset + ApiBG.exchanges = {} + ftbot, client = botclient + # Test in webserver mode + ftbot.config["runmode"] = RunMode.WEBSERVER + + rc = client_get(client, f"{BASE_URI}/markets?exchange=binance") + assert_response(rc, 200) + response = rc.json() + assert "markets" in response + assert len(response["markets"]) >= 0 + assert response["exchange_id"] == "binance" + + rc = client_get(client, f"{BASE_URI}/markets?exchange=hyperliquid") + assert_response(rc, 200) + + assert "hyperliquid_spot" in ApiBG.exchanges + assert "binance_spot" in ApiBG.exchanges