From a3e97527d1626f2804f86c15ef94c33e91a56fe6 Mon Sep 17 00:00:00 2001 From: LMessi2000 Date: Wed, 3 Dec 2025 20:41:01 +0800 Subject: [PATCH 001/117] fix(okx): correct PriceType.MARK and PriceType.INDEX mapping --- freqtrade/exchange/okx.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index bd401d198..c8c1130e5 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -41,8 +41,8 @@ class Okx(Exchange): "stop_price_type_field": "slTriggerPxType", "stop_price_type_value_mapping": { PriceType.LAST: "last", - PriceType.MARK: "index", - PriceType.INDEX: "mark", + PriceType.MARK: "mark", + PriceType.INDEX: "index", }, "stoploss_blocks_assets": False, "ws_enabled": True, From 81e4e0d301aabe9557522a65d74a235a36494d96 Mon Sep 17 00:00:00 2001 From: LMessi2000 Date: Wed, 3 Dec 2025 20:58:12 +0800 Subject: [PATCH 002/117] test(okx): add unit test for stop_price_type_value_mapping --- tests/exchange/test_okx.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/tests/exchange/test_okx.py b/tests/exchange/test_okx.py index 750afbd40..e11b83146 100644 --- a/tests/exchange/test_okx.py +++ b/tests/exchange/test_okx.py @@ -4,7 +4,7 @@ from unittest.mock import AsyncMock, MagicMock, PropertyMock import ccxt import pytest -from freqtrade.enums import CandleType, MarginMode, TradingMode +from freqtrade.enums import CandleType, MarginMode, PriceType, TradingMode from freqtrade.exceptions import RetryableOrderError, TemporaryError from freqtrade.exchange.common import API_RETRY_COUNT from freqtrade.exchange.exchange import timeframe_to_minutes @@ -681,6 +681,26 @@ def test__get_stop_params_okx(mocker, default_conf): assert params["posSide"] == "net" +def test_okx_stop_price_type_mapping(mocker, default_conf): + """ + Test that OKX stop_price_type_value_mapping correctly maps PriceType values. + PriceType.MARK should map to "mark", PriceType.INDEX should map to "index". + """ + default_conf["trading_mode"] = "futures" + default_conf["margin_mode"] = "isolated" + exchange = get_patched_exchange(mocker, default_conf, exchange="okx") + + # Verify the mapping is correct + mapping = exchange._ft_has.get("stop_price_type_value_mapping", {}) + + assert mapping.get(PriceType.LAST) == "last" + assert mapping.get(PriceType.MARK) == "mark" + assert mapping.get(PriceType.INDEX) == "index" + + # Verify stop_price_type_field is set correctly + assert exchange._ft_has.get("stop_price_type_field") == "slTriggerPxType" + + def test_fetch_orders_okx(default_conf, mocker, limit_order): api_mock = MagicMock() api_mock.fetch_orders = MagicMock( From 606dbe5db121709f4fd4f615709330b1ff679820 Mon Sep 17 00:00:00 2001 From: LMessi2000 Date: Wed, 3 Dec 2025 22:17:59 +0800 Subject: [PATCH 003/117] Revert "test(okx): add unit test for stop_price_type_value_mapping" This reverts commit 81e4e0d301aabe9557522a65d74a235a36494d96. --- tests/exchange/test_okx.py | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/tests/exchange/test_okx.py b/tests/exchange/test_okx.py index e11b83146..750afbd40 100644 --- a/tests/exchange/test_okx.py +++ b/tests/exchange/test_okx.py @@ -4,7 +4,7 @@ from unittest.mock import AsyncMock, MagicMock, PropertyMock import ccxt import pytest -from freqtrade.enums import CandleType, MarginMode, PriceType, TradingMode +from freqtrade.enums import CandleType, MarginMode, TradingMode from freqtrade.exceptions import RetryableOrderError, TemporaryError from freqtrade.exchange.common import API_RETRY_COUNT from freqtrade.exchange.exchange import timeframe_to_minutes @@ -681,26 +681,6 @@ def test__get_stop_params_okx(mocker, default_conf): assert params["posSide"] == "net" -def test_okx_stop_price_type_mapping(mocker, default_conf): - """ - Test that OKX stop_price_type_value_mapping correctly maps PriceType values. - PriceType.MARK should map to "mark", PriceType.INDEX should map to "index". - """ - default_conf["trading_mode"] = "futures" - default_conf["margin_mode"] = "isolated" - exchange = get_patched_exchange(mocker, default_conf, exchange="okx") - - # Verify the mapping is correct - mapping = exchange._ft_has.get("stop_price_type_value_mapping", {}) - - assert mapping.get(PriceType.LAST) == "last" - assert mapping.get(PriceType.MARK) == "mark" - assert mapping.get(PriceType.INDEX) == "index" - - # Verify stop_price_type_field is set correctly - assert exchange._ft_has.get("stop_price_type_field") == "slTriggerPxType" - - def test_fetch_orders_okx(default_conf, mocker, limit_order): api_mock = MagicMock() api_mock.fetch_orders = MagicMock( From e76b9bb64a328c6a26d9c8780b665e987f476e3d Mon Sep 17 00:00:00 2001 From: Freqtrade Bot <154552126+freqtrade-bot@users.noreply.github.com> Date: Thu, 4 Dec 2025 03:27:18 +0000 Subject: [PATCH 004/117] chore: update pre-commit hooks --- .../exchange/binance_leverage_tiers.json | 3933 ++++++++--------- 1 file changed, 1738 insertions(+), 2195 deletions(-) diff --git a/freqtrade/exchange/binance_leverage_tiers.json b/freqtrade/exchange/binance_leverage_tiers.json index 3d374cacd..e0e983fc8 100644 --- a/freqtrade/exchange/binance_leverage_tiers.json +++ b/freqtrade/exchange/binance_leverage_tiers.json @@ -2417,10 +2417,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -2434,10 +2434,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -2451,10 +2451,10 @@ "minNotional": 10000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -3346,161 +3346,6 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, - "info": { - "bracket": "2", - "initialLeverage": "25", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "symbol": "4/USDT:USDT", - "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, - "info": { - "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" - } - }, - { - "tier": 4.0, - "symbol": "4/USDT:USDT", - "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, - "info": { - "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" - } - }, - { - "tier": 5.0, - "symbol": "4/USDT:USDT", - "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "4/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "6", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.125", - "cum": "6950.0" - } - }, - { - "tier": 7.0, - "symbol": "4/USDT:USDT", - "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "7", - "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "17375.0" - } - }, - { - "tier": 8.0, - "symbol": "4/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "8", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "59025.0" - } - }, - { - "tier": 9.0, - "symbol": "4/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, - "maintenanceMarginRate": 0.5, - "maxLeverage": 1.0, - "info": { - "bracket": "9", - "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", - "maintMarginRatio": "0.5", - "cum": "1934025.0" - } - } - ], - "42/USDT:USDT": [ - { - "tier": 1.0, - "symbol": "42/USDT:USDT", - "currency": "USDT", - "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, - "info": { - "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", - "notionalFloor": "0", - "maintMarginRatio": "0.015", - "cum": "0.0" - } - }, - { - "tier": 2.0, - "symbol": "42/USDT:USDT", - "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { @@ -3514,7 +3359,7 @@ }, { "tier": 3.0, - "symbol": "42/USDT:USDT", + "symbol": "4/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 20000.0, @@ -3529,6 +3374,144 @@ "cum": "300.0" } }, + { + "tier": 4.0, + "symbol": "4/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" + } + }, + { + "tier": 5.0, + "symbol": "4/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "2550.0" + } + }, + { + "tier": 6.0, + "symbol": "4/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "6", + "initialLeverage": "3", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1667", + "cum": "12975.0" + } + }, + { + "tier": 7.0, + "symbol": "4/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.25", + "cum": "54625.0" + } + }, + { + "tier": 8.0, + "symbol": "4/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "1929625.0" + } + } + ], + "42/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "42/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 10.0, + "info": { + "bracket": "1", + "initialLeverage": "10", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.015", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "42/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 8.0, + "info": { + "bracket": "2", + "initialLeverage": "8", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "42/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, + "info": { + "bracket": "3", + "initialLeverage": "6", + "notionalCap": "20000", + "notionalFloor": "10000", + "maintMarginRatio": "0.05", + "cum": "300.0" + } + }, { "tier": 4.0, "symbol": "42/USDT:USDT", @@ -5931,10 +5914,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.015", @@ -5948,10 +5931,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -5965,10 +5948,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -6741,14 +6724,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 40.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "40", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -6766,7 +6749,7 @@ "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { @@ -6774,23 +6757,23 @@ "symbol": "AIOT/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "25000", + "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.05", - "cum": "300.0" + "cum": "275.0" } }, { "tier": 4.0, "symbol": "AIOT/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, + "minNotional": 20000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, @@ -6798,9 +6781,9 @@ "bracket": "4", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "25000", + "notionalFloor": "20000", "maintMarginRatio": "0.1", - "cum": "1550.0" + "cum": "1275.0" } }, { @@ -6808,67 +6791,67 @@ "symbol": "AIOT/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 250000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "250000", + "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2800.0" + "cum": "2525.0" } }, { "tier": 6.0, "symbol": "AIOT/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { "bracket": "6", "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "13225.0" + "cum": "6695.0" } }, { "tier": 7.0, "symbol": "AIOT/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", + "notionalCap": "2500000", + "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "54875.0" + "cum": "27520.0" } }, { "tier": 8.0, "symbol": "AIOT/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929875.0" + "cum": "652520.0" } } ], @@ -7052,10 +7035,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.015", @@ -7069,10 +7052,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -7086,10 +7069,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -15304,14 +15287,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 40.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "40", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -15321,14 +15304,14 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.025", "cum": "25.0" } }, @@ -15337,67 +15320,67 @@ "symbol": "BAS/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "275.0" } }, { "tier": 4.0, "symbol": "BAS/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1275.0" } }, { "tier": 5.0, "symbol": "BAS/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "2525.0" } }, { "tier": 6.0, "symbol": "BAS/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 100000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "6", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.125", - "cum": "6950.0" + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "6695.0" } }, { @@ -15405,50 +15388,33 @@ "symbol": "BAS/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "7", - "initialLeverage": "3", - "notionalCap": "500000", + "initialLeverage": "2", + "notionalCap": "2500000", "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "17375.0" + "maintMarginRatio": "0.25", + "cum": "27520.0" } }, { "tier": 8.0, "symbol": "BAS/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "8", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "59025.0" - } - }, - { - "tier": 9.0, - "symbol": "BAS/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "652520.0" } } ], @@ -16114,10 +16080,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 40.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "40", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -16131,10 +16097,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -16148,10 +16114,10 @@ "minNotional": 10000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -17044,10 +17010,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 40.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "40", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -17061,10 +17027,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -17078,10 +17044,10 @@ "minNotional": 10000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -20025,10 +19991,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 40.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "40", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -20042,10 +20008,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -20059,10 +20025,10 @@ "minNotional": 10000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -21335,10 +21301,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.015", @@ -21352,10 +21318,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -21369,10 +21335,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -21473,10 +21439,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.015", @@ -21490,10 +21456,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -21507,10 +21473,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -22109,15 +22075,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -22125,71 +22091,54 @@ "symbol": "CARV/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "CARV/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "CARV/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "CARV/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "CARV/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -22197,16 +22146,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "CARV/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, @@ -22214,16 +22163,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "59025.0" + "cum": "54625.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "CARV/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -22231,12 +22180,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "1929625.0" } } ], @@ -23384,10 +23333,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 40.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "40", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -23401,10 +23350,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -23418,10 +23367,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -25091,10 +25040,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 40.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "40", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -25108,10 +25057,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -25125,10 +25074,10 @@ "minNotional": 10000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -25555,14 +25504,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 40.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "40", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -25572,14 +25521,14 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.025", "cum": "25.0" } }, @@ -25588,67 +25537,67 @@ "symbol": "CROSS/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "275.0" } }, { "tier": 4.0, "symbol": "CROSS/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1275.0" } }, { "tier": 5.0, "symbol": "CROSS/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "2525.0" } }, { "tier": 6.0, "symbol": "CROSS/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 100000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "6", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.125", - "cum": "6950.0" + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "6695.0" } }, { @@ -25656,50 +25605,33 @@ "symbol": "CROSS/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "7", - "initialLeverage": "3", - "notionalCap": "500000", + "initialLeverage": "2", + "notionalCap": "2500000", "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "17375.0" + "maintMarginRatio": "0.25", + "cum": "27520.0" } }, { "tier": 8.0, "symbol": "CROSS/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "8", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "59025.0" - } - }, - { - "tier": 9.0, - "symbol": "CROSS/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "652520.0" } } ], @@ -26297,10 +26229,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.015", @@ -26314,10 +26246,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -26331,10 +26263,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -27038,10 +26970,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.015", @@ -27055,10 +26987,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -27072,10 +27004,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -28762,10 +28694,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 40.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "40", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -28779,10 +28711,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -28796,10 +28728,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -30018,15 +29950,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -30034,71 +29966,54 @@ "symbol": "DRIFT/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "DRIFT/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "DRIFT/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "DRIFT/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "DRIFT/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -30106,16 +30021,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "DRIFT/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, @@ -30123,16 +30038,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "59025.0" + "cum": "54625.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "DRIFT/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -30140,12 +30055,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "1929625.0" } } ], @@ -32274,10 +32189,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 40.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "40", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -32291,10 +32206,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -32308,10 +32223,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -34442,10 +34357,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.015", @@ -34459,10 +34374,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -34476,10 +34391,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -34716,13 +34631,13 @@ "symbol": "FARTCOIN/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 20000.0, + "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "20000", + "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -34732,136 +34647,170 @@ "tier": 2.0, "symbol": "FARTCOIN/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 200000.0, + "minNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "200000", - "notionalFloor": "20000", + "notionalCap": "10000", + "notionalFloor": "5000", "maintMarginRatio": "0.015", - "cum": "100.0" + "cum": "25.0" } }, { "tier": 3.0, "symbol": "FARTCOIN/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 1000000.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "1000000", - "notionalFloor": "200000", + "notionalCap": "50000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "1100.0" + "cum": "75.0" } }, { "tier": 4.0, "symbol": "FARTCOIN/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "6100.0" + "cum": "325.0" } }, { "tier": 5.0, "symbol": "FARTCOIN/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 100000.0, + "maxNotional": 175000.0, + "maintenanceMarginRate": 0.0333, + "maxLeverage": 15.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "5000000", - "notionalFloor": "2000000", - "maintMarginRatio": "0.05", - "cum": "56100.0" + "initialLeverage": "15", + "notionalCap": "175000", + "notionalFloor": "100000", + "maintMarginRatio": "0.0333", + "cum": "1155.0" } }, { "tier": 6.0, "symbol": "FARTCOIN/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 175000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "6", - "initialLeverage": "5", - "notionalCap": "7500000", - "notionalFloor": "5000000", - "maintMarginRatio": "0.1", - "cum": "306100.0" + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "175000", + "maintMarginRatio": "0.05", + "cum": "4077.5" } }, { "tier": 7.0, "symbol": "FARTCOIN/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 10000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 250000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "10000000", - "notionalFloor": "7500000", - "maintMarginRatio": "0.125", - "cum": "493600.0" + "initialLeverage": "5", + "notionalCap": "750000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "16577.5" } }, { "tier": 8.0, "symbol": "FARTCOIN/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 12500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "12500000", - "notionalFloor": "10000000", - "maintMarginRatio": "0.25", - "cum": "1743600.0" + "initialLeverage": "4", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.125", + "cum": "35327.5" } }, { "tier": 9.0, "symbol": "FARTCOIN/USDT:USDT", "currency": "USDT", - "minNotional": 12500000.0, - "maxNotional": 15000000.0, + "minNotional": 1500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "9", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.1667", + "cum": "97877.5" + } + }, + { + "tier": 10.0, + "symbol": "FARTCOIN/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "10", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "472727.5" + } + }, + { + "tier": 11.0, + "symbol": "FARTCOIN/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "11", "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "12500000", + "notionalCap": "12500000", + "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "4868600.0" + "cum": "2347727.5" } } ], @@ -35217,10 +35166,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 40.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "40", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -35234,10 +35183,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -35251,10 +35200,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -35837,10 +35786,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -35854,10 +35803,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -35871,10 +35820,10 @@ "minNotional": 10000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -35975,10 +35924,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -35992,10 +35941,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -36009,10 +35958,10 @@ "minNotional": 10000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -36233,15 +36182,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -36249,71 +36198,54 @@ "symbol": "FLOCK/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "FLOCK/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "FLOCK/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "FLOCK/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "FLOCK/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -36321,16 +36253,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "FLOCK/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, @@ -36338,16 +36270,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "59025.0" + "cum": "54625.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "FLOCK/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -36355,12 +36287,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "1929625.0" } } ], @@ -40765,10 +40697,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.015", @@ -40782,10 +40714,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -40799,10 +40731,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -49258,10 +49190,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 40.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "40", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -49275,10 +49207,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -49292,10 +49224,10 @@ "minNotional": 10000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -49722,14 +49654,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 40.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "40", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -49739,14 +49671,14 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.025", "cum": "25.0" } }, @@ -49755,67 +49687,67 @@ "symbol": "LAB/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "275.0" } }, { "tier": 4.0, "symbol": "LAB/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1275.0" } }, { "tier": 5.0, "symbol": "LAB/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "2525.0" } }, { "tier": 6.0, "symbol": "LAB/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 100000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "6", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.125", - "cum": "6950.0" + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "6695.0" } }, { @@ -49823,50 +49755,33 @@ "symbol": "LAB/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "7", - "initialLeverage": "3", - "notionalCap": "500000", + "initialLeverage": "2", + "notionalCap": "2500000", "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "17375.0" + "maintMarginRatio": "0.25", + "cum": "27520.0" } }, { "tier": 8.0, "symbol": "LAB/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "8", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "59025.0" - } - }, - { - "tier": 9.0, - "symbol": "LAB/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "652520.0" } } ], @@ -52926,14 +52841,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 40.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "40", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -52943,14 +52858,14 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.025", "cum": "25.0" } }, @@ -52959,67 +52874,67 @@ "symbol": "LYN/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "275.0" } }, { "tier": 4.0, "symbol": "LYN/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1275.0" } }, { "tier": 5.0, "symbol": "LYN/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "2525.0" } }, { "tier": 6.0, "symbol": "LYN/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 100000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "6", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.125", - "cum": "6950.0" + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "6695.0" } }, { @@ -53027,50 +52942,33 @@ "symbol": "LYN/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "7", - "initialLeverage": "3", - "notionalCap": "500000", + "initialLeverage": "2", + "notionalCap": "2500000", "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "17375.0" + "maintMarginRatio": "0.25", + "cum": "27520.0" } }, { "tier": 8.0, "symbol": "LYN/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "8", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "59025.0" - } - }, - { - "tier": 9.0, - "symbol": "LYN/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "652520.0" } } ], @@ -55715,15 +55613,15 @@ "symbol": "MILK/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "10", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -55731,55 +55629,21 @@ "tier": 2.0, "symbol": "MILK/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, - "info": { - "bracket": "2", - "initialLeverage": "20", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" - } - }, - { - "tier": 3.0, - "symbol": "MILK/USDT:USDT", - "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, - "info": { - "bracket": "3", - "initialLeverage": "10", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" - } - }, - { - "tier": 4.0, - "symbol": "MILK/USDT:USDT", - "currency": "USDT", - "minNotional": 20000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "10000", "maintMarginRatio": "0.1", - "cum": "1300.0" + "cum": "500.0" } }, { - "tier": 5.0, + "tier": 3.0, "symbol": "MILK/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, @@ -55787,16 +55651,16 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "4", "notionalCap": "250000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2550.0" + "cum": "1750.0" } }, { - "tier": 6.0, + "tier": 4.0, "symbol": "MILK/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -55804,46 +55668,46 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "3", "notionalCap": "500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "12975.0" + "cum": "12175.0" } }, { - "tier": 7.0, + "tier": 5.0, "symbol": "MILK/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, - "maxNotional": 7500000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", - "notionalCap": "7500000", + "notionalCap": "800000", "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "54625.0" + "cum": "53825.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "MILK/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 800000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "1000000", + "notionalFloor": "800000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "253825.0" } } ], @@ -60917,15 +60781,15 @@ "symbol": "OBOL/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "10", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -60933,55 +60797,21 @@ "tier": 2.0, "symbol": "OBOL/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, - "info": { - "bracket": "2", - "initialLeverage": "20", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" - } - }, - { - "tier": 3.0, - "symbol": "OBOL/USDT:USDT", - "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, - "info": { - "bracket": "3", - "initialLeverage": "10", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" - } - }, - { - "tier": 4.0, - "symbol": "OBOL/USDT:USDT", - "currency": "USDT", - "minNotional": 20000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "10000", "maintMarginRatio": "0.1", - "cum": "1300.0" + "cum": "500.0" } }, { - "tier": 5.0, + "tier": 3.0, "symbol": "OBOL/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, @@ -60989,16 +60819,16 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "4", "notionalCap": "250000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2550.0" + "cum": "1750.0" } }, { - "tier": 6.0, + "tier": 4.0, "symbol": "OBOL/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -61006,46 +60836,46 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "3", "notionalCap": "500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "12975.0" + "cum": "12175.0" } }, { - "tier": 7.0, + "tier": 5.0, "symbol": "OBOL/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, - "maxNotional": 7500000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", - "notionalCap": "7500000", + "notionalCap": "800000", "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "54625.0" + "cum": "53825.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "OBOL/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 800000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "1000000", + "notionalFloor": "800000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "253825.0" } } ], @@ -63519,15 +63349,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -63535,71 +63365,54 @@ "symbol": "ORDER/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "ORDER/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "ORDER/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "ORDER/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "ORDER/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -63607,16 +63420,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "ORDER/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, @@ -63624,16 +63437,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "59025.0" + "cum": "54625.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "ORDER/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -63641,12 +63454,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "1929625.0" } } ], @@ -67067,15 +66880,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -67083,71 +66896,54 @@ "symbol": "POPCAT/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "POPCAT/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "POPCAT/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "POPCAT/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "POPCAT/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -67155,16 +66951,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "POPCAT/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, @@ -67172,16 +66968,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "59025.0" + "cum": "54625.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "POPCAT/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -67189,12 +66985,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "1929625.0" } } ], @@ -67757,14 +67553,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 40.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "40", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -67774,14 +67570,14 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.025", "cum": "25.0" } }, @@ -67790,67 +67586,67 @@ "symbol": "PROMPT/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "275.0" } }, { "tier": 4.0, "symbol": "PROMPT/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1275.0" } }, { "tier": 5.0, "symbol": "PROMPT/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "2525.0" } }, { "tier": 6.0, "symbol": "PROMPT/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 100000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "6", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.125", - "cum": "6950.0" + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "6695.0" } }, { @@ -67858,50 +67654,33 @@ "symbol": "PROMPT/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "7", - "initialLeverage": "3", - "notionalCap": "500000", + "initialLeverage": "2", + "notionalCap": "2500000", "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "17375.0" + "maintMarginRatio": "0.25", + "cum": "27520.0" } }, { "tier": 8.0, "symbol": "PROMPT/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "8", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "59025.0" - } - }, - { - "tier": 9.0, - "symbol": "PROMPT/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "652520.0" } } ], @@ -68101,14 +67880,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 40.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "40", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -68118,14 +67897,14 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.025", "cum": "25.0" } }, @@ -68134,67 +67913,67 @@ "symbol": "PTB/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "275.0" } }, { "tier": 4.0, "symbol": "PTB/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1275.0" } }, { "tier": 5.0, "symbol": "PTB/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "2525.0" } }, { "tier": 6.0, "symbol": "PTB/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 100000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "6", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.125", - "cum": "6950.0" + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "6695.0" } }, { @@ -68202,50 +67981,33 @@ "symbol": "PTB/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "7", - "initialLeverage": "3", - "notionalCap": "500000", + "initialLeverage": "2", + "notionalCap": "2500000", "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "17375.0" + "maintMarginRatio": "0.25", + "cum": "27520.0" } }, { "tier": 8.0, "symbol": "PTB/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "8", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "59025.0" - } - }, - { - "tier": 9.0, - "symbol": "PTB/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "652520.0" } } ], @@ -68550,10 +68312,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 40.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "40", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -68567,10 +68329,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -68584,10 +68346,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -69014,14 +68776,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 40.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "40", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -69031,14 +68793,14 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.025", "cum": "25.0" } }, @@ -69047,67 +68809,67 @@ "symbol": "Q/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "275.0" } }, { "tier": 4.0, "symbol": "Q/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1275.0" } }, { "tier": 5.0, "symbol": "Q/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "2525.0" } }, { "tier": 6.0, "symbol": "Q/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 100000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "6", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.125", - "cum": "6950.0" + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "6695.0" } }, { @@ -69115,50 +68877,33 @@ "symbol": "Q/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "7", - "initialLeverage": "3", - "notionalCap": "500000", + "initialLeverage": "2", + "notionalCap": "2500000", "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "17375.0" + "maintMarginRatio": "0.25", + "cum": "27520.0" } }, { "tier": 8.0, "symbol": "Q/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "8", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "59025.0" - } - }, - { - "tier": 9.0, - "symbol": "Q/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "652520.0" } } ], @@ -70290,14 +70035,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 40.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "40", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -70307,14 +70052,14 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.025", "cum": "25.0" } }, @@ -70323,67 +70068,67 @@ "symbol": "RECALL/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "275.0" } }, { "tier": 4.0, "symbol": "RECALL/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1275.0" } }, { "tier": 5.0, "symbol": "RECALL/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "2525.0" } }, { "tier": 6.0, "symbol": "RECALL/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 100000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "6", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.125", - "cum": "6950.0" + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "6695.0" } }, { @@ -70391,50 +70136,33 @@ "symbol": "RECALL/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "7", - "initialLeverage": "3", - "notionalCap": "500000", + "initialLeverage": "2", + "notionalCap": "2500000", "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "17375.0" + "maintMarginRatio": "0.25", + "cum": "27520.0" } }, { "tier": 8.0, "symbol": "RECALL/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "8", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "59025.0" - } - }, - { - "tier": 9.0, - "symbol": "RECALL/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "652520.0" } } ], @@ -70739,10 +70467,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -70756,10 +70484,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -70773,10 +70501,10 @@ "minNotional": 10000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -71617,15 +71345,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -71633,71 +71361,54 @@ "symbol": "RIVER/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "RIVER/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "RIVER/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "RIVER/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "RIVER/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -71705,16 +71416,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "RIVER/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, @@ -71722,16 +71433,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "59025.0" + "cum": "54625.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "RIVER/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -71739,12 +71450,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "1929625.0" } } ], @@ -71920,6 +71631,127 @@ } } ], + "RLS/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "RLS/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "1", + "initialLeverage": "20", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.025", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "RLS/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.05", + "cum": "125.0" + } + }, + { + "tier": 3.0, + "symbol": "RLS/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "625.0" + } + }, + { + "tier": 4.0, + "symbol": "RLS/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "4", + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "1875.0" + } + }, + { + "tier": 5.0, + "symbol": "RLS/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "5", + "initialLeverage": "3", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "6045.0" + } + }, + { + "tier": 6.0, + "symbol": "RLS/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.25", + "cum": "26870.0" + } + }, + { + "tier": 7.0, + "symbol": "RLS/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "800000", + "notionalFloor": "500000", + "maintMarginRatio": "0.5", + "cum": "151870.0" + } + } + ], "RONIN/USDT:USDT": [ { "tier": 1.0, @@ -72943,10 +72775,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 40.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "40", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -72960,10 +72792,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -72977,10 +72809,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -73286,15 +73118,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -73302,71 +73134,54 @@ "symbol": "SAFE/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "SAFE/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "SAFE/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "SAFE/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "SAFE/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -73374,16 +73189,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "SAFE/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, @@ -73391,16 +73206,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "59025.0" + "cum": "54625.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "SAFE/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -73408,12 +73223,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "1929625.0" } } ], @@ -75559,15 +75374,15 @@ "symbol": "SKATE/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 40.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "40", - "notionalCap": "5000", + "initialLeverage": "10", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -75575,55 +75390,21 @@ "tier": 2.0, "symbol": "SKATE/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, - "info": { - "bracket": "2", - "initialLeverage": "20", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "symbol": "SKATE/USDT:USDT", - "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, - "info": { - "bracket": "3", - "initialLeverage": "10", - "notionalCap": "25000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" - } - }, - { - "tier": 4.0, - "symbol": "SKATE/USDT:USDT", - "currency": "USDT", - "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "25000", + "notionalFloor": "10000", "maintMarginRatio": "0.1", - "cum": "1525.0" + "cum": "500.0" } }, { - "tier": 5.0, + "tier": 3.0, "symbol": "SKATE/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, @@ -75631,16 +75412,16 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "4", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2775.0" + "cum": "1750.0" } }, { - "tier": 6.0, + "tier": 4.0, "symbol": "SKATE/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, @@ -75648,46 +75429,46 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "3", "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "6945.0" + "cum": "5920.0" } }, { - "tier": 7.0, + "tier": 5.0, "symbol": "SKATE/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 2500000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", - "notionalCap": "2500000", + "notionalCap": "800000", "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "27770.0" + "cum": "26745.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "SKATE/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "minNotional": 800000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "2500000", + "notionalCap": "1000000", + "notionalFloor": "800000", "maintMarginRatio": "0.5", - "cum": "652770.0" + "cum": "226745.0" } } ], @@ -78781,15 +78562,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -78797,71 +78578,54 @@ "symbol": "STBL/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "STBL/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "STBL/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "STBL/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "STBL/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -78869,16 +78633,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "STBL/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, @@ -78886,16 +78650,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "59025.0" + "cum": "54625.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "STBL/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -78903,12 +78667,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "1929625.0" } } ], @@ -81245,15 +81009,15 @@ "symbol": "SXP/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "10", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -81261,136 +81025,85 @@ "tier": 2.0, "symbol": "SXP/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "SXP/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 50000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "initialLeverage": "4", + "notionalCap": "200000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "1750.0" } }, { "tier": 4.0, "symbol": "SXP/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 200000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "3", + "notionalCap": "500000", + "notionalFloor": "200000", + "maintMarginRatio": "0.1667", + "cum": "10090.0" } }, { "tier": 5.0, "symbol": "SXP/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 500000.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" + "initialLeverage": "2", + "notionalCap": "800000", + "notionalFloor": "500000", + "maintMarginRatio": "0.25", + "cum": "51740.0" } }, { "tier": 6.0, "symbol": "SXP/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "6", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.125", - "cum": "6950.0" - } - }, - { - "tier": 7.0, - "symbol": "SXP/USDT:USDT", - "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "7", - "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "17375.0" - } - }, - { - "tier": 8.0, - "symbol": "SXP/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "8", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "59025.0" - } - }, - { - "tier": 9.0, - "symbol": "SXP/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 800000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "1000000", + "notionalFloor": "800000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "251740.0" } } ], @@ -82799,10 +82512,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 40.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "40", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -82816,10 +82529,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -82833,10 +82546,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -83986,15 +83699,15 @@ "symbol": "TOKEN/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 40.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "40", - "notionalCap": "5000", + "initialLeverage": "10", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -84002,55 +83715,21 @@ "tier": 2.0, "symbol": "TOKEN/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, - "info": { - "bracket": "2", - "initialLeverage": "20", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "symbol": "TOKEN/USDT:USDT", - "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, - "info": { - "bracket": "3", - "initialLeverage": "10", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" - } - }, - { - "tier": 4.0, - "symbol": "TOKEN/USDT:USDT", - "currency": "USDT", - "minNotional": 20000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "10000", "maintMarginRatio": "0.1", - "cum": "1275.0" + "cum": "500.0" } }, { - "tier": 5.0, + "tier": 3.0, "symbol": "TOKEN/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, @@ -84058,16 +83737,16 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "4", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2525.0" + "cum": "1750.0" } }, { - "tier": 6.0, + "tier": 4.0, "symbol": "TOKEN/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, @@ -84075,46 +83754,46 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "3", "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "6695.0" + "cum": "5920.0" } }, { - "tier": 7.0, + "tier": 5.0, "symbol": "TOKEN/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 2500000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", - "notionalCap": "2500000", + "notionalCap": "800000", "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "27520.0" + "cum": "26745.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "TOKEN/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "minNotional": 800000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "2500000", + "notionalCap": "1000000", + "notionalFloor": "800000", "maintMarginRatio": "0.5", - "cum": "652520.0" + "cum": "226745.0" } } ], @@ -85864,15 +85543,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -85880,71 +85559,54 @@ "symbol": "TRUTH/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "TRUTH/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "TRUTH/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "TRUTH/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "TRUTH/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -85952,16 +85614,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "TRUTH/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, @@ -85969,16 +85631,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "59025.0" + "cum": "54625.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "TRUTH/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -85986,12 +85648,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "1929625.0" } } ], @@ -89310,14 +88972,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 40.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "40", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -89327,14 +88989,14 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.025", "cum": "25.0" } }, @@ -89343,67 +89005,67 @@ "symbol": "VFY/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "275.0" } }, { "tier": 4.0, "symbol": "VFY/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1275.0" } }, { "tier": 5.0, "symbol": "VFY/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "2525.0" } }, { "tier": 6.0, "symbol": "VFY/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 100000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "6", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.125", - "cum": "6950.0" + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "6695.0" } }, { @@ -89411,50 +89073,33 @@ "symbol": "VFY/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "7", - "initialLeverage": "3", - "notionalCap": "500000", + "initialLeverage": "2", + "notionalCap": "2500000", "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "17375.0" + "maintMarginRatio": "0.25", + "cum": "27520.0" } }, { "tier": 8.0, "symbol": "VFY/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "8", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "59025.0" - } - }, - { - "tier": 9.0, - "symbol": "VFY/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "652520.0" } } ], @@ -89707,14 +89352,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 40.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "40", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -89724,14 +89369,14 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.025", "cum": "25.0" } }, @@ -89740,67 +89385,67 @@ "symbol": "VINE/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "275.0" } }, { "tier": 4.0, "symbol": "VINE/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1275.0" } }, { "tier": 5.0, "symbol": "VINE/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "2525.0" } }, { "tier": 6.0, "symbol": "VINE/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 100000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "6", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.125", - "cum": "6950.0" + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "6695.0" } }, { @@ -89808,50 +89453,33 @@ "symbol": "VINE/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "7", - "initialLeverage": "3", - "notionalCap": "500000", + "initialLeverage": "2", + "notionalCap": "2500000", "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "17375.0" + "maintMarginRatio": "0.25", + "cum": "27520.0" } }, { "tier": 8.0, "symbol": "VINE/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "8", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "59025.0" - } - }, - { - "tier": 9.0, - "symbol": "VINE/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "652520.0" } } ], @@ -90052,10 +89680,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -90069,10 +89697,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -90086,10 +89714,10 @@ "minNotional": 10000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -90361,15 +89989,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -90377,71 +90005,54 @@ "symbol": "VVV/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "VVV/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "VVV/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "VVV/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "VVV/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -90449,16 +90060,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "VVV/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, @@ -90466,16 +90077,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "59025.0" + "cum": "54625.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "VVV/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -90483,12 +90094,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "1929625.0" } } ], @@ -92548,15 +92159,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -92564,71 +92175,54 @@ "symbol": "XAN/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "XAN/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "XAN/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "XAN/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "XAN/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -92636,16 +92230,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "XAN/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, @@ -92653,16 +92247,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "59025.0" + "cum": "54625.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "XAN/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -92670,12 +92264,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "1929625.0" } } ], @@ -94547,10 +94141,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.015", @@ -94564,10 +94158,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -94581,10 +94175,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -95628,13 +95222,13 @@ "symbol": "ZEC/USDT:USDT", "currency": "USDT", "minNotional": 10000000.0, - "maxNotional": 12500000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "12500000", + "notionalCap": "20000000", "notionalFloor": "10000000", "maintMarginRatio": "0.25", "cum": "1743600.0" @@ -95644,17 +95238,17 @@ "tier": 9.0, "symbol": "ZEC/USDT:USDT", "currency": "USDT", - "minNotional": 12500000.0, - "maxNotional": 15000000.0, + "minNotional": 20000000.0, + "maxNotional": 40000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "12500000", + "notionalCap": "40000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.5", - "cum": "4868600.0" + "cum": "6743600.0" } } ], @@ -96009,15 +95603,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -96025,71 +95619,54 @@ "symbol": "ZETA/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "ZETA/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "ZETA/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "ZETA/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "ZETA/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -96097,16 +95674,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "ZETA/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, @@ -96114,16 +95691,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "59025.0" + "cum": "54625.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "ZETA/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -96131,12 +95708,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "1929625.0" } } ], @@ -96646,14 +96223,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 40.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "40", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -96663,14 +96240,14 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.025", "cum": "25.0" } }, @@ -96679,67 +96256,67 @@ "symbol": "ZKJ/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "275.0" } }, { "tier": 4.0, "symbol": "ZKJ/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1275.0" } }, { "tier": 5.0, "symbol": "ZKJ/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "2525.0" } }, { "tier": 6.0, "symbol": "ZKJ/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 100000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "6", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.125", - "cum": "6950.0" + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "6695.0" } }, { @@ -96747,50 +96324,33 @@ "symbol": "ZKJ/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "7", - "initialLeverage": "3", - "notionalCap": "500000", + "initialLeverage": "2", + "notionalCap": "2500000", "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "17375.0" + "maintMarginRatio": "0.25", + "cum": "27520.0" } }, { "tier": 8.0, "symbol": "ZKJ/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "8", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "59025.0" - } - }, - { - "tier": 9.0, - "symbol": "ZKJ/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1934025.0" + "cum": "652520.0" } } ], @@ -97472,15 +97032,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -97488,105 +97048,88 @@ "symbol": "\u5e01\u5b89\u4eba\u751f/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "50000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "\u5e01\u5b89\u4eba\u751f/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.1", + "cum": "2800.0" } }, { "tier": 5.0, "symbol": "\u5e01\u5b89\u4eba\u751f/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" + "initialLeverage": "4", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.125", + "cum": "5300.0" } }, { "tier": 6.0, "symbol": "\u5e01\u5b89\u4eba\u751f/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "6", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.125", - "cum": "6950.0" + "initialLeverage": "3", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1667", + "cum": "15725.0" } }, { "tier": 7.0, "symbol": "\u5e01\u5b89\u4eba\u751f/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "7", - "initialLeverage": "3", - "notionalCap": "1000000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "17375.0" - } - }, - { - "tier": 8.0, - "symbol": "\u5e01\u5b89\u4eba\u751f/USDT:USDT", - "currency": "USDT", - "minNotional": 1000000.0, + "minNotional": 500000.0, "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", - "notionalFloor": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "100675.0" + "cum": "57375.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "\u5e01\u5b89\u4eba\u751f/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -97594,12 +97137,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "1975675.0" + "cum": "1932375.0" } } ] From 06a8f3d09794dad422878691db83b83af487ab53 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 4 Dec 2025 06:36:13 +0100 Subject: [PATCH 005/117] chore: bump ccxt to 4.5.24 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 4efa1fa87..e75918c88 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,7 @@ ft-pandas-ta==0.3.16 ta-lib==0.6.8 technical==1.5.3 -ccxt==4.5.22 +ccxt==4.5.24 cryptography==46.0.3 aiohttp==3.13.2 SQLAlchemy==2.0.44 From a63ea6adb811030b86e6d8828b7bd8c38d479974 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 4 Dec 2025 06:56:14 +0100 Subject: [PATCH 006/117] test: switch to BTC/USDC in tests for now --- tests/exchange_online/conftest.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/exchange_online/conftest.py b/tests/exchange_online/conftest.py index 94ff4ac47..755e6716c 100644 --- a/tests/exchange_online/conftest.py +++ b/tests/exchange_online/conftest.py @@ -515,7 +515,8 @@ EXCHANGES = { ], }, "hyperliquid": { - "pair": "UBTC/USDC", + # TODO: Should be UBTC/USDC - probably needs a fix in ccxt + "pair": "BTC/USDC", "stake_currency": "USDC", "hasQuoteVolume": False, "timeframe": "30m", From 3fb7382cc4ee9a97e5216931e537ce3f899e0ce2 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 4 Dec 2025 19:56:46 +0100 Subject: [PATCH 007/117] test: update test data to include USDT pairs --- tests/testdata/BTC_USDT-5m.feather | Bin 0 -> 102362 bytes tests/testdata/XRP_USDT-5m.feather | Bin 0 -> 90018 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/testdata/BTC_USDT-5m.feather create mode 100644 tests/testdata/XRP_USDT-5m.feather diff --git a/tests/testdata/BTC_USDT-5m.feather b/tests/testdata/BTC_USDT-5m.feather new file mode 100644 index 0000000000000000000000000000000000000000..ee6ec03b4aeeccf07075002f1db987874e794195 GIT binary patch literal 102362 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 eb8jiLW$NtK&Q3GC&2)_e!`!pTT|m4N9!2 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 z zxHfF(#$E-`rsYO}O`A6HuLTTTw*}Pthlky;5&eC=%mRMZH_5~k1=ak)pLROX7%JcW zv;U&jlG_vz-KfnFTIve^mZrNR;37}*-5kW;h7%kIF#X++Kn{V*FmyFD)LM13Vp>yA z*+nUhwJ~HojAf;YV#6M%^)Lk`!;H`A+_)~vL)X!mN112F)m0S;J;aWo^5qR%B+()F zU%0xe+;=P3_>Ri5gYhTbfM8uXR`@xalt{S!kii6V*q15vNt$wh4(z_vn>`52PiXWi z?LIV*6q2pK5AQ-`AwRLe@aGtr?FwzUnK&SjTk{;S{GOp6wFXoLOIU$8Hk0XCho>G z7yC*Mee2~Q^)IE?{Zg>IO%iX2@HWSJ1kA2i+1-y$x%yEJ-|A@n-W70!-bdp)-2GlE zr`$u1+!;D_d%U5!$G)0Fr2Pr(;J09MR2RO4ewhw%y1A#Ncy^TF${x2ZUC z33UOw_b>#A`@hn3UbmnYq)9hgXPBK()87ZQ(NX6@=<)B9P(|Y3SL>s)JH-Q8ES!?P z3mRRW`YwLLtEL%h5qlSidr_mMD%f6i=M%9M3L^R&OT~swYTo4%29bMu} zI?8-rwTPtL&4`ZPUU|I|xdp7Dd*bd~1I30e7!Sf8D0HF5^MpQ5%YGbZjYCr#3?imG zfUuB*pF&q*TqV1VtIBq9rLOqK4s$fe0X4MZBVhYKNL+ItrdI5F8D1PvR}FrU#=J^K zoBJ3n2`7X-_S!<9rSo3A@1?6C9t!)_8j(^1R6kI5Ds!qkr@w?4!*=gK0#}n_=sPKK zO=E~pa&aI*uIng1KSL{qC8Y=_sG3srJFa4P`~y6EM{YSU9jU&|XBT&7vDT~5Jw$x9 zrm&1pMcCP<`jfZ1#eHr2Ua6)UdJx@$mvdP1$7;Ea2T=B-wCNUKfJx~{pBZ-hxbL>V zYa0p@tKH$5f!x7#iBF+;UiCpSh!M%?-C-$L@z>(987vyQqhmYT+#s_Y|I6kEW zucukBxF(8Tx07$tiQiqDwNcY4QkGqx?c)}j`KhBlp$|}0A97B6f$8V$_JyuQZ{RTd z)ew+>=gj4Blmd2!IPA(IGmoCVo?whf!E#r!(iOUzHau!vrRQnWbNEnKa5Ii(Sf~|j zY-w}rsCCB8P*&x-@jCGtYom^P*Hi0+)E`GdFNyVWED`x2x*;NXriAEr!W|ZUhu?)j ztfRU|*E+1-m_bd=9(lUZ70HPiFGR31iq@E`LV%s6! zT|zC2bK;{}eR`+Fk0UW^9qpR9>5{lzHx6R|41nyqbweCHHShg4VkqK{Tmc8}v80mc zl&wSeUv#}&Ex~zpqZtl4BA-Q6s6ZYJymsD=Fx84*@1Dk7e`mKei$7v3f?wQCY}cNa zutq%MGcnBRaQ0gi5;;wtU=6(Xf#q}PkL#P5WpPbT^0yBPAU4Z%ZJ1})EpqM2;4X`_YP8T*y z_-z2!%*;GZGa~*Q(C=6N(u3pQyx%T$07uk&e~N~d`x(?}wNE@BcVlKVrIHs$ zIO&}D{?BqgJ>A=FJf(FT$6CxD1M=)6>+GS|eyJ&7i9Kd%%|S0N@-1dzS}i==E&el2 z*nFRAQSy?J+=%19dfoqEncmB+ekI1|;7eCO2i{&AFn&}<>!lBG{L*1h`#p-6+Z%E`^$Y048T!h48wbvy8Z?GK(I`U z-Jvoq3kV^5Ei{qmTF64uy{hhE`2jUa&2MZusH#~Cj*H9&=Kg}9>y$3OXL==XZ+Xr7 z(>tB^B&RPRpsDv`jZ1bJvj+V@F~qmSnzWL*vqRYch9$g7aJA$|WWp?$K*jlJMHP?g z&`iEU)OjZa1v*%yiM?L!zWPd_9L171%Xi z3*#NEJZK!%)MB@|+j7ZLG`xDdH*`1E2Gu6)RpnKe1aabC7VSf)@9UcId=mg##wS+> z(F3hsS``qqd0B1%q7$PBtNKvWUjbrvB$WM1VpCbl>rMDOz|^6uvjSdz2kh*~xz`Wyh>hU^53F__n?omZv2`(2?NXaL@AJb@ZR6Jd```pv2npF4x0?M!7HpqZn)B<*y z*09RNl0#}m^_g#@H)H{a=eo`6AAr&$Z9dgy{R-LRtP%Wgs*g-#yx-&!zapAX-Px^% zu?#VQ=mABj2d;p(Df~C;e!ny|gp@poReHjk8eOSQKLsN&q^9W3?unH@K}(|Qk5B1L z&mMG&ijHLph8|F@UKR-=Sj55-+1EQU`yEW`HJ?QO(F9sIJ*9~IfkHQIX7lmgb}T>Z zn-2o@#{$GW8pcMT&IMeX7`pRe@ADv=uBds^t4cx?<>! zqpJ8gx?Ss$%XLT?vLW>15l3j-C#*q{DcR^c+wk=|09Pq1WMxwgLlDpzC4k$|QPDm< zIOh$0fzF#qJ9ypK0XkJW;uCiR?T@3BZ~*)cT(o*5!44Bj9<0&XYB zS)n_qv$8w53ZkvZB(p}endPG_-w(Q9f*wpC3J$Wm5E|CDvFZj8s{r@>0U22 zzLzq@ccFfHnTf+`F#hO17^t7OdwJEt!V@ZNx9()|2^F@L04od&#)4TlEwj-1w75h~ z87#g;scUl=qgM8U53XlNx3QxMr6w zDKOZP%k{AOgj&Ew^n>Mx!(!>B2CaqF1cp5piv!Y|HwWbxO!#X|lrC19RP!LC-Sj*| zWMPUCJ3ZhK$Y$uZLKE}EzV??))D2cf-AFHw`QaV+Fx z#0iAk?r1+IA|nlT0e1A0E4(GB&*0QNP#goE_U*qKZYsbsQ)(3jpmBkP42g%w;A5~R zPgx#ngX|Ku>5#;34P2*(9vBlh;8QuQC&FEO_4oE>v0m{Zc{naTKon9 z9zguj0Z7vL17E{^QI5%)aNqj7oN9^7Ni@oR$~{B!A13?`>v#_=ZsU8vk6pZ~@%EU0 zt!xkKOG&{vG&#QFns4f|L1o)xAxc--QQ{oX#=S`%zE7Yu)7e*w4q5iqesl!}p@4+JGr~L6zXyuHx%J;+rr4D3OBnxFWvX9P2oG6Cx-?b~HUDKA!=J z3|xDZnJd*?h~}rnLD*Of1;gIXt)RK!ih$oMKw~;ow1<^esRb0WmfHhi32B942qw>f z=wvIB)vtQ!eoh^gCuC95gWQ`_ScfwaH~2 z0geJ3f1m?ilmZgtkf6H4E5mTozH4?0H4UH}f=T4d7+uf?U>M*^rli3(72oyG$%_41 z4n-wGUSAV80bkt55mv@Wpu3hY;tN3dTL=piS-&!f50G?e%At(wANK${?@dps*nPH%PX4CXPOY3jldk(m-SEjmSL}?k{zU6|p5U zo=0$5>9{jQOD4J=bI20e<7mG+CTTPVE{ypuxP+?c{v*`51wi<%5t(Jk0E~?W~2|59|M+YxKrUw25ItzG6Oud-mRNkDFEt-+ZgAB+J!nHu(<8N3I z^nUQ&=nNPpVl`EMCW7Wi+sg}aTfm9XuJFl-5L7qrEX}3+!z=JX@S+yFi%Xe74cHz+ z0qDWNk)f!DkO9)aars9LvNFh0V5Kld*cl=dv^~y?-a}x`+}K$tx6y;ZBe2|!*s2XC z5`YbyF0?=RKp(A*iw{=}mfoTU5b;ciM1c6tJmyy_J>uMK6tzBMO^c7)Xf-NJh$r$J zg0GR<3h^^*JxjUO_IidoFv(Cb`sj8jhYb<|6WMSZB+J$L^}M{9H8h~%(*XXtn%TgT z_*WJ+Q*18T&g%^|S$;VGp&8$6HXhm3PdTY_hk_;7F+X^k1@)VEmYVgtiN zKCwNF3CW@(-NugEMk5-bBGR&umxi`N4`7h^dOxXj0a4D60UM8x8Jp@Gja}xZ;7(HP z4W3JK6Ops9z&jjz_tumZI+N6=uvj~JtWTXMOkb*^)(F5qGsh}o6l7@fpNOG#w6IMoLSS zhK1{hPs#1#_U_TeMG4e4*8~$JVglkfxr#=vF2xsEZ3a!dOf7Du`jX%tk~4#skVwC{ z80KBY1To8-Tg}&AeZlaP`M%&*lGVi=He_mVMB}aUlh_)uCd(-40%zacG(45YBZ&3a%qHPjCfE4uN}4cLkTqzm}4D%^0t335JN~0_dL`3Pwm9`vqWWt-^z= zfcgiQlfs0t7FawwW-zpi6krd9J{48Yf-iUm2`n*oL!A+e*h1?`d%4;s)Le!0M23T- z#B_zc#N4P9`SeNP``y!j1}^Wxi8KxGVj-ZrF=wcF$`wHS@(^fdt7rOu!Sy?5{_oW6 z^M=x%GrC%Ht3AX*J2f|ec`gOW`5W-rBkosm&$2k1_Mw~y~Q7J^GUxZ|!N02Pl57}Mfr51tc9ygIu4Nplm z#v3S7lhPo1M+eVcb3jsol67}tThJs`2O6LNwp&wZV%%6;I73W<<`0|b03tDX9q|49 zlHhidStiHUn7A}$qX$-?#cKuzO4%?rXxqhHh0)fy*bLv-mK6iZch8}m8Xp!rF^A}I zU+~jhf8pY;;BHbF3!Xy~%ZB55gl|%^Mb`~uyheJ0XW|FOVio{-xf@1P>PB~?__VID zU93VBo43?B!cFKr6{-yz%d(5d)}4P5RL>O@A;*@?By)1HlH51P0B76uN}ajAFz>(k*8_ zEMf=~lUN>}kkENUbc6NOZLAW4$>__VH;1ShGn%}7sYtNfp*Lyu;A(V_7%3o410dQd zMix~X?=c2rZZU+LMI?u*3vL4WRLdoTFerYI;>ClA)-w8Xgx1G2EWr6S#`1DjnoC&-U6JEBH zU*zEY)~H1Xjjx7w1ogXfiYz@uQtWDASjFskO_gHbeTzrYGlk;TDp`@pcP4ml)DE#(%?AZ~G z&KPH!%fz|iby8vte!m#vkrCVcEYYcvDx4`k5FVp9trS=2qY?tQh&!>K=5~myYEc}K zN0zXbTP>jBf$_t*F}FFzmGSjF9%TC2Dx$kqlpY-wSD~et(=!Nm61dK#NFwkK9Y(K95rz=sshVrG}*@n=ZDn5y)NFgUH(4iK>+v4QRr z#N!EM9GWv^xwO->cOv`d(V~u2!b8C5QSSmw{Yvj9@ z$w`p6AP(;5=|PFpBcnntkPGlO0?$FN_wl5V^??>%M6C{^2^R~JKj5x!WbL?gU;&IT zDE^UXZ0Zccah?s)tGdKzz}+@ia&0w7O4kZW)j?vLyS0T^Lo!tg6DbSLZsWCnmW!*E zu?{0Hq^vuS*wV%uTV%2%f6if%kj{I=-dv|f*|O2*a`B;xN-y?`eG!F+CwOF5hM+|> z8P0;#Np2s)>tWtTwE>H=gk3y1c23C}~O zF@!vhqXcA21r<@!Yv$dE1#d_r7*{`Z3)Ew6bCJqn3Cvz z0ipVGxj{|@g&`~jM&;kdes^FM&j&e)$jt!~1Kip!>q-Gc^g~io(%30C3J3sKC$iAh zfKp(Xmj@-rk8}y$h@=Zu6xeL|Y#t8D-Z!J}7z{P&26zvF3fh=p)*O?$Y!+9zins7x zOcJWNvp&rmrYsmFA>M%Jm;PJoFVJ5}fcwZGS4-BvuwI%ue@k1 zf*`5GouHC9gS~@jWtB)^HbI3T3#-`9=iR)BJwj%9dPj#<-_F7KBils#70;BL2<4HN z%Ebw}0ZoMH8~dnuZ>CEwPer%0q)!QNHO?hq`&%1~bE+Ff4CTg>n>Vn{Q@^ZmqK*?4 zD%M=fkpEzA>rv8EMzq0=we@q1%>|b|qGO;a*^n`j!8~6aH72VHNPcdtE-W!-BFl_r z(Ot%htdv466BBX5!eISv&^@_~HObw^ihxawM+vK6s1(NyPZK-6Ay#zP$BiCLe?6Ho z2nQh`G^dQg`lvCG2^oR#8lyimVTk;sp*QWu-|CkcCvm=@R&>pr-4NJg(k!~lQ|LK=6{65Y1-wVF~9mx72Vo4kr zdi&EG^n-n;-&rR)1hRmEehXYJY3+LEU&+Fz&|kyu-g2jY{Lae#b}MLu)7yhDa^4F> zEVhR4ppfJ=^z#m*|My1#boQ4e)(Y~#>knejZ;7?vV-fw@w~07ZA}!Y-!FDdyc$!Q6wQBx$wJd z-w{(R?$j@zq;UVg;EXf!SqX=afMM>?g2Z|RfH(zkz4(-Y&&#d!9|6VO0e#<*A9OZ< zJPcjK4vJ@U01)~-ff4XIApQX27q{(S1mjm;Oj_zK?}#oIc34Gjx91Up=&!{VcgOE+ z28{z`rpT=~oZc)SnuEzj;C*pxdHHC8ZJ&5&)BQz;d{G0?!I}@GiTTm7H`w1s7avw| z8kycl{{A$F#eL=NQh0zfb~cy3F-KlP9jzk=SkR+X33h}&sYtkgasU4XmR`p4a-aPF zg^73efrN=KK2hSA1AeCJ%1iI+Jo*7r7A$dpdN%;C4%mH>Ma-pv&nqV>o=6}!E58C_ z6}iFol`;0x;xiT&HaW$_8D=f#BGtbj+5jJZ`T-4p05ADT!2df~1U7M!POSJy0yQvl zbBBwDS-eighXVYiYb5v%Yg%C2FpZ&Z+ChgujG4UJsT(&?u!bld+r)!5UrA0nLG&+* z4i?1(3lH2V(v~85*;E#iiqm=qe|JAAV&{3u1H&k`uqPykzp$|}_;{uK0I}ru`%kGp8L*H3J9>$Q{o~~WCB(f*fiV?o%3EqpZn=Npod;q_K}}B`?@{wT zAHG*9lheD?6Fjw-On(uhg+Fl+DiNtS0=)mh7nntWAa5XQnvn^Xe4<1wy35J%#f5G6 zJEE7C`fYL=d4Fg7{r34cbG4L?$9x~x(V0lQ~GN`rtb$&PqUPG#f<`DWTZz^X| z>utG5JrJh_c?TN)O?=~yZIDcT65y@e6gx-59p+p)!NKk=NL8q{ptt~f#@|#x&Uvtz z@e*L3r}y2Sm)|%*=DtC#%}=O)no=W2u)m=_`QrTmbE}s#6h40rDhbf+FCS)i{E(i0 zvWG^p3vvuxwJp93L{4aw#ep0>`q$g|?a&m+=eGQW#w4_3k30jATX|&uIqYf&(E>mM zjXn7mu3kQ90i^isG}Wz@%o+oIdz3s90B7EL;6^V?vlb7sg@>4!%<4SD1Mhms#N3Gl zAuCzD@3%Oa!)E=OTEDuA0EHDbi~J4EZlCz$U+cttJ-R^xr&m2n0L-3`$8&t_M1h$9GWdqA zD7W92U_3Z~`^?iX(-=SL{{yw;BUJ`p1&IBxm{NX+ji>Rjil2e2=xp5kBC_nalzZ!c z-+w=0JHY`?EGSU0-FHVz29UyT{Rkl6Q!MmTtP`7nrR)>YmrS+@W8J?G@)v`yR7oc1)+&XSx=+svMHw# z`u!T*N7JSQH*n-EB7Z{etreg66FE`Bpg{@JYn)5f>ilrpA@ot-7!^iQip_fWl9x%N zo@=IFtr1#Yk$xSL%vt$&ageZ4<01VSh5ASMt|E^>&hQ~RaJ#?Q9d!Q^WlKQ<5Uw^# zZB{5!n@w|CvyVPR zcrVE5U}aK?Hv@5GaP{TS(5tNs3{{l~u#JK`KLqMxyQ=HLq&Qf#LThQDE{*?ZR9b$9 z&f-1D-S~gI^jHHxIlwTx-i!neXtSVU6w_-3ebD&6LgTP=!{Gp3bW@#wqx1)!)f6K3 z#9-Tc$U;@l)ieXP`HEvMY3%~Wm<;L3p!5b!?lhf&;LuHfyG8249sOgE%i8qJ)kO&G|Ln=?P24VyQDvh2S%rWhdJpGWjC+V zNACo=t}5g3`&X>IqD&~DC>IC@{jFb>{;r0V@DXx#d~&Xp1AFfu_qOSOTl$ZjSnqtQ z5O7W`n^l9*dsgurgq31~VeVh3i@$j&SpH+^d-OAs+c6PZFVfXRR(zmVoMB9X{{@ai zQTmBzqVS0hhoQiC(J5lue&u^Ts~uUP-7`XwZd~{1|YTVEm5VV$T1~h5L!glm9X)0; z=$u?NoYN-*{u!_hUafa7Lx%H{Wl8RfYtL5SAv@CtOV_m&804CA_45IU`MUC^wGmX@m&C18sPMjC`^ zcmL(lg?KK*xmKlc$W9%dfK78DmZG>CY$L z*4&S>)k;fz?tupPB!1yrP&Y~rsbt$;QLm)@9}f5f0K`u>Qx`B%9RD&V^D(BouK+MC z0HY^<1*v{B3(g1ebE(?4sN46fZSt;`(~a&`Q)Dk_?qFyJ^;q!EO5%UtxlQg+RpIDb z&U+k(8^f-@j|WJy+Z+@-LMvbU5*3(fo>>YpW0g&pv?i_%b)WYY8^BCJ?3CTFUX33- z!|5&i`u&#s`6NhUqvaf^XSo1dcFrY!LxwSNhP2uKI9b*0G7E)}Gf+W~f4bg1eTYN~ z+lCGCQ>E2L*S^=_ew-9y#Z;O^r)2|n`t>?DPa-ATNP@VwZE{MnK7(Vo`DXgB*s6~- zx+hK>GT-E!FjRlfamtPppd5=yXb57VN9*0=$kt2;d6>SfY)d~Iiuylz*vYJse%m9a zUT)4Tp*qQfbp2qflM(@U#h_{5d16C~X?3NjZ5Q6{W)c(`IlYb6*rnL)tD?fLtQENp zl2UvhlQihVyV)w5G^5X~`kpd%w;2kK|6aYj9fZr6y|-2;FB=unAD!}9lf&QJ(~!!s zk~#Mrjl&4pY95FGP26&Xe81Koa!y=qR`VW`BSZ6FD3WKx?+Yba?cXxG-DgMby(glP@Ywf?Vf#n>j2j-6?=zXHlvHkKQtx+; zT=N5%Xb03jfAou2u2UWuChf7DqgJUWo{6}>$Vu_HNbZFnVzYv6&O^g>K28O-#e+y> zZw~72lMx~I2XBRj`@SZ>?a0&6$;T8hkao(i~P&k@*o$8|umt@}bDRN8BG`hQ*JM*b=CWdq$;Wzk|z z(!Fx5ljLaz7vdx9TFp|EyfTbzE!$dh#^uC2^p$7-ubk|pYp%82?@XalWZVBatT6(TI4c?wCv@Lcy z-DljHms&|dPx>EhihoCr&#g_w`QJ!`scR8EvU}Oh96w>pg6m#gRcKp-#OSCkF0bo8 z=L^*aW1u$drrO=>qvS~=WAd7W-XXVmC&`pL~RxYad6$|F{Mzdd_;NOCCV>hyg10h&vi~|G0aDv!kQ_)nQ z{}P>vO>Q=FAX0-0%J`{-EvMR?^KxzO1&r$-_g&IxR@DU3W;#t<31qkQt<%gxNKU)K zXh;sWx#vtY$(uCiBp&1JY`q#9<8974dDl6U6P*DI=1i982KO9DE~{mOUTDi)f;)92 zc>BS5W|6jSKo%dVcTn@-=+wTjf{r2d3NK{{XceOdEqzDHP&0^zYoD+$lY{qRXfyM} za%af9Pex<@D0Eaf1-B+CZelq1XY1qN1p}b7A$|9R-qL*xYb*;Aqo_%q7IMFC)7VY+ z&P!Z>gvAsm^)_xMD_XYEyg5VW>T`Ev5RdmFW~5c-9rp>6{0Si1L3wR^1`qV~1BPC$ z&pd)lnhBY#je{rv@z>P)qiQ0Q*^y>jASi<}wVz2)BlbKX-KVN`GST4u8o@sImuVqc znVu*#F`iiG{vr!%3n^J4^Pc0xkh1TVf^)BuK-8 zDSJApR#AXKF)+^@uv*T7FH#Cz@jg}5KdnCb6^iY(wjaU_;L9_%s*MmOjfB_IYLwA` z=E=iK%?ijCvpL$X(EBr-opx>omS`_(U+8`rlyK3}CS&GQgQ_IK_V-AKe-Y8ex~O|$ zGNet!OrZILQ8OX5$pz}Y6*JQ=uli5}Zdo*@7aF`{K)4m0|#f8K}lTZXO7pDFE0@M98 zCNn$N{Zuimh6$r%&{U(TSkuEAXNQOVBa0#r_Pz%lceuZm4M}-rm-F3Rb9_`r7Aluy z$TEtCoqR3eervc*ZHNwuma${&OkjyXU>S%rK`j|$BVVDPr|FG)Tb?vG$QCDtDQ(F; z^V}~aPy`DbMMVCwfQXR?6nJnV&~oZkhB-j90m*GNhMP{VRlfbhnC46sVUG_iFs!-o z?%Y==JHe^X|Mdt!!zQX*WLx1M4E_RMp~69}n8 zcmc0iuRsOtR*t)N%j049Gm~g6LpN#Drn^i)eIp36vpZgA3;~>G)G}ooXu*X0MRrpP z-D>Ds+;yAUp&G^-xzS$GvZC$}~2$rKWHW|JF z@>ES5a>wIQ2*nt8H?1@Rl1p7VBhy}hx=Q$7nxr?*cgw;-XcJ2K$G+`kU*S@2BU~C3bei3 zQ49%L>ei!C_v8Zf1>7-;qqNGYnDdc|ptEC0cm09`dQny^XIE5rcQMm!-8~#>PGm1n zWD4YJ*vJU_<7VvJpPLia^5N9EES7VfPb6aQrHmFz#gr0eg8j7x==IBl5k&L8zr#qn zYK{?FR1;=SYB`kp0XSo*`3kpe%0Z9}m{QTIwkZ91aw_UxJ_gVpN)=*uK%#4QBpH&E zQ8z!pvVqy9!+=YMwDCn|zEhj%F?0ChY@sWmaBXanN!OI|sYR$Pw84ZqJcsQ<8SKcM zOdjhzFm;VG*Xo`(Bh~)j7*?OJqQb^|w9BMwI8g(c_6s@Uxo7rEnd=DxCIAGRz#Ow* z4Iu{v=NvV3K$TQl-ILhIuQqChMP>q1(TGf(R$XL58^Ep%u-6Lpq=vyLBajau6kcwf zg2B(QnaBm%YNWGp&Nwxb6yP~<*WtSj|_NHh5wt|oiB-IKW=pxmGl za7Vd;35tt!fW5ZQxJ0<8FkwnqgAP>$FM^q=-4wSr$k5Yd$#l;uHE8`y^>mke)_@E# z`KvsPRCr(dq*Qxa)aw$$p4@4<7jem*b?(LNwibaZ3$3)=oMxjGQw|295mtb`=(P@b zerUr}Is|3!F11uA;0M(k0{+NCb%)@+{Z^&>Pn$5w$Kvvtw$$x-w2kf^5ol!40JuRm zg3qv^*}Sn2y}cuT zgA^-G(QSY8+D`Wta6coOy=hLp`?bkN`=zz*Zi%~!b}0%U&}V;jkC^;G?~65lMq76WwO zt!f;MBW8)E=vJ$E1$cfpR0oChAK-Ri4xvVEx;mD*{TX-0%+k}WyvbEV+~Nk zpco7)T+vibRI(H>h87uRmLqB&VA}xm^OsTIt!|F50GY9Ps%~`#Ivi8S>YQsQ`Jl`Z zYLtrVf;~e)lE{eBL~93(GUAEt&=a)i1`~os7XOjl6~+as74~nbGSjs3h#o4#(g8sV z5C+swXJ{g#I$Ic_Nf$E~8p17t=)o!gj)TRBUoq%{#uOe7wj^jwn<0K=a1?<1FAF6> zh0vy0ZbBDOQ*@FF+tnTBYw0ZJESGo+ub|-62S3l;O%b*2H z28eQ%O7%uz$s)Z5`u&s3R7aJT!#^^{VA3p>xvtDHY`@G&L`ftpkN@h3iB@;_K#xR^ z{jeOW>cc@N-oGgRk|?aw2RFGdPNh`|FM%Sps7L_Gp!di4KMgBly^-IjRZV^Xd!N%l zscTu@mDNwWnb@q6P2e5q3;r+gMSqSXM)^6i7lVjLp%F zB(KbY&Dt0+{*Btq0HhNQA6WbrDmG^qCFu)k1K*QOSk9q}_o#Wl(77h7r1r6yxDiaW?)N3q#4!5mi?xhF(2nv&_q z#B9+9mXJx1;~PQ6CZZW&B!we8%|R)fP4_5bhGAg);D5x>DwAYyE@Dqfc6O?7Thgg7na zEF{EErTaiikH?&Bq0ilz&?PjDHKM=M-ApXEFXAk>1AwgigYgbAvr(Tg0K*%-kAZXd zqVH|FyCGw%_se>JpoH`RE04{Mhr}47`P+JbrR4b0*8fCZ5M2DA((xZwFBOH=PsVw% zlze|w@BJfKd4+Utmc5Sy<5ve2m-3P~P5eJ=DZldDyuZG8Zfh^9{1rt8AW%@C{&pq9 zU#J26hc@wzNhRa&ce>LFA>k_2Q)_butbgs}YO5j|MCJt95P(IGqdB7h`~B*rqP|>F z(EX&*3uj<@Ge7546eS-BxRcX3rRs=+dXky>yd*a%Op`Z9h$gQ|lUNcMSmz9b^m-^CzT@=t zp0wOJ=3a%u7DI5b(T(^*M%~~H_F8BoX){91sd#=ezr5yzc3NchiRDTmVB&}5SvVI@hk=CIIX0qVUrF|^v9!(oj5QauoQmJA_Z54nq3 zP|Ga%WLs!4$Bh>>Inn4WC>;_cVjE^vHssEr+d()4bUIqmsCC=gI#8xvnJW{^h?ask?G1@v6Rij4~ywqxFPM(`4W>2u9D!qjGT2WjT1H9AdZYmmb z!A5rni*4mFO{`Yo@rg3@r@i8nnb3r3vm^(&}~l#`y)gDj_F>*jb;( zOK&!bV5)T?#f4?bXfh`bHzp6)#x`P}`F$4l*%bc-i_FjhvwWylYBnPr(kKT*&bKB) z&i8WlUPa{Ade4dRFhIw))^L71s}Yomp)SWvxK4Ya!&y1i;jSCrq(uYzWQVgPl5&<; zTHM&kPWG6b)~T=)v0BhjcAbUE7H2_Xp)-Fx=`5K_IZIhudvaY)Vx%*kWINDIuO%#! zZ!d87OduLg$-LFhu|wN~JpV-8sID;vsf`GZHY)d7!4d@HwQ^#$drUbUy`sCX!34^m zh-u|ROlzHL3Tqv^WoB`MiU2A#c<&H?=Q?BD*Q!V8{wind&`P!zO1e2N5rS}*LDpS9 zp4NtReR8h59+7>z6!7L!DiT zHSX?m7k;^NAT2UdhntCY3gVv|X~8Q4li~IkxCsRomb+Wr!%OSr%xZUAZoQT^^yr#Y z9|!^4SqHmdZDhTg1?NVbH3Nmm1kF<;Bl<#(2t@;;=6D3Bv5kQ;!+d9tA75fmP#llD+U0WV-6f z(X2aYx2sm~2iZ^lyUiGfR}G!IQ=y58Qi&WQ#2Zni0bnmuZsR}+&`F&9;&CQ@nI9+lj>V&M7mYzP~u=L$-+<( z1^xsDH{6p1yU|PB<0dw#+|Lk%pViPv)YGRicFe;X#=L*ABCl46OmWC@X!{ftdpctz z`s8E56gyN~j)udHrz_V~NqJu`jA&=#_D67?Xzzeg+8>Go##gxn5e)WR!;8Bq;LVj0xeMGc$y!7oP7f#np*h+c2q`tjL2e@U!jH;F#JgZ zsvcw5H^!N&H6CwbrD4xki~#{tYMzSOicuw74}?F5?mo#xhS)YE>V*iv)o5i&;QUNa zE*A|IfxOQPjqgNFK(j+;X(tJ>&^Ym@8A@zd-=#kz+f|jm0^>BM#;+v;BZuj97J2j> zH4^ajc;0nJIjV3*qg)PEezggu0>WXC_iGh=f0C>skA{9ffyheLK9EBOQY!xhwQ7bQ zf@vI7_Gg;0zRD=AQiI+;gvSXD$Bdz^oRs9tP22C<-)T9-Nk&*GY z)VWJ6L)svf_I>ak68_BsSF;qwa^{pdRU^cwVnA&a( zY}ZCQgT?ujEK!08B#^ihn<0x91EZ9T0+4>L0JW@1QP!i4irXDope5NAL+H-$bGDVy z-_O!sB=yL=?5Ii9FLu|FO&Hv%i4J{mk<*oHa2AfEpkLW3tKji-8{AcXqkJ{&F3(xA ze}U5(jk$BV)qec;dHP6$+nq9;tjGK(fxqah{}F*WuX(S#vRfqT@A9*qP9n>T<%XO@xPe}J941GvGU8@ z`T@2ngtS6VJ;;~FV#rxMWjOPzMtp%Bk0?JBszJv{$Xh5UPl$IRZlw?#g}HhHXMf6b zI+6jmlcFiG2%3jj(m9)?R=J)?JAq2jd2iwbME56-W^FaR*G1m)-V}vi?;j$6n4{%F z9>24kH?zliZ;Ny&UKKM(5qVk88_B%$#`y8^zYBY3`2*Q%@xh<}55NCo@cXYEgzwjM z>3zWNb=zu6pkT+9tRHdG_;CuaDg623t%gs2>;p)3O+@-UF{?d%E)>Ug2c`IHShnL( z%m!FHhi{y`@7Yb4fP1ciVLvQyXxIZYSze_>iey!)KE_Mp#)xI2z*f9Kv5tT-;VaW(ryMMeGsreyR9eukJriZYk+=J6hW!-Z+%AG z@L3?#HF$kgROieB@PuE}hW^qA()^t@m@Z$0sqtT*68<$J^UESQev!LU_>V1mPDc4b zK9aax_%)0rhcqKWe>EEB6eM`-M&S=AST|=p2(w>(iL3@b33ysD9YCY!6(Ii-B=C_3rOaDJlxD$BHEM$Yc~S}MWQD8LP>?9}Pgc*QjDDG(y#2=sjv$D`s<`-}eZ%NRg$4n9zK`s=~lnA5t3j7kt39Sgs_+ z_a?Mg4ubYq*W{kFnm9+ce>kBPFRV%J69pk{@dD*Z(fF)afnZ2PHw|`rVp;H$^DUlkUAky8YRG zXxHB>{4c5s5I^{!8U_md|7+>RS>akHptw~5|CN;Wz&ElAsdYe`1*UyaPT{a;)%icu zBX0QS!MX(WR!t$Ck#fgf0L;IpR(hOb05xn5QJH*0`_(~-ec{84fE+OqsD}O^{G%1I z;sx=(2>bhlqQ7!8617i=SAf7hM^1`rcm4ai*AZm9VBWm8_8`m&$;@s=W0L3;t6Cg# zRyZCQRQ0yg13sFuf5=EjlBzVo+ShO)2g`wjjlWjrfa%?K31TDxBy(!)i2uX4`u{og zQ8_OCOKNaJFg2I|L6pIX)C97@ONsl2!L80wB$P*FQYlgg?g4|NFx?=RK2gKOQ~cAN zNQ&sUcKwp2%inMIKKl!q2!7)aa#oUcN>n_naO?N0)QyD|7yeFZ(% zTJ;z?OJM_j!50vppApgF!}~xv=YsBEZE=1L_xrLOHT)`=Riy(9mgvLl17=pryUk>q z=Ks{{y}MPL3FJ%#&%a0bnt%QJ7p<^198A$ZkC~wNqk*n}NqmwKYEWumx0=!tJU%sA3b2h{S)qO$5p2L;wAQh-2}UXr0rE9v{n(?_F>FNe@ekMJ)GV1Ghsr}KZ-WbQ3eRW<+u zjeQ}2o2(|>ZI=HGW9Pj(C3GDHaG$P0=@lO^c8yFB+L``mp`08O@UMW=fsW?oNt!Nj z-7K{VMg9ZzoaTlGKfq~T4f^j6E68Pj_vaOmzE${BZl0MS44w4nbD0PI_2{AM|bI&@Wczmyl^MDa#w z;f?DcpI0;a7=p(jt`PWAX%r;#5z8*JrWhbZLR_LN0fpKJ2y&L+J-nESA* z8*!|`H`iU)Xp*uKbiLKcp(njAovTIz*Iz-)*DAIUf}9&Q{0pSN;&d(d-;z>DGQfeS zF4E$+$;rAVpf>sR#!r@|kgjC;BLVS? zfWNH73asasG0LBR=5%S6rTwpmo89ZlIgAQ1zajGkcX78F|DH0BXA#z@T6ARUu+)N1KK1{M4OE=_i8(r*v%r`_yEOHYGU===&W*hQM2ps zsk?zWJ1Z$Z(qRAQCX=F8zV)8w-Z`O)OQ#rbJ7sW;NM0CIYRA()^rWzNgB%BIUQv(+ zLDj497cr&HEzY&1?5`XO$rBB?SP`;nrLN=&g7K?m!PZCXQx{T?qu#jyp`!E0gU;Dh z138sw-q+Y_Q8@eC>TdWLv^ad`w@l%kKn- zU)SjEla;!7QD%XoCz~15y~<08f^L-ZCd0jEoaZ;>bb~TZ_dFBeX7Vixm&2wpBfr{Y zvgJ!&XO!FtxfXQc*bMd+W?WOC=u0*)Tx3Eex}v!TD6F0nyNb78Q@rH0A~sT>D7d z9Fz86f_2`R67bzwve?FXZ|c#Vy`sT6d#oV^KJ+%*y{G_qfW44VhSvD->EK0&+IZRv zuWHr@0P|-XMhAeQs~Q0OzatcX^c2`6CyoZ}c0_|u9;{Dc8(ufu6A}>GtRq*G?K?hZ z=u`Enlku6X)Cn-dboWH2pxvU_J3lqz4`oE1k9+uoEdgiENWHf~j@!u%Aj0+TnG|ht z){DYj$xuu*li8532i;`95I?Nz-o9o8z5WKrPt-Yme%tY-CNo5B9_UA7<80;FvZkt5^Ix``~@<8scemHKgk%f>~sM>Fsym|L%dbQ5y^T*Z- zH_v9!joJ0l8C; z-zamgZfnV((5M#L?0{+zv)QF}|LwV{kSqk9m!bi0nvA7$K-70J&Kl)SVfWpvkVBRt z%{>t`K(#iN4sz~9EbLZ?8(WTG0sbrTX})0rraS!zQLkz_F3w$lDs-rzZqD^YN#t+YrN= z1eJ*XkFK?DcobVUbn*$${}kny?Ak_!?%(_fno+_??9fau=Z7HpMvNc`9x_$j>OiyBKPQanpSyoRQ)S~-6`=*DGd`uakNd4UOVA() zYI1Yx9xw|(@!7v{U;z+JO3|ZtANwc^(3oVG4uHH51>s8%2fXKHzSI4UPp%!vtFWJY z*is$t)^`^k!V>=RZ7ugOAnUUpX)yC`@-@rH3AyM%y?YmX!)z^c2Pt8WYit2$;6|*v z#N?yE6`DELByW`NSfR--KCY+6z>YS#_e|I=a~9cV0@L1sGp0cLJ+}M3DKKoTjD|L) zPPnu#XhzX8Z!mJUXjdrx;YMw$lcDhQhXd|ipe3s{PCQ>3ZMJW`&5YkEa}iGUI(Nn6 z=Q~Ya`{$NFD3SJ-+5O6QXvH#+Ud$D^AP{Hm@`ZWsEm<_L8ISZ+yawfIMo~-+4C`Jg1qA6@g@L>2+TjC9JZ!M6hGswhTLPfLtN@X z`k3pHuHakIR&5;Oz+@Do?)+@B-u-3NjDGs-rw1uU03p_WBHgM0!~NiFk^G$lGT#`k zZ7@{8NCstly_&}hV$OcM;gM(M`?3JUH53t>-J>2gWz_RAFW*=Z@qbNld9&p{;|r}a z*JQt_#HeVOeyjUbq(dRW_=r(B-Kh{??2fUE5usUX(D5W`a!azC{KG8b#O%Tu)J-r- zpnaR{u@?+?L{OQ5{Qy_)nFBEa1+rGTQ**zHV(8lD?#{2XgEbRqS+vf%UcO(F6AV3m z%`02T9bPjG;261GwlbTwk(jCAbu8VKs*5oXUT{+Tm~V!vS+zOTow^tSyMd@Vq{tLn zgw|*GtVu@ZIQcPFPejjmH{&}eVkXT7hPNM(CxZBG$~Hcx3JXm|&0;{Th-bEb0<$}Z zp!c}n%18yaV~z36#Z1Q`;;A$H!XB4m0InNDMS3mq6h>1&9Mmpr7FHv8$G~!%Vf-u z`(ql|NSf`b@#4UEv$QaT6WArq7-Hn{aO}9%ON277Ph+fs;YQSOnp6~5b}F@EmpKXT zfQ{dFH7Ez>?tQf;hm+Uj>rwY{8!cq`7ofD2-B4oJMfwK4<|g}{+vdCXPJw+zg4{yH zN$jqNECvdjElTzT2V-bPAiOWyy!jf!mMC+yQ|B+Id!1T2;1LWN&RdCAYUK@eyT2zJ z_crr`OZaGhM~o>dN_bIjfVioBzgP4dc|J?I5W?APUDYqGx<0$f1YCsCk%xvRJSx!)M zda{fpe8@Vb`3;QW^;Y*X9Ljz!-)R&O&L*gBR(tSeo_rL7HR1Q}e`@N@Jvi7BvMj7*#Hs5w$tF?C*&WNbrO?d^XEHbFhPY z2<|x;zLF-b9`_6`!ox+tBf|Eq;gW}-6cBu)n+{gqRt>_NK`ueyh_PXoG#GS`8jW-k z$8;*nkA;(@0;C$6m3?iV6r2L{0|o>014(u`9br}SVmfGyvLTF+WP>)i)CAK$=|GTj z?+1xrYBelKcTP+EzzTEBHj3n{k6 zG=-+(iq(|sGW?p}B!=07Tjm%gr>3D!v$<*wniLAQFPiM{zBk{!W2i@)TwxCCp~)sK zy2=zN71B!tj4jHbUjGNb8nFgQvu0j5|ej}kjV__cWp{3#C-hgrbt)T-0G0ylca5Nz5VU_8g#i|Qu zOqu9)KVPW9ng+n{_tboa9wvymDeUj~6iJ>?clE#XstrStPIcQAh5%GrtRUzW)*Qfu z%N34(W`VNv^lholD9X?XT9knL85B5zkR5nl0s|;9v;(TCi&b;6q%enoEDZ-kB}k+U zKup1cP_j;4sJP7jITaAU);~8?gep+8#c4o7u*aY%n1F$dNW{n|)R!jkv4M1PotmFx zXdMcB#beGnR##^9LSSK0yg4e zMSz)_V~i{}MtczYi61TV8}!k*vx|bSo5mu}Dzp*)F|b=>0DY?mrY|>^l zGre9@ko}4P0D^ZL(Pk0f)1dJ4^`IaDhNSDvEO36IRd6K*OjR(BohAyo{Xq7I+RUWT zh%CfR#1T;rk7y>XlH3Sr&k+{qQ~ySr9Z}@p_)@dHL5p&wGD_=s6cZbP^JsR9IlVy} zLBM)^9{TnpUG5Rn8)a@C%FPp9DNqluJ2_sz^2*KaATj~Y=jQu|3g5l0-P z5oc>2R4B{W+{It2*$+jf&S2zWoj*T}-Ki%t{p|6sdW-lR%&0$W3aKN>bE^)&^a ze@rzV2iZ%Z0z+rx%$RUee|^f8T@i?XRE)OA*!#EL;|Pj&u6B=1qLAHZRQhCMeS8nf zc;>(sH8l%;n$NWKn|oGfc8e@zgZ@ZZK$ARbvQMqBQ&JnEb7r6zjPMJJENm}q@_Z4E zW)P`dd!!x~*{Hjocp#7besMLJ>8uAc7@>7T*TJb@QC+plU8fm!OTOo$$0fXH_52c&q0K%7<6GBTYGlwM^ zGB=agTP}D!99A3+pA)Ve*}{cM*2em`x{J#~rW@i-BCoLQ`Hj3x%mwnk0_`kh#slEJ z`v9{;A;Bc4UVLxM)bd_r?4t^bUxV-a3My|Yl>8Qx$H=R9mA2m30LE|Q?WErO+xNCS z)~Kfg?i+bwPw#I`{SGLK(2uoIpwM{WIhNb?O;~^zRSF zTR=zXgT7~rd??-^vKtZmci-}rm6zGJ6axNsC|)PTMtvaTzFiX9fckcI1K%DE^gas< zL9q#TOZPSUAi9j-0as?%E{9_O*aFqMbs+FzRCFq>{dO_f?1efeEFfV?MYFGbSa-JN`<(2IL>iq14|8X*ZZn*~@XsuDk4OgD zjD_qnn#4S)D(PGMb$P9HH}rc0)(Nd|_IXH%YgnVyKu~ z1nga>OLtWyAO{w>s}n-L=kSpEc6S9<71V zc&tjujZFwS(&Wyu7{SdR^ro``+_GESBiqdqOR13gW;ZrQ zjG@U~J2zf#b|Y+A^y5(ha@N(7JwswS1f8U$Y7V5E-OeP*7DFcH1c~^Px;(MjT^}Vj z=wL+IahOu|cJ%QO20p#W%~m0*1~P{Wzi@Mq0b^9NYPW;_g7I@iB4E!nH@n-0xf4Sh z+87r7@pzwzt~R5P^2Pa2{+vIDL+FZsM19C&KV6H>D|Oo7>aZwvxkp9o%^1E)@2IRUv->@ zyzNBByPfsrCC-lG!b~4ga?5;utlQZ>$)1254d@Za>4FY0r!vRsn2tE}Cz9B(c4v_l zcH{ZA@}_oYX|dB;X(yaT(;aSaVXeG2=pGVXYn0RQ+>kg*8`(5vdRUgtYFtByKY~}b zj!cdH&lLgZ6tTuV4Uzc-i~a&*e3Q|?LHYQj^NlfZ-|Ip{ixrGFyTC|BjnWE*1?H0q zBuyd!p-m%>C3G{lMW*LETL$MkDFF69LNpgW-W1@A6KRqUtPGmP-p(@T z_{uitSZld^+@R1Vb+gi9-+f|-cZ96&c6LNpJKLw$I9sgMZXZ55^?$O4o?eBjbC}3b zi`Y8A{)82A5~Wthv*x*r^15uUcQ%TIvpzlFNl*7VE0W9IRqDwa_3;JH#^QW;(-2c^ zxw{VC@@YJEKo0AbL!ZZkTW<_(Fu)lTbBLG`i5bbR(153q`HVTF!NoEqjXuQ$Unmze zx@X~`CIMvwi^e_fHfA=ffMsT*5rHrP&YXaWFlU)!*W#;_vM4}lc8w`IB1XZ*(7;@I zvE|+Yq8qgH1nMEUhrHQl6t^pd{_)l7&}yfGyncIh4Mo$8kvW==UVfV~)2V>n#I(HW zCn7}TpAakeB-xxaUNP9ujJupyen`z&Ncab(ESz%>?d|6C2$E z(EbTCguh$rQ)!4OoMOb@2!Dj;*Xx6rhsX}J`t5)8^te09ON`1E4S_Rm9&P@CBb-xb zHo5(kgaQ3ZK-s4sOwD)ABHoa%aQk?~J{AOy0q*=3E!V7Pce#7|N$_Ri6NSLtSAtZr zG^e(NrgkXbKD$%pd@yiR8D-pQG46i2*8s&oN)3i3ir2x10?$98vKPgbMr0{AS!FqM zD`kGSdm5m6+GUu~ovZ4XR!>VwM-DmpN9COL9ph$|9k z0lANW>StXE8d;iYfdR273-O!6hGaSja=8{!JwiMS6?X)zetD6qF*cZ0#UVx*VLbb4 z#Y^vJ3q{&@ydDTzi`2tdq?6{Us4(p*_527A!27tGZGsDXFcysBJi}*_>Pm{kW>ugL zjpziFx)N;S$zkN4KU9BR}f7hYU1HO1fla zp~V~_$)luVwEi};f2TI)=+sT=8SQZvO)YhnO#AKK5%9BptKs=5=ljMh;4BWSDK^fDe6q zv9Pt#TB9dCw=rUCY(~#`PHb|GyBv_;M4LXf)Lk}Czz#&CNwXt5?qXubbQk1_JzDjN zxZ9QtOW3&05VGtU{*UyyLA;|A2}~+RtM0GUBge)6DMpUc$4+oH@+9P4{5@@gIH7FC zt6~%`Kr-aa6pwfQF*@J*`#|gHlft(Z&i)zUi-UjclV;x;-Vu?!|H+3p2~n+mviG*R znUyP7-WUA&N=sx`etykDOQcSEx5pCq?ELYv%>R7(%U?d?h;}~PH{KZ$2aJ)v#Tn&l z9RKarnZ5k^L@^c-sT-eaNg#K8UdR@yP2;V+KlU$ew(#SRz321M(o`L8p{o!;(WDdXkdz*72b@q83 z{JwBQg0sK*^%WN1sH$)LbST05(Y~d8{<%%_(jpbUE}9U%=il8hBVs?SkBZdkzh5vY zQez)e?~lD#+QPg1Jaq{5=KV|C7W=|``p;FFy6K%RE_(7u zElzd+yOQ_cymAqTEc|^lw|BuK%-Ynq>s(I${iki|ecPRpsh2-L&lVuef<@siU0oKb zvrYCOgIpd=(oT{~0H!4yeKcG6Ml&!Z!?_f$VYvJ1lwA4ep z)RSL%8RN(M&i;frb2k1ZJ%se2ylu|@1--<<@T{LOn;*&@?@xxRy&``7CnbMZJM z#v6VqD^pKB6z4*hUJ&K=zs_adOIeq+rbWvBLZBeLZ~bXhrq0-*+TizxQVh)7_CF({ z_c9g(8N1Ww_Rl`4nOk11`&z2l6H1EIZ+`dhyp}rtt$)u5@0(v3k*P1=^(Mz<=lxqq z@8&;c^;G8*VcMkQ8zWlkKi_%Br<}s`@Ay&Seb|i}-qojOHSfRHTUyHc{JS~fUHWKN zq_#fXOrur)0i5GcBMhO`J%eF&slT^yM{i8$r5Bi+HDcd%82N9kzVpzek-Gij4IKB{ zv&%ScjpOlp+)a^)@FwFEx_8fo1BUmDuVjtX`ugQO_gUZV<^e^kI{574;)QIQen zhG$^)Qg$zG|u-jg+TJ`zr_bc=GI4ZTZd(8>mPjX;L5J86M@vNf7{3t zKmF0Zgh-um`BqM_r(-?u@3?1uzepbO%C>~agr0igaDH**r`OV+)xAr2>Stc<<(B?- z%Tk{D&J!0|GUfdyIW1Dh9J-Cq#b4HOilaWa$P%fDL;%0{$?vTdf$%2YjelZkTIeOS zH}dMLAwBk=1x1l+9$Ub}{^?BL=q-NbrJ{)aBt+_yZ+39r=gwP5dp&>td=BZ`6`|)IyEz?5 zJ@@=7-kQsVp1SJ}kXc@AMsp`#q;Jy}d{8FX+8Lu@_D1u~*_W=H5#>c-0)Y;K|N%Fg&j)z4Ol+lc~dA!LE5LO1VJlh@8vsZ~u35nM;Hxv~ZK9 zc~AX15lr23o1GQCH*A^{vAm}mD_Z!FNtwFvUMDKz;yacVTSgnkZmkyTdsnucJQDQ2 z)t(bx&wq~wysJ0z<78$WZTS+3-6>u3w7Su<%7a2U4hi~`V-TZ7hN$ey^sF9 zXm~B}6ocOL|Kc8Yl+r=(fyz*w_s2gD%GBoP!`$Aj_qUFi;YT9D)ckw9c+SuKJSTfM z-n?K$3m3AMcka_uR`06U8xmG{V94_Ps%3gt=dt!*{9TB9iqvHT-p`-T)}?;8K4OdB z!fQdECK(almUw?K^=~V{+rM9f5cm_D1#iEWEZ2FHGgREWDu& zR=sCjI>6+-xT`E;f4x7_kb33f9Sq4YUo>|(klB0Q6N~BBKc2ZhDZGKRhjj1B+_;u% zNypN9N?f*%@%OhcjTo_q{^N&I_x<|#QbXqIKfjKZjUAquu=@6H)q8Sv;kJQb{Ewx< zy70|3#Y3Tl7Tec15a`|e)zc@WSNi?9?!Ef%WP^9l*)#Rtl1rlvsq$JUExc=*O1k%r zS23S^e#f%vjjv_g?Z0LnJ)L}XT6jMls7fz)+(?7BQL{qcW48@!-t+&Q;j=r^rg!u+ zqap8t$$qYI3MWgPHmIj|efv!mMZWbWBjS564(i_MjibVQIWwqvuRfR8yx+eAYxA1R zvRdkAcd)USy72K-o`!rU9q?}0&5?blf?D{4M>_Sj6Xq8h!@CpG`|A3l*}MEeM==oI z$4I$#eJSW&-83LmUt2xDB)mH}4@mE(iy+LnKN>V*#!->F-uwE#kTZLK9!2Uf{8S;} zor3-Ib}cE;DZjK$@AS{IKHYqk2zdQ(7DVrg!G@|9UOruya%0Pr!qYC!irBx*X)7~+ zO!4rfNPXzljd?Bhqg}&V=9n9zJD8P!=uHk9;U~xHytaR^sGR&77p=6+n`sPBjt0H> zSR@d;I6qj|TYO|*g>F42S{HjI=r{F>-=7-MJ>#uWk-BXYE{nH$0|Tw&e5=m8>$pUH z?BS5md&Px^&j|0w|6)KtbKju!jxR6>K5^B!^j<$~)bxtwlJwlG)6&~{dD-;3w~lMx zufNS=yYTj@2G4$gu6X&QQ_|C#uy8jvCj;KsPUp$L_;e)TZM}*$?1!J^e1E@aRQEPV zqr$uAM(DK0#CXWN#Nt$vyg&9Ue4oV|{bi`|rfxB5~zqzcL;4-iZ-F99ayeCeHiMl%AS%!-3&Y@65~1 zStGm!#!b(UFl3+p_>}0qbE_@SZwkK*r8}IV$^#@$arJ%kVMzChxC5 z7;W^LU$5HUDSgSHSGOwB?A?BHvB5jUDp+3eMTY!`-koane&3Qayd~l3M(+o^rp?sQ z?{%8x@NaOvBi~?jbsslvdM{r=gI)b!${BwAxs2zrI#gyt=N z0E>0%7XtlO_$4x^y)*QG_xI^s=LtOAXTOV4z2;~3fE_+>B;ak_DT3Zt?;F*;7lG@0 z-~M%iHS1pN`@Tz=E&td*BD|0PV^DZw-z+!%zt+AyPN}l}`yAE-v%z7;VMb?!i*ZDA z0mc-U6de~#P1I7Ilg@5`pjWu8X19Eiq+kldGy24^wJOzrb@*am--A*8_F!D((lU}?Z zkGzuy67vn!ayqg(3=Q2kmPO%X zaVgE{6<|!0`Up4~e~VMnp58Xrm=s?3G31&b&7wNByqPpZ=VNtg=7^F%?hzVw@7~2a zU*4e>QSn`m%;;$O7)xjS#w^f%byFkIj(org>E(@JKi?&&;7#XJdLjL?H!h_02!9xb zEpOm*cU{2y!UriQt2_T=K%ianNW)NiR#HhRWmHD9yMyl+p5|nx;yR2%z;_3iiFyYV zWJYNZO<#a${kAD?sZRNxSHNEdnGQv8eb;?)1$|zMNiLfameSROnCYx+p!f$zA?W6_ zRvGQ@0@iDK#lldX?%4CF-TO|43ajEk+nX5WLSaNkTRQ_Flk2SvRlO7wsW#&oy|dqQ zbL1-1OH7;i8gVf{$qPuh?@OnVpT!s&-3OBLQq5eolHa1qp#E$80+jAcM51oLpy@`QNXW4o)nQwnPMq%$0DGQ3)D*L6SP5bZuH2FBi0B&)p=?l z#;t=90S!XYJSA)U1eCqc$(r6KX(UZ6d&~%^SskaGJ|CUnsPGG$l%!b!DRtiK%~Z{T zg>m$E(0zY7g!<+sGiz*lI~R2N%n#1Z;-P96e+M3l$ZZUrtcc{0X}OP4^-BP_evBz; zRO_gagu7Ex+Vfgf8p(NdUeVbtF}^9*ni*PA5oF18F#r?$l#Qho#SW3_-XPwR%dZAl z{xA^sg4}Lp>HUoc5YLei)9tZIhE~1ggGF}TBc&@VVMFZh?t+Enu4#}P@BIdgnW8-c z99@_Kqhgh}ilGVZgIL)4dZ}r}&`!2&zS@bOX4FFnFXdsUD1IUMq5j4|4Qds4Vcubv z1V)x8lS(B4&N%C83yv|#8=5r?zuzn(`^%P0>iSbcY+5i{&SmlSQv%YKYB-ACf^1DV z+6Fg8^lQ?T->6cw_2e&ykxt6VnlxHH3YPSgg9%yNymY>0n9=q;3k7r~ z`#c_gUVnCop$AQZQu@H85EzTs72~Rndm&VJkEF6_UvmRX&)cBBUFDdPb0nlBJ>{2D z_@NJvaBd!8wJRt1Skv;GL329Edw{|n-wn&?P+cs*y6+hwb^Zmq;bNgxN`W8zN?PW1 zGW5N`Afb2a1_U&@3o?~0^J~UsaN-msf5{-EzIQnh&F>1w2hO0pep^LMnoOfp+o)=Iy~LFN<=ft zz-RB3R|!bp*`G(g=}yMfaT;MXEz8hg_YF9s8*vnRlvHl$y z$Iy!rje<-^EMgjOVW5;RqvJWPLwWRdEsQ9;8z&*leS?5B-CQ;4hrt0g86s$AGz-z~ z7XogauNKf{xgjC_B&mWr86FVP%C(9b+VO)Ed8R9B4aWbiF_LLoOT47ceNY+Sd$ z5HQrFp&d;AWlUg9YmHjAL5-+7usv%OQW zBTrg|G~}T^ohCI>!_3vd!fE|wQb?LN!9c&+_WhU!ZrLh=`2{n zZN)jVgkM3fP)JI_R)HJ}eFJ*U#$D8O{5O#A-48LMtAm0pH7knCboYOE6!NoOLVCYd zgrUqyICuDnfRK(iONfjYPNo6^-S$eqkZ%9wjxbtP;{&hvEW? z@+p=&m~7IL*Ro{JeB>&rYzPNUrb(p}ztN?j{8urioC~mMF7>$wgt(wF$SGlQiD=0~ z^tfrHPeyA#ipfawnp;4&UlI&mI_DFZ)B^<;1%JTK(WWCdhu1D{{G&cLK;6R%F%*T zu|k^A4aEb7Q(%?;!yw){55dDnrvn;xe&Io&k}01(-w2G7nEjeF-I9-j0?B ztVzm@t(d27#<=sfTV9ZPCst{j){WaOl^zjEI=Lit^lTJ{#k&kkEDM6|VEoTDAJ?P8k7IE19GX@<420f?}p4XAMY&lCjKjCm#w z!7{58Pl{+u3agQt8yY2GS`g2ir!(XMduP2OX|2Li+=dg$5N@n4@I`mBc&Vd z{dH*N5KgLXH_{Ko=tD`Bj(WZq&LYA1q+0tOuTE=MJpW`TTLG`OW1cO*K004aNY`g^ zx!Tw{YgXIvqM4;=y<|m-s9gbue0nqBoErw|8Mp|tZ#;_$6<6CI&dsrOiuU!1b-xvd z^Z7*%3B^7zFm(SOPE(iJM3i0(G;Xy!#?lvG!Lzgthx?L#;BkaZ!?wK_!d|M?Zha1J zTP9`>E^J&KDS4w|B8|9~XunY(Crf92_|=Nr!D+#Plz_(VP&2xohc%ge6ta2ncMV5F zPZ|UziyKKeF|u%^I2{mD`@04aU0>*jjoUg2IWDti(bE~=>S1y){;wlqa@u#ALDj;P zfR-Nv;T>`&sG|nLDz@aTL+juLA)YQ)pvq}wO}Mk8ovBn;b z-wnug1t;|N_-;&fuoTQW=QVg!Gn<3nY3da zBr;!6_y>_1x@)adx%^pIUERor3JHDlXDXBLl|aN~JD_J{NF&wi7l*{AyxdiK z0kx9qVaPsjkEKDf+LcDCPcZi-AvMBzFF}!&WT;s(*X7db1Dl1V!|G@n zZOu+*6EgrbXy^s|?tG%jq&t5G#I(FIK(t667t&6-LQKNX{R|y@>g9|@-=_kMaXtSC zp7yD#2OwMlcY3;Z7{4%~bmu}oY?TMbDKU22#@(dTxN109>MU_FoI_NJ$lc|sNQzw z)3VJrgeOv-=X8C(bf@uW!fD2<3vN4+ulqI5(6C1aBsaDs%mP|}&o1MSVhn@3y7EnB z-`)-zB^;*thl|lpN@Avgc!Gobe@!i<1|#95irV-Q639cOVqurx9Zb9BJAb!? zgaU`ew0OrKL4@b8g;{NR(u};(j$61=k_x1gOKOFex&+H#blRG3s$6~9#cKb&f`fBD zi7}?Yu(Jw=x0~}xcH5P0Y<2H9EV1Q)9Z|!dEJP=(cisN|Qc$E*4Ns`F-`_DaDyv6G zpX}k3wD5O#I#rBMAhFQl4(6?X&5}-u8Ni}lKltD-*AF8Bcr_uX_2)3-z^4YGsbyI2 zl=EqJBzm@6L^{J#CQbYFZj_;|m6kkeZh^SeszijfZ|WMxv7iQ!e}Bsq(x1m4ASy1p zgr!;2>o*0Xx~A6|A2c`*T9*%uM$ zhGhpKm%k=hZEn)Qm{z=#;#hteEcrK2*fMF=LJ;5%p@3tU*@*)hNt}CFi^g1v6 zxZOA1jCR&V(DmTJ-!aecTZDw<>R@Gc@zS_hRoByq|HiGSCc*^#i2g7(J~SbJQAZty z;Fa8SlWz6{w}fwPm(z*sjF?t@923!^3E@2IRO!%DyN}?p)X=5?1>K{W^mr4Z#g{um zv(0Phlu@160}V(XhMqVX42kL222mN^J>Y@b9%NOSMul2g7{0wHk7n$#XHoNVy`Iv; zu*!bg1aoJRvPz(fQ&h))YZcS>im*gC`c=f*GA$CFvnOifEuIWY|Dk$Dr~E?t>R1eF zcaC15tJ=e)@haGQC!FeB63>PDJmK@_(iaab$fdjj6XI~UAR>%EC)K*sYP7#UCe!Wt zri$gaVUn$nI~A0ssghCeAFD*9=;O?!Y;2uC%?^hd`n`5AjlQh~?7zi9sp7wi`n+zNwbePPc)jZ~8igx?vfNKwJB!Uue2}D;dt?-&KGBGkqe;n8IXJ z)}~Odaq_yWW~6?-Al{12XuotCmqi!$hJ{pbEvR~Kh*?4(FZPK{n>t)^)aG|0ge!da zH;a^SmdGXRg^*JB<8rl-Ck02c^FIa zavs=l1JC$tuNIj!2Y*R2yb|pDa+({?=>P{9c{6w&_dtk^I}hB{F!bDbPCzfUaKh@X z3BW#3ik@y<*Sn%-R6VfVCoNEyXJYBbeJd~6QC~13Dy7oT9h|A_^s^3*PbI`Or_?Sp zGA~?)hpc-4DhEF%+bSVp0Q`C2J8-mmxR<3KkNq;!$=Y|kEZ;f?FSSby7dDDW>2rBV zYAP+csF9HDytyeoIQy(Q0Cjy5+TGC4QhBd%9SX7t z%#T{45t6DbC8K&NwZK>>hy5;yas#Na zeWx9~DcScQzFPG8^@M=fUp%bpv|r9YF*9`K8ylj77ShMI%Gkk0KuH;E(Nws6yLAeSztfcb272}~u6el$pUmjTLfKj5Z;0zFlB z_loGif|8acH$a=24!e@Nb+sX?yUi`4z0Do< z=pw2q>Be|0o9953B?r$TR zQB?B%XoYC^2D42V^*~X`Kj#+ErG7ybH5v_AsAWpzQ0XpD4eER=$K zg&lE4LT^Z;`vcrkI

&Qpf|H*Yk5HORW}1R5W3)q7F4wdTY=NKX?E*YPFPl*EB%6 zZUsE1bxCEC?$@A*I!_4|6ZchIMD=0@G41b;RzwwQGkts&yT`j?8k)M&Tu7fcSLf(1 zok`{KYFh?PRskcfW!rS*{W(yZu62(vbo@|IO0{d-vZ&z?W&xd&SYeoUiX-dcfYn@5 z9%AX`*S!L2QUE!+-wWOBy&XijD;O5jcVDZ;#LfiqQd+>sXXBj$YCQ#PRHpTd=mjm7 ze*Q>2-)(;f_;;7rn>o77nH7|pq!-X@6<#d3S1%;S91v0Od>9brYEXIG21ZDSBUt}3 z5BjjL2uMtGW?qeJ`JWx>RK5lBv!Ixh8t2XW4J`9RTbF>^wuMDm7PE<{^e$9~q60jc z(or!1eew~<(tkaj%qb3H_+~(J7{vYx*-tv_3*qcs?l9?R!ok zr9S6?dLyn!1pLG((pXai!jc&qQWg=P@a6J_m_hk8y@-x1(@Ut|uMt^^u3x6RK!AZ9 z-s7xCC#&bZtVKXZmCMXxa@Fw`P-tBU&OujK9n;}AVgQOu3*vGzegd7=q8c+#{Ne^s z&&KL>#J%2hX{J}HlG|%i`{gzXdB?yo1^ z=*kI)tC&2?;_0R*`Hj_j)v>B({BS+O<9!sh>5tVOBfY*YQAB%VHU%jSQFtilT}8xR z!e;&9t#y+{{Le9l62*>YH0ZDmfwL!J6J77;&Z8j-b(XQKt}&3U!VVT+cm#3WW_#nT zsd!dHC(BO{HlYP^EKhNJfEW$7qC{YLSWkLITueKUyI>H{hTMK7z#r+0UNOD(HRg3j z54;FS3=B;jlFXr9&5>f50mKy6}XhfhknXS*-%f%=NHzyj=)6@>{@%J+Gkm|!b zmL>1y6}j>R9OkqG0Ofl#R-4K;pwOZCJ6|DxC@G@TxBUW|_yx|74N3@1m(I7-Uz{}4hU$W{GYg~nRI3mZEkW@d#WG?|===IUhK6X|hyg9NA}RiL z72MRNerSqExL>Nn3ofzhb!#2ErT0l_*q9`0dD>#Fn&c!@v~mutn`s|bspwuq@O>YJ zBU?8y!=BCSp#Jy~Y6(T>fC;$E0od!pxPY#Wi08s0aI^GT5YO3)Ci3Zw(j%o>^}$Z9 zR(jHCayH;;l`e$rP&bX3hV2U}>4SH`l(vtfQVP`qF6pgkX&Pq`QS0jB$|8wVNSj*W z&s!##{~4b;gfyqpjIx_!LBs`5acyYZn^@$bEgTFT-e#*wQ{IYcY34~s2W~s@16M#huOsekSqtfZ zB*dq!X1$t5Ryq`9ErZOR%Yd}nj(H`ze5FPzWExZLn}EEsomerp(wRdG+d#u^d5yt} zmm^A*pND}rQh=mSXIs)}z!bfZn%ptxQF(vJi7k_ZUD3zGXq#+HDNS9+=R4Zbu2lvN z{qh(&M9L1cWqz%si3@Za4>%g}CYz8HZ@O!c#Rh<0 z+cAc?*bxoPuCcC68Z|Hu<-1zXT5EI?wpFLofc1uK`eq0q?!fz?@tal!jHhm3pVg0W zY*rN5Ikty7gG$p}={mL4%JQpXnY3+dm6Q&DWfADo9lmV-5fXDZ>c)}HdL<;J_mbfv zDtS>ar~dmuhjzoz?@J%s7+UjpZE9UJfXrGphBL#A0hrK=M^QjKmaFsKqfm`%zi8YE|uJ~7E9UZGCL>ud7uJkVG((B!mzK!}=| z@H!rJizuk;29DKzKiA%jKMW~T?M-CT!cw%Ic)?eLqTk0dRQVB}8s|Hu)V7s^sP`l! zSB{KuBWuk+b z?}S?MbzLGlHX6F|==?w$Sr~^}ryj?&;-fge>oXss(}NSR;<^FR*Y@xi^ZODUoxIEx zQQPGhzF+CtF!)BmKeHGlYN>Fv|(VxqD_4r?r7Y)#Aa!0 zI=o8ZY-?KCs(DJHTx!WQ{&XT_>tsrw=Rn=a>$}ZfiFV<~k&dRVvo?n~(!L#g-qie~ z4z|Y1kG*Y8S5lKTZ75X~Yf9heqI~1kf~G!H<&AP?XOP+_n`!<8j2`SaW0T!UoCeL?d}N8Z`k3M8mF#!-prUj zH$SJyQk@QG@>~jD#2Vy)~SiOxLO`lyC!J@5(({G)4`JR4h%U(^I=M zgE|GVZ|CW`9K)Z3GQTnc23q`#M?fE~ax|oRV`4Q+w$ID(w-W$1=D96Ws<{Sy6d4OF z&a@=b=-y$}E^TTRt)*J8G4tIutafj#@*I~1U!=+2U>1Ee+aS=sWeUjK zbCr+9JliE)E`7Kdp4`eVp$u|iqcZXi(=$3lq29=U0!QD=fKk6|1Kz6nuB`@X zf*j&SW5AwXg*j7IZA(8o>C2_VUpP2g`wJZCa~DF{G=Bkvu=hNW`|kW|H&Kp^kG-Fl zE4li!Hm(+$pM&~isa}^vT^h>3LoqBvP`+LQb1-zqm7NDyaa1=DsY6R^L=mlB0Nc7) zpO9f&GzRIp=|})I31dskvB~@z(geyiZB-cTj9l+-e5 zR1^i{H+xQBk7k|MNT^Z$R3W_+^hu1DB_)`}2it+G7kh(5#xYQ!iLL>t@`-kor2GRC z^5AQ|idttF)Ku`NO-ZNT1dZE9qbi-nZ>Y!Dj-wQMI>(Xi5+HB)4i{`UHJ);kkrm5T zO{B!2(SkCUkZ#rI7#bJ~2}(joCE+ZAkI^|vE#SAK ze%v1q3rt-rXUB_4DTwkkXbju~?ye)98nlV9y2WeEGJYy>wci(Efv)6hO%r|qFfRAK zAV=@rLoEQ?(k~#v?vRA;QCveA)luon)&V8GhHZ*yeXS%*KYR?LCr8*bwc(^&YRVH= zSzA(#h5+|DjqGB0Eir}`tpptNR#0-a47zFC<792x^rc@+xjZPY|1OoTd!eaQ!he_) z(ZpI|j>azb*QGxifW5Weq(s#{kwN{2cx5!(3x1tzg`|&~r$NH5x}V-TbA_9KHgy36C_Ow{q~!u&zG%k18Ly^7C*$iM?3DivGZH*|xBZ1`i7h zb!P@}P55R8q|qxwh_$YCfbYl(mh%~e#F_LcH`%ACN!wQih4gb2>*d>;Os7|`!{_;~ zRRH$K`GE>nH*6A~`%@ao<10ZXbDmYE&Ao&BMb?+r zu!W??)4#OvBUw?$qNLfH7-ASB7y&JQH6o-tC!HuxItearAVDnit$Bzr{M6Bg&cUR2sOoJnVP0bgc>6(Zf`QcVs& z6ZC6r55r>7x)_zu(vCVsKuB(NSgL#RTLdeANFctUHlqx00fs!{oCcYRmpl?`pETr= zd=1vKM|&$Y;MWE*z5ltMp}W&!tnP4ML^dB=HDvk3g3^h>@Pv;21}^AP13FT)3K^+A zZQV*fUjwJ4K?2V!?ZOn3=(Its>zcA>@KzX$>u55%BBM&M3`&p4B?u6nHXee!z_~vvPeJebNS8 zaODlG#m0K(V$@u}#Am6qNPN&Dp!T03^40A&=(#t_32D(MjEF|waf;~EJbdkbwF=Rr zYw8^0)<#uye+b~xCPWevyYvfb!S`N)u6r6vejf+m*+jz)xrWneElQ4g;W&2Qo zHr&9_mQF!d)xxQx<{5}3R6K@Af6@pPOB96}Z9Az)V#+)B54)J|KMp8p?mBp&rgAuR z^=@KJ9mJ@nIP*9nCgn-Bj+Raaz-N|vaBtT^y|kp|#`?hl0uVFud>n$_S|g@iO%ThS zin}efLuLol+7?G%Z)ae1+nYk>Rx6Y=_N)btU>iiCN;;&3^y#+_IStsYz|KC&FbXw} z`d>l;hh9LpI)yN`BW_mPe`Zu^T7L90Y`rCp5GqT4#DY#gGhK)(aTch?rAq0KZZUx>KdPi5 zY@DSR%qe7q#W1z{o&f{w`^=uH+tAY{(#$;_^kNrH|!0$mq9QdsLp?|gf?+p#B7+N`G;J+Vpm5&}$K7QbY$*$@iY2xUL z!DEK}a}X0pxhDV54`T+67&>@D_25Pgolricd_p-+pGreVg}-<>ihI%{2XQ zgZcMS5UzUG^1qGae~$jIkyM{Np#q&vc}9_c8_d6cYucp$=<%=q$Dpb&n=)qfvkATO zaw&$?07Lz2-ZaKFbaeG4|2~R;9sOUU7*;u^d_vPE|2c%e{qQ$}RIk{-b>^%X?)=Zr z{&n=f+*#$A*Z#AwzYhMFyBb_MX8iwSE&u26f4RF!)#CF1=mzO)-r6uVeW4 z?3#a091o*=c8-9t{eRA_hOuXhg8#GsI(ORN&dtX0>b|O9LcGB(%*MaYTl=^3{@#D} z`PCd;ea)%A&W--<+*&yPuQsdySBqBls5!i==gu$!AaC}w@6u-|s(6OWKwf$ETs3(A l{rYNY$03}b{;ZX1OsyVm^*PmJhKMsUOtfv!p56Nx{|~As>QDdx literal 0 HcmV?d00001 From 7f831f8a9c8f3cd32ca1a3999c585ef260a68c7a Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 4 Dec 2025 19:58:47 +0100 Subject: [PATCH 008/117] test: update tests for new test pairs --- tests/commands/test_commands.py | 2 +- tests/data/test_datahandler.py | 4 ++++ tests/rpc/test_rpc_apiserver.py | 4 ++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/commands/test_commands.py b/tests/commands/test_commands.py index bae3d7fd1..a1e541bd1 100644 --- a/tests/commands/test_commands.py +++ b/tests/commands/test_commands.py @@ -1767,7 +1767,7 @@ def test_start_list_data(testdatadir, capsys): pargs["config"] = None start_list_data(pargs) captured = capsys.readouterr() - assert "Found 16 pair / timeframe combinations." in captured.out + assert "Found 18 pair / timeframe combinations." in captured.out assert re.search(r".*Pair.*Timeframe.*Type.*\n", captured.out) assert re.search(r"\n.* UNITTEST/BTC .* 1m, 5m, 8m, 30m .* spot |\n", captured.out) diff --git a/tests/data/test_datahandler.py b/tests/data/test_datahandler.py index bc665535f..6110d17b8 100644 --- a/tests/data/test_datahandler.py +++ b/tests/data/test_datahandler.py @@ -40,6 +40,8 @@ def test_datahandler_ohlcv_get_pairs(testdatadir): "NXT/BTC", "DASH/BTC", "XRP/ETH", + "BTC/USDT", + "XRP/USDT", } pairs = JsonGzDataHandler.ohlcv_get_pairs(testdatadir, "8m", candle_type=CandleType.SPOT) @@ -111,6 +113,8 @@ def test_datahandler_ohlcv_get_available_data(testdatadir): ("DASH/BTC", "5m", CandleType.SPOT), ("XRP/ETH", "1m", CandleType.SPOT), ("XRP/ETH", "5m", CandleType.SPOT), + ("BTC/USDT", "5m", CandleType.SPOT), + ("XRP/USDT", "5m", CandleType.SPOT), ("UNITTEST/BTC", "30m", CandleType.SPOT), ("UNITTEST/BTC", "8m", CandleType.SPOT), } diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index f7f99f288..aa5483e88 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -2758,12 +2758,12 @@ def test_list_available_pairs(botclient): rc = client_get(client, f"{BASE_URI}/available_pairs") assert_response(rc) - assert rc.json()["length"] == 12 + assert rc.json()["length"] == 14 assert isinstance(rc.json()["pairs"], list) rc = client_get(client, f"{BASE_URI}/available_pairs?timeframe=5m") assert_response(rc) - assert rc.json()["length"] == 12 + assert rc.json()["length"] == 14 rc = client_get(client, f"{BASE_URI}/available_pairs?stake_currency=ETH") assert_response(rc) From fe95581acd24f59e074d34b86c209c0acac6d82b Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 4 Dec 2025 20:04:44 +0100 Subject: [PATCH 009/117] test: update rel_mean test to use USDT Pairs This will allow highlighting a problem pointed out in #12588 --- tests/data/test_btanalysis.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/data/test_btanalysis.py b/tests/data/test_btanalysis.py index a09db5898..3b9ff40b7 100644 --- a/tests/data/test_btanalysis.py +++ b/tests/data/test_btanalysis.py @@ -290,20 +290,22 @@ def test_combine_dataframes_with_mean(testdatadir): def test_combined_dataframes_with_rel_mean(testdatadir): - pairs = ["ETH/BTC", "ADA/BTC"] + pairs = ["BTC/USDT", "XRP/USDT"] data = load_data(datadir=testdatadir, pairs=pairs, timeframe="5m") df = combined_dataframes_with_rel_mean( - data, datetime(2018, 1, 12, tzinfo=UTC), datetime(2018, 1, 28, tzinfo=UTC) + data, + fromdt=data["BTC/USDT"].at[0, "date"], + todt=data["BTC/USDT"].at[data["BTC/USDT"].index[-1], "date"], ) assert isinstance(df, DataFrame) - assert "ETH/BTC" not in df.columns - assert "ADA/BTC" not in df.columns + assert "BTC/USDT" not in df.columns + assert "XRP/USDT" not in df.columns assert "mean" in df.columns assert "rel_mean" in df.columns assert "count" in df.columns assert df.iloc[0]["count"] == 2 assert df.iloc[-1]["count"] == 2 - assert len(df) < len(data["ETH/BTC"]) + assert len(df) < len(data["BTC/USDT"]) def test_combine_dataframes_with_mean_no_data(testdatadir): From e792bafe21a02e8bb865ba14eec06b5318d5d74b Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 4 Dec 2025 21:14:27 +0100 Subject: [PATCH 010/117] test: update test to ensure rel_mean is reasonable --- tests/data/test_btanalysis.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/data/test_btanalysis.py b/tests/data/test_btanalysis.py index 3b9ff40b7..e5020fea0 100644 --- a/tests/data/test_btanalysis.py +++ b/tests/data/test_btanalysis.py @@ -306,6 +306,7 @@ def test_combined_dataframes_with_rel_mean(testdatadir): assert df.iloc[0]["count"] == 2 assert df.iloc[-1]["count"] == 2 assert len(df) < len(data["BTC/USDT"]) + assert df["rel_mean"].between(-0.5, 0.5).all() def test_combine_dataframes_with_mean_no_data(testdatadir): From 68e54248fd3cc1ccb3cf1842f735f677b3367602 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 4 Dec 2025 21:23:53 +0100 Subject: [PATCH 011/117] fix: calculate meaningful price change properly weighting each pair closes #12588 --- freqtrade/data/metrics.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/freqtrade/data/metrics.py b/freqtrade/data/metrics.py index a4b6898e2..cf59c330a 100644 --- a/freqtrade/data/metrics.py +++ b/freqtrade/data/metrics.py @@ -74,9 +74,10 @@ def combined_dataframes_with_rel_mean( df_comb = combine_dataframes_by_column(data, column) # Trim dataframes to the given timeframe df_comb = df_comb.iloc[(df_comb.index >= fromdt) & (df_comb.index < todt)] + rel_mean = df_comb.pct_change().mean(axis=1).fillna(0).cumsum() df_comb["count"] = df_comb.count(axis=1) df_comb["mean"] = df_comb.mean(axis=1) - df_comb["rel_mean"] = df_comb["mean"].pct_change().fillna(0).cumsum() + df_comb["rel_mean"] = rel_mean return df_comb[["mean", "rel_mean", "count"]] From 8ca25b17576a278a88f0af48067bd639fae2c6a0 Mon Sep 17 00:00:00 2001 From: 0xward Date: Fri, 5 Dec 2025 09:50:16 +0700 Subject: [PATCH 012/117] Update README.md docs: fix minor typo and inconsistency in README disclaimer (Dry-run to dry-run) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8c8adc9d3..cc02d41ae 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ This software is for educational purposes only. Do not risk money which you are afraid to lose. USE THE SOFTWARE AT YOUR OWN RISK. THE AUTHORS AND ALL AFFILIATES ASSUME NO RESPONSIBILITY FOR YOUR TRADING RESULTS. -Always start by running a trading bot in Dry-run and do not engage money +Always start by running a trading bot in Dry-Run and do not engage money before you understand how it works and what profit/loss you should expect. @@ -24,7 +24,7 @@ hesitate to read the source code and understand the mechanism of this bot. ## Supported Exchange marketplaces -Please read the [exchange specific notes](docs/exchanges.md) to learn about eventual, special configurations needed for each exchange. +Please read the [exchange-specific notes](docs/exchanges.md) to learn about special configurations that maybe needed for each exchange. - [X] [Binance](https://www.binance.com/) - [X] [BingX](https://bingx.com/invite/0EM9RX) From 338c1c54248e09767c5dc0550fa74b97fb5637f4 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 5 Dec 2025 07:10:04 +0100 Subject: [PATCH 013/117] fix: compare timeout with <= instead of < closes #12590 Backtesting assumes round dates, so a timeout at "candle length" needs to timeout at the hour - not after the hour. otherwise the timeout becomes either double (60 instead of 30) - or longer by one "timeframe detail" (31 instead of 30). --- freqtrade/strategy/interface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index 7ac196dba..34857c71e 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -1718,7 +1718,7 @@ class IStrategy(ABC, HyperStrategyMixin): timeout_unit = self.config.get("unfilledtimeout", {}).get("unit", "minutes") timeout_kwargs = {timeout_unit: -timeout} timeout_threshold = current_time + timedelta(**timeout_kwargs) - timedout = order.status == "open" and order.order_date_utc < timeout_threshold + timedout = order.status == "open" and order.order_date_utc <= timeout_threshold if timedout: return True time_method = ( From 262f4ffa4cef785c06805d260cb0aa6fecc93610 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 5 Dec 2025 07:10:17 +0100 Subject: [PATCH 014/117] test: update bt tests for new timeout behavior --- tests/optimize/test_backtesting.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/optimize/test_backtesting.py b/tests/optimize/test_backtesting.py index 11b6cea24..b1d13756f 100644 --- a/tests/optimize/test_backtesting.py +++ b/tests/optimize/test_backtesting.py @@ -879,6 +879,10 @@ def test_backtest_one_detail(default_conf_usdt, mocker, testdatadir, use_detail) patch_exchange(mocker) mocker.patch(f"{EXMS}.get_min_pair_stake_amount", return_value=0.00001) mocker.patch(f"{EXMS}.get_max_pair_stake_amount", return_value=float("inf")) + default_conf_usdt["unfilledtimeout"] = { + "entry": 11, + "exit": 30, + } if use_detail: default_conf_usdt["timeframe_detail"] = "1m" @@ -916,7 +920,7 @@ def test_backtest_one_detail(default_conf_usdt, mocker, testdatadir, use_detail) ) results = result["results"] assert not results.empty - # Timeout settings from default_conf = entry: 10, exit: 30 + # Timeout settings from = entry: 11, exit: 30 assert len(results) == (2 if use_detail else 3) assert "orders" in results.columns @@ -1800,7 +1804,7 @@ def test_backtest_multi_pair_detail_simplified( if use_detail: # Backtest loop is called once per candle per pair # Exact numbers depend on trade state - but should be around 2_600 - assert bl_spy.call_count > 2_170 + assert bl_spy.call_count > 2_159 assert bl_spy.call_count < 2_800 assert len(evaluate_result_multi(results["results"], "1h", 3)) > 0 else: From 271fc6b58558f70099f87472b166d2167b5e866d Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 2 Dec 2025 21:11:28 +0100 Subject: [PATCH 015/117] feat: don't fill up missing funding-fees after merge --- freqtrade/exchange/exchange.py | 12 ++++++++++-- tests/exchange/test_exchange.py | 9 +++++---- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 717844db7..e71e374a1 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -3808,8 +3808,16 @@ class Exchange: combined = mark_rates.merge( funding_rates, on="date", how="left", suffixes=["_mark", "_fund"] ) - combined["open_fund"] = combined["open_fund"].fillna(futures_funding_rate) - return combined[relevant_cols] + # Fill only leading missing funding rates so gaps stay untouched + first_valid_idx = combined["open_fund"].first_valid_index() + if first_valid_idx is None: + combined["open_fund"] = futures_funding_rate + else: + is_leading_na = (combined.index <= first_valid_idx) & combined[ + "open_fund" + ].isna() + combined.loc[is_leading_na, "open_fund"] = futures_funding_rate + return combined[relevant_cols].dropna() def calculate_funding_fees( self, diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 8d7e0b0d8..4daeb1855 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -5350,11 +5350,12 @@ def test_combine_funding_and_mark( df = exchange.combine_funding_and_mark(funding_rates, mark_rates, futures_funding_rate) if futures_funding_rate is not None: - assert len(df) == 3 + assert len(df) == 2 assert df.iloc[0]["open_fund"] == funding_rate - assert df.iloc[1]["open_fund"] == futures_funding_rate - assert df.iloc[2]["open_fund"] == funding_rate - assert df["date"].to_list() == [prior2_date, prior_date, trade_date] + # assert df.iloc[1]["open_fund"] == futures_funding_rate + assert df.iloc[-1]["open_fund"] == funding_rate + # Mid-candle is dropped ... + assert df["date"].to_list() == [prior2_date, trade_date] else: assert len(df) == 2 assert df["date"].to_list() == [prior2_date, trade_date] From d41acc77f7c4ec9df01b83e8e86423a42a7f678d Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 3 Dec 2025 06:55:56 +0100 Subject: [PATCH 016/117] fix: floor funding-rate to seconds to account for slight time offset --- freqtrade/data/history/datahandlers/idatahandler.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/freqtrade/data/history/datahandlers/idatahandler.py b/freqtrade/data/history/datahandlers/idatahandler.py index 67ae386c6..2727d1a64 100644 --- a/freqtrade/data/history/datahandlers/idatahandler.py +++ b/freqtrade/data/history/datahandlers/idatahandler.py @@ -397,6 +397,9 @@ class IDataHandler(ABC): pairdf = self._ohlcv_load( pair, timeframe, timerange=timerange_startup, candle_type=candle_type ) + if not pairdf.empty and candle_type == CandleType.FUNDING_RATE: + # Funding rate data is sometimes off by a couple of ms - floor to seconds + pairdf["date"] = pairdf["date"].dt.floor("s") if self._check_empty_df(pairdf, pair, timeframe, candle_type, warn_no_data): return pairdf else: From 41a82eff21b72e21b2f715a5eab3d0541040df66 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 3 Dec 2025 18:10:16 +0100 Subject: [PATCH 017/117] fix: don't fill up funding fee data Data Timeframes are arbitrary and may vary between pairs or time ranges --- freqtrade/optimize/backtesting.py | 1 + 1 file changed, 1 insertion(+) diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index fd78162db..e3e340a1b 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -374,6 +374,7 @@ class Backtesting: timerange=self.timerange, startup_candles=0, fail_without_data=True, + fill_up_missing=False, data_format=self.config["dataformat_ohlcv"], candle_type=CandleType.FUNDING_RATE, ) From 417a0817a7774a6ee48929c11bd71c69edc21aa1 Mon Sep 17 00:00:00 2001 From: stremblayiOS Date: Fri, 5 Dec 2025 18:25:53 +0100 Subject: [PATCH 018/117] Fix IndexError in fetch_positions for Hyperliquid when no pair specified ## Summary Fix IndexError crash in fetch_positions() when initializing wallets on Hyperliquid exchange. ## Quick changelog - Changed fetch_positions to pass None instead of empty list when no specific pair is requested - Fixes compatibility with Hyperliquid CCXT implementation that expects None for all positions ## What's new? When fetch_positions() is called without a specific pair parameter, the code was passing an empty list [] to the CCXT API. For Hyperliquid exchange, this causes an IndexError because the exchange's implementation attempts to access symbols[0] without checking if the list is empty. The CCXT standard is to pass None (not an empty list) when requesting all positions. This change aligns the code with the CCXT API convention and prevents the crash on Hyperliquid during wallet initialization. Error that was occurring: ``` IndexError: list index out of range at /root/freqtrade/.venv/lib/python3.11/site-packages/ccxt/hyperliquid.py:3051 market = self.market(symbols[0]) ``` This change does not use AI-generated code. --- freqtrade/exchange/exchange.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 717844db7..9c88a32bb 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1834,9 +1834,9 @@ class Exchange: if self._config["dry_run"] or self.trading_mode != TradingMode.FUTURES: return [] try: - symbols = [] + symbols = None if pair: - symbols.append(pair) + symbols = [pair] positions: list[CcxtPosition] = self._api.fetch_positions(symbols) self._log_exchange_response("fetch_positions", positions) return positions From 1ae5310d2fb40630ec673748207f78d1437ecbcb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 18:27:27 +0000 Subject: [PATCH 019/117] chore(deps): bump urllib3 from 2.5.0 to 2.6.0 Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.5.0 to 2.6.0. - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/2.5.0...2.6.0) --- updated-dependencies: - dependency-name: urllib3 dependency-version: 2.6.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index e75918c88..f4099ca05 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,7 +17,7 @@ httpx>=0.24.1 humanize==4.14.0 cachetools==6.2.2 requests==2.32.5 -urllib3==2.5.0 +urllib3==2.6.0 certifi==2025.11.12 jsonschema==4.25.1 tabulate==0.9.0 From 2845568f61459fb9378c3299f988085611d9bea1 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 5 Dec 2025 20:32:56 +0100 Subject: [PATCH 020/117] feat: limit funding_fee renaming to rename from low to high. --- freqtrade/data/history/datahandlers/idatahandler.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/freqtrade/data/history/datahandlers/idatahandler.py b/freqtrade/data/history/datahandlers/idatahandler.py index 2727d1a64..9e7d9de3a 100644 --- a/freqtrade/data/history/datahandlers/idatahandler.py +++ b/freqtrade/data/history/datahandlers/idatahandler.py @@ -511,8 +511,15 @@ class IDataHandler(ABC): Applies to bybit and okx, where funding-fee and mark candles have different timeframes. """ paircombs = self.ohlcv_get_available_data(self._datadir, TradingMode.FUTURES) + ff_timeframe_s = timeframe_to_seconds(ff_timeframe) + funding_rate_combs = [ - f for f in paircombs if f[2] == CandleType.FUNDING_RATE and f[1] != ff_timeframe + f + for f in paircombs + if f[2] == CandleType.FUNDING_RATE + and f[1] != ff_timeframe + # Only allow smaller timeframes to move from smaller to larger timeframes + and timeframe_to_seconds(f[1]) < ff_timeframe_s ] if funding_rate_combs: From 3f0be5e41fc9b76148c2adb06d8994a4f29eae5b Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 6 Dec 2025 13:42:16 +0100 Subject: [PATCH 021/117] fix: floor timestamp to seconds no candle has more than second precision. --- freqtrade/data/converter/converter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/data/converter/converter.py b/freqtrade/data/converter/converter.py index 4331519c2..290461d39 100644 --- a/freqtrade/data/converter/converter.py +++ b/freqtrade/data/converter/converter.py @@ -38,7 +38,7 @@ def ohlcv_to_dataframe( cols = DEFAULT_DATAFRAME_COLUMNS df = DataFrame(ohlcv, columns=cols) - df["date"] = to_datetime(df["date"], unit="ms", utc=True) + df["date"] = to_datetime(df["date"], unit="ms", utc=True).dt.floor("s") # Some exchanges return int values for Volume and even for OHLC. # Convert them since TA-LIB indicators used in the strategy assume floats From 07fbf2b4672949c43f01c47b113d59cd61749cf6 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 6 Dec 2025 13:46:27 +0100 Subject: [PATCH 022/117] feat: support dynamic funding fees in dry/live mode --- freqtrade/exchange/exchange.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index e71e374a1..b41d1a9fb 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -2744,7 +2744,11 @@ class Exchange: has_cache = cache and (pair, timeframe, c_type) in self._klines # in case of existing cache, fill_missing happens after concatenation ohlcv_df = ohlcv_to_dataframe( - ticks, timeframe, pair=pair, fill_missing=not has_cache, drop_incomplete=drop_incomplete + ticks, + timeframe, + pair=pair, + fill_missing=not has_cache and c_type != CandleType.FUNDING_RATE, + drop_incomplete=drop_incomplete, ) # keeping parsed dataframe in cache if cache: @@ -2755,7 +2759,7 @@ class Exchange: concat([old, ohlcv_df], axis=0), timeframe, pair, - fill_missing=True, + fill_missing=c_type != CandleType.FUNDING_RATE, drop_incomplete=False, ) candle_limit = self.ohlcv_candle_limit(timeframe, self._config["candle_type_def"]) From 17009ac59f539869b687bd2103c8c33d4e4d9bea Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 6 Dec 2025 13:53:18 +0100 Subject: [PATCH 023/117] chore: allow non-matching funding timeframe - as timeframe doesn't actually matter any longer. --- freqtrade/exchange/exchange.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index b41d1a9fb..381a05044 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -2698,7 +2698,7 @@ class Exchange: CandleType.SPOT, CandleType.FUTURES, ) - if invalid_timeframe or invalid_funding: + if invalid_timeframe: timeframes_ = ( ", ".join(self.timeframes) if candle_type != CandleType.FUNDING_RATE @@ -2710,6 +2710,13 @@ class Exchange: f"{timeframes_}." ) continue + if invalid_funding: + # TODO: does this message make sense? would docs be better? + # if any, this should be cached to avoid log spam! + logger.warning( + f"Wrong funding rate timeframe {timeframe} for pair {pair}, " + f"downloading {self.get_option('funding_fee_timeframe')} instead." + ) if ( (pair, timeframe, candle_type) not in self._klines From b70f10dca61f701ab1bae112abbde05d6a55d7a9 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 6 Dec 2025 14:06:17 +0100 Subject: [PATCH 024/117] chore: simplify warning formatting --- freqtrade/exchange/exchange.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 381a05044..79956e4a0 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -2699,15 +2699,10 @@ class Exchange: CandleType.FUTURES, ) if invalid_timeframe: - timeframes_ = ( - ", ".join(self.timeframes) - if candle_type != CandleType.FUNDING_RATE - else self.get_option("funding_fee_timeframe") - ) logger.warning( f"Cannot download ({pair}, {timeframe}, {candle_type}) combination as this " f"timeframe is not available on {self.name}. Available timeframes are " - f"{timeframes_}." + f"{', '.join(self.timeframes)}." ) continue if invalid_funding: From 730383ab180b7c6d442e63b846ac56894f14d11f Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 6 Dec 2025 14:13:41 +0100 Subject: [PATCH 025/117] feat: auto-download correct funding rate timeframe --- freqtrade/exchange/exchange.py | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 79956e4a0..dd335b784 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -2690,10 +2690,16 @@ class Exchange: input_coroutines: list[Coroutine[Any, Any, OHLCVResponse]] = [] cached_pairs = [] for pair, timeframe, candle_type in set(pair_list): - invalid_funding = ( - candle_type == CandleType.FUNDING_RATE - and timeframe != self.get_option("funding_fee_timeframe") - ) + if candle_type == CandleType.FUNDING_RATE and timeframe != ( + ff_tf := self.get_option("funding_fee_timeframe") + ): + # TODO: does this message make sense? would docs be better? + # if any, this should be cached to avoid log spam! + logger.warning( + f"Wrong funding rate timeframe {timeframe} for pair {pair}, " + f"downloading {ff_tf} instead." + ) + timeframe = ff_tf invalid_timeframe = timeframe not in self.timeframes and candle_type in ( CandleType.SPOT, CandleType.FUTURES, @@ -2705,13 +2711,6 @@ class Exchange: f"{', '.join(self.timeframes)}." ) continue - if invalid_funding: - # TODO: does this message make sense? would docs be better? - # if any, this should be cached to avoid log spam! - logger.warning( - f"Wrong funding rate timeframe {timeframe} for pair {pair}, " - f"downloading {self.get_option('funding_fee_timeframe')} instead." - ) if ( (pair, timeframe, candle_type) not in self._klines From 3bd911982fe850fcbd49e7a5c3c4d3a3992fabb9 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 6 Dec 2025 14:13:53 +0100 Subject: [PATCH 026/117] feat: add get_funding_rate_timeframe to dataprovider --- freqtrade/data/dataprovider.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index dfab29c08..311086f3b 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -620,3 +620,12 @@ class DataProvider: except ExchangeError: logger.warning(f"Could not fetch market data for {pair}. Assuming no delisting.") return None + + def get_funding_rate_timeframe(self) -> str: + """ + Get the funding rate timeframe from exchange options + :return: Timeframe string + """ + if self._exchange is None: + raise OperationalException(NO_EXCHANGE_EXCEPTION) + return self._exchange.get_option("funding_fee_timeframe") From 40f4ff04c267ecc296de228eea84fa41e27aaa94 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 6 Dec 2025 14:16:27 +0100 Subject: [PATCH 027/117] feat: auto-fix invalid funding rate timeframe in informative decorator --- freqtrade/strategy/informative_decorator.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/freqtrade/strategy/informative_decorator.py b/freqtrade/strategy/informative_decorator.py index ac9a2a1ad..7c7edb973 100644 --- a/freqtrade/strategy/informative_decorator.py +++ b/freqtrade/strategy/informative_decorator.py @@ -104,8 +104,11 @@ def _create_and_merge_informative_pair( ): asset = inf_data.asset or "" timeframe = inf_data.timeframe + timeframe1 = inf_data.timeframe fmt = inf_data.fmt candle_type = inf_data.candle_type + if candle_type == CandleType.FUNDING_RATE: + timeframe1 = strategy.dp.get_funding_rate_timeframe() config = strategy.config @@ -132,10 +135,10 @@ def _create_and_merge_informative_pair( fmt = "{base}_{quote}_" + fmt # Informatives of other pairs inf_metadata = {"pair": asset, "timeframe": timeframe} - inf_dataframe = strategy.dp.get_pair_dataframe(asset, timeframe, candle_type) + inf_dataframe = strategy.dp.get_pair_dataframe(asset, timeframe1, candle_type) if inf_dataframe.empty: raise ValueError( - f"Informative dataframe for ({asset}, {timeframe}, {candle_type}) is empty. " + f"Informative dataframe for ({asset}, {timeframe1}, {candle_type}) is empty. " "Can't populate informative indicators." ) inf_dataframe = populate_indicators_fn(strategy, inf_dataframe, inf_metadata) @@ -163,7 +166,7 @@ def _create_and_merge_informative_pair( dataframe, inf_dataframe, strategy.timeframe, - timeframe, + timeframe1, ffill=inf_data.ffill, append_timeframe=False, date_column=date_column, From 3ca8e0fb5c9f47a3f2cadcf90d4d0cdf70734821 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 6 Dec 2025 15:42:40 +0100 Subject: [PATCH 028/117] feat: auto-adjust funding rate timeframe in dataprovider --- freqtrade/data/dataprovider.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 311086f3b..bd5a7a5ba 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -348,6 +348,22 @@ class DataProvider: ) return total_candles + def __fix_funding_rate_timeframe( + self, pair: str, timeframe: str | None, candle_type: str + ) -> str: + if ( + candle_type == CandleType.FUNDING_RATE + and (ff_tf := self.get_funding_rate_timeframe()) != timeframe + ): + # TODO: does this message make sense? might be pointless as funding fees don't + # have a timeframe + logger.warning( + f"{pair}, {timeframe} requested - funding rate timeframe not matching {ff_tf}. " + ) + return ff_tf + + return timeframe + def get_pair_dataframe( self, pair: str, timeframe: str | None = None, candle_type: str = "" ) -> DataFrame: @@ -361,6 +377,7 @@ class DataProvider: :return: Dataframe for this pair :param candle_type: '', mark, index, premiumIndex, or funding_rate """ + timeframe = self.__fix_funding_rate_timeframe(pair, timeframe, candle_type) if self.runmode in (RunMode.DRY_RUN, RunMode.LIVE): # Get live OHLCV data. data = self.ohlcv(pair=pair, timeframe=timeframe, candle_type=candle_type) From 4897080827da16cd50f9199f3a3841f69252408e Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 6 Dec 2025 15:53:27 +0100 Subject: [PATCH 029/117] fix: bybit's minimal funding fee interval to 1h --- freqtrade/exchange/bybit.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/freqtrade/exchange/bybit.py b/freqtrade/exchange/bybit.py index 300344e19..3ca44edbe 100644 --- a/freqtrade/exchange/bybit.py +++ b/freqtrade/exchange/bybit.py @@ -38,8 +38,8 @@ class Bybit(Exchange): } _ft_has_futures: FtHas = { "ohlcv_has_history": True, - "mark_ohlcv_timeframe": "4h", - "funding_fee_timeframe": "8h", + "mark_ohlcv_timeframe": "1h", + "funding_fee_timeframe": "1h", "funding_fee_candle_limit": 200, "stoploss_on_exchange": True, "stoploss_order_types": {"limit": "limit", "market": "market"}, From cf6b7a847b7c826ec795c1ba06224384b6c0ba26 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 6 Dec 2025 16:01:05 +0100 Subject: [PATCH 030/117] fix: bitget's minimal funding fee interval is 1h --- freqtrade/exchange/bitget.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/freqtrade/exchange/bitget.py b/freqtrade/exchange/bitget.py index 3351cda88..aba2aa9b9 100644 --- a/freqtrade/exchange/bitget.py +++ b/freqtrade/exchange/bitget.py @@ -35,7 +35,8 @@ class Bitget(Exchange): "order_time_in_force": ["GTC", "FOK", "IOC", "PO"], } _ft_has_futures: FtHas = { - "mark_ohlcv_timeframe": "4h", + "mark_ohlcv_timeframe": "1h", + "funding_fee_timeframe": "1h", "funding_fee_candle_limit": 100, "has_delisting": True, } From 01b0a8fa42c42e48a7f3c1992190ddd2030f5642 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 6 Dec 2025 16:15:32 +0100 Subject: [PATCH 031/117] fix: 1h should be the default for funding/mark candles --- freqtrade/exchange/bitget.py | 2 -- freqtrade/exchange/bybit.py | 2 -- freqtrade/exchange/exchange.py | 4 ++-- freqtrade/exchange/hyperliquid.py | 1 - freqtrade/exchange/kraken.py | 1 - freqtrade/exchange/okx.py | 2 -- 6 files changed, 2 insertions(+), 10 deletions(-) diff --git a/freqtrade/exchange/bitget.py b/freqtrade/exchange/bitget.py index aba2aa9b9..f0da55cb0 100644 --- a/freqtrade/exchange/bitget.py +++ b/freqtrade/exchange/bitget.py @@ -35,8 +35,6 @@ class Bitget(Exchange): "order_time_in_force": ["GTC", "FOK", "IOC", "PO"], } _ft_has_futures: FtHas = { - "mark_ohlcv_timeframe": "1h", - "funding_fee_timeframe": "1h", "funding_fee_candle_limit": 100, "has_delisting": True, } diff --git a/freqtrade/exchange/bybit.py b/freqtrade/exchange/bybit.py index 3ca44edbe..0184c6c42 100644 --- a/freqtrade/exchange/bybit.py +++ b/freqtrade/exchange/bybit.py @@ -38,8 +38,6 @@ class Bybit(Exchange): } _ft_has_futures: FtHas = { "ohlcv_has_history": True, - "mark_ohlcv_timeframe": "1h", - "funding_fee_timeframe": "1h", "funding_fee_candle_limit": 200, "stoploss_on_exchange": True, "stoploss_order_types": {"limit": "limit", "market": "market"}, diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index dd335b784..b5b2bff89 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -153,8 +153,8 @@ class Exchange: "l2_limit_range_required": True, # Allow Empty L2 limit (kucoin) "l2_limit_upper": None, # Upper limit for L2 limit "mark_ohlcv_price": "mark", - "mark_ohlcv_timeframe": "8h", - "funding_fee_timeframe": "8h", + "mark_ohlcv_timeframe": "1h", + "funding_fee_timeframe": "1h", "ccxt_futures_name": "swap", "needs_trading_fees": False, # use fetch_trading_fees to cache fees "order_props_in_contracts": ["amount", "filled", "remaining"], diff --git a/freqtrade/exchange/hyperliquid.py b/freqtrade/exchange/hyperliquid.py index 212505b72..c72b79755 100644 --- a/freqtrade/exchange/hyperliquid.py +++ b/freqtrade/exchange/hyperliquid.py @@ -37,7 +37,6 @@ class Hyperliquid(Exchange): "stoploss_order_types": {"limit": "limit"}, "stoploss_blocks_assets": False, "stop_price_prop": "stopPrice", - "funding_fee_timeframe": "1h", "funding_fee_candle_limit": 500, "uses_leverage_tiers": False, } diff --git a/freqtrade/exchange/kraken.py b/freqtrade/exchange/kraken.py index 1f8b3cc26..60efdf954 100644 --- a/freqtrade/exchange/kraken.py +++ b/freqtrade/exchange/kraken.py @@ -35,7 +35,6 @@ class Kraken(Exchange): "trades_pagination_arg": "since", "trades_pagination_overlap": False, "trades_has_history": True, - "mark_ohlcv_timeframe": "4h", } _supported_trading_mode_margin_pairs: list[tuple[TradingMode, MarginMode]] = [ diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index c8c1130e5..07760bd32 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -29,8 +29,6 @@ class Okx(Exchange): _ft_has: FtHas = { "ohlcv_candle_limit": 100, # Warning, special case with data prior to X months - "mark_ohlcv_timeframe": "4h", - "funding_fee_timeframe": "8h", "stoploss_order_types": {"limit": "limit"}, "stoploss_on_exchange": True, "trades_has_history": False, # Endpoint doesn't have a "since" parameter From 597cc0592b1f1ff545bab6a24b04a492554f4740 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 6 Dec 2025 20:08:35 +0100 Subject: [PATCH 032/117] test: update funding_rate_migration test --- ...her => XRP_USDT_USDT-1h-funding_rate.feather} | Bin tests/util/test_funding_rate_migration.py | 15 ++++++++------- 2 files changed, 8 insertions(+), 7 deletions(-) rename tests/testdata/futures/{XRP_USDT_USDT-8h-funding_rate.feather => XRP_USDT_USDT-1h-funding_rate.feather} (100%) diff --git a/tests/testdata/futures/XRP_USDT_USDT-8h-funding_rate.feather b/tests/testdata/futures/XRP_USDT_USDT-1h-funding_rate.feather similarity index 100% rename from tests/testdata/futures/XRP_USDT_USDT-8h-funding_rate.feather rename to tests/testdata/futures/XRP_USDT_USDT-1h-funding_rate.feather diff --git a/tests/util/test_funding_rate_migration.py b/tests/util/test_funding_rate_migration.py index 094ee1562..e81462ba4 100644 --- a/tests/util/test_funding_rate_migration.py +++ b/tests/util/test_funding_rate_migration.py @@ -5,13 +5,14 @@ from freqtrade.util.migrations import migrate_funding_fee_timeframe def test_migrate_funding_rate_timeframe(default_conf_usdt, tmp_path, testdatadir): copytree(testdatadir / "futures", tmp_path / "futures") - file_4h = tmp_path / "futures" / "XRP_USDT_USDT-4h-funding_rate.feather" - file_8h = tmp_path / "futures" / "XRP_USDT_USDT-8h-funding_rate.feather" + file_30m = tmp_path / "futures" / "XRP_USDT_USDT-30m-funding_rate.feather" + file_1h_fr = tmp_path / "futures" / "XRP_USDT_USDT-1h-funding_rate.feather" + file_1h_fr = tmp_path / "futures" / "XRP_USDT_USDT-1h-funding_rate.feather" file_1h = tmp_path / "futures" / "XRP_USDT_USDT-1h-futures.feather" - file_8h.rename(file_4h) + file_1h_fr.rename(file_30m) assert file_1h.exists() - assert file_4h.exists() - assert not file_8h.exists() + assert file_30m.exists() + assert not file_1h_fr.exists() default_conf_usdt["datadir"] = tmp_path @@ -22,7 +23,7 @@ def test_migrate_funding_rate_timeframe(default_conf_usdt, tmp_path, testdatadir migrate_funding_fee_timeframe(default_conf_usdt, None) - assert not file_4h.exists() - assert file_8h.exists() + assert not file_30m.exists() + assert file_1h_fr.exists() # futures files is untouched. assert file_1h.exists() From 5110d0bddedcfca5da8b0adab54e44bed0d9ccb8 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 7 Dec 2025 15:12:42 +0100 Subject: [PATCH 033/117] test: update a couple of tests for new behavior --- tests/data/test_datahandler.py | 2 +- tests/data/test_history.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/data/test_datahandler.py b/tests/data/test_datahandler.py index 6110d17b8..e9fa95610 100644 --- a/tests/data/test_datahandler.py +++ b/tests/data/test_datahandler.py @@ -127,7 +127,7 @@ def test_datahandler_ohlcv_get_available_data(testdatadir): ("XRP/USDT:USDT", "1h", "futures"), ("XRP/USDT:USDT", "1h", "mark"), ("XRP/USDT:USDT", "8h", "mark"), - ("XRP/USDT:USDT", "8h", "funding_rate"), + ("XRP/USDT:USDT", "1h", "funding_rate"), } paircombs = JsonGzDataHandler.ohlcv_get_available_data(testdatadir, TradingMode.SPOT) diff --git a/tests/data/test_history.py b/tests/data/test_history.py index 115e73192..32dc33f07 100644 --- a/tests/data/test_history.py +++ b/tests/data/test_history.py @@ -579,8 +579,8 @@ def test_refresh_backtest_ohlcv_data( assert log_has_re(r"Downloading pair ETH/BTC, .* interval 1m\.", caplog) if trademode == "futures": - assert log_has_re(r"Downloading pair ETH/BTC, funding_rate, interval 8h\.", caplog) - assert log_has_re(r"Downloading pair ETH/BTC, mark, interval 4h\.", caplog) + assert log_has_re(r"Downloading pair ETH/BTC, funding_rate, interval 1h\.", caplog) + assert log_has_re(r"Downloading pair ETH/BTC, mark, interval 1h\.", caplog) # Test with only one pair - no parallel download should happen 1 pair/timeframe combination # doesn't justify parallelization From acc69e0d2e9cde65d1e16ff3001414ad70cfc5b4 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 7 Dec 2025 15:59:45 +0100 Subject: [PATCH 034/117] test: fix a couple more tests --- tests/data/test_datahandler.py | 1 - tests/optimize/test_backtesting.py | 13 ++++++------- .../futures/XRP_USDT_USDT-8h-mark.feather | Bin 7594 -> 0 bytes 3 files changed, 6 insertions(+), 8 deletions(-) delete mode 100644 tests/testdata/futures/XRP_USDT_USDT-8h-mark.feather diff --git a/tests/data/test_datahandler.py b/tests/data/test_datahandler.py index e9fa95610..9d40bf5cb 100644 --- a/tests/data/test_datahandler.py +++ b/tests/data/test_datahandler.py @@ -126,7 +126,6 @@ def test_datahandler_ohlcv_get_available_data(testdatadir): ("XRP/USDT:USDT", "5m", "futures"), ("XRP/USDT:USDT", "1h", "futures"), ("XRP/USDT:USDT", "1h", "mark"), - ("XRP/USDT:USDT", "8h", "mark"), ("XRP/USDT:USDT", "1h", "funding_rate"), } diff --git a/tests/optimize/test_backtesting.py b/tests/optimize/test_backtesting.py index b1d13756f..bbf55d2bc 100644 --- a/tests/optimize/test_backtesting.py +++ b/tests/optimize/test_backtesting.py @@ -970,8 +970,8 @@ def test_backtest_one_detail(default_conf_usdt, mocker, testdatadir, use_detail) @pytest.mark.parametrize( "use_detail,exp_funding_fee, exp_ff_updates", [ - (True, -0.018054162, 10), - (False, -0.01780296, 6), + (True, -0.0180457882, 15), + (False, -0.0178000543, 12), ], ) def test_backtest_one_detail_futures( @@ -1081,8 +1081,8 @@ def test_backtest_one_detail_futures( @pytest.mark.parametrize( "use_detail,entries,max_stake,ff_updates,expected_ff", [ - (True, 50, 3000, 55, -1.18038144), - (False, 6, 360, 11, -0.14679994), + (True, 50, 3000, 78, -1.17988972), + (False, 6, 360, 34, -0.14673681), ], ) def test_backtest_one_detail_futures_funding_fees( @@ -2382,13 +2382,12 @@ def test_backtest_start_nomock_futures(default_conf_usdt, mocker, caplog, testda f"Using data directory: {testdatadir} ...", "Loading data from 2021-11-17 01:00:00 up to 2021-11-21 04:00:00 (4 days).", "Backtesting with data from 2021-11-17 21:00:00 up to 2021-11-21 04:00:00 (3 days).", - "XRP/USDT:USDT, funding_rate, 8h, data starts at 2021-11-18 00:00:00", - "XRP/USDT:USDT, mark, 8h, data starts at 2021-11-18 00:00:00", + "XRP/USDT:USDT, funding_rate, 1h, data starts at 2021-11-18 00:00:00", f"Running backtesting for Strategy {CURRENT_TEST_STRATEGY}", ] for line in exists: - assert log_has(line, caplog) + assert log_has(line, caplog), line captured = capsys.readouterr() assert "BACKTESTING REPORT" in captured.out diff --git a/tests/testdata/futures/XRP_USDT_USDT-8h-mark.feather b/tests/testdata/futures/XRP_USDT_USDT-8h-mark.feather deleted file mode 100644 index f41502690473eada1348441973210c9d7fc0350f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7594 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 Date: Sun, 7 Dec 2025 16:11:47 +0100 Subject: [PATCH 035/117] test: update further tests --- tests/commands/test_commands.py | 4 ++-- tests/util/test_binance_mig.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/commands/test_commands.py b/tests/commands/test_commands.py index a1e541bd1..40127275b 100644 --- a/tests/commands/test_commands.py +++ b/tests/commands/test_commands.py @@ -1801,10 +1801,10 @@ def test_start_list_data(testdatadir, capsys): start_list_data(pargs) captured = capsys.readouterr() - assert "Found 6 pair / timeframe combinations." in captured.out + assert "Found 5 pair / timeframe combinations." in captured.out assert re.search(r".*Pair.*Timeframe.*Type.*\n", captured.out) assert re.search(r"\n.* XRP/USDT:USDT .* 5m, 1h .* futures |\n", captured.out) - assert re.search(r"\n.* XRP/USDT:USDT .* 1h, 8h .* mark |\n", captured.out) + assert re.search(r"\n.* XRP/USDT:USDT .* 1h.* mark |\n", captured.out) args = [ "list-data", diff --git a/tests/util/test_binance_mig.py b/tests/util/test_binance_mig.py index f700ff73a..db3d8b282 100644 --- a/tests/util/test_binance_mig.py +++ b/tests/util/test_binance_mig.py @@ -20,8 +20,8 @@ def test_binance_mig_data_conversion(default_conf_usdt, tmp_path, testdatadir): files = [ "-1h-mark.feather", "-1h-futures.feather", - "-8h-funding_rate.feather", - "-8h-mark.feather", + "-1h-funding_rate.feather", + "-1h-mark.feather", ] # Copy files to tmpdir and rename to old naming From c1c968666e373e0deb233388dd5ef457a6557a63 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 7 Dec 2025 18:19:22 +0100 Subject: [PATCH 036/117] chore: some minor cleanups --- freqtrade/data/dataprovider.py | 2 +- tests/util/test_funding_rate_migration.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index bd5a7a5ba..9c740709c 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -358,7 +358,7 @@ class DataProvider: # TODO: does this message make sense? might be pointless as funding fees don't # have a timeframe logger.warning( - f"{pair}, {timeframe} requested - funding rate timeframe not matching {ff_tf}. " + f"{pair}, {timeframe} requested - funding rate timeframe not matching {ff_tf}." ) return ff_tf diff --git a/tests/util/test_funding_rate_migration.py b/tests/util/test_funding_rate_migration.py index e81462ba4..69d603ed0 100644 --- a/tests/util/test_funding_rate_migration.py +++ b/tests/util/test_funding_rate_migration.py @@ -7,7 +7,6 @@ def test_migrate_funding_rate_timeframe(default_conf_usdt, tmp_path, testdatadir copytree(testdatadir / "futures", tmp_path / "futures") file_30m = tmp_path / "futures" / "XRP_USDT_USDT-30m-funding_rate.feather" file_1h_fr = tmp_path / "futures" / "XRP_USDT_USDT-1h-funding_rate.feather" - file_1h_fr = tmp_path / "futures" / "XRP_USDT_USDT-1h-funding_rate.feather" file_1h = tmp_path / "futures" / "XRP_USDT_USDT-1h-futures.feather" file_1h_fr.rename(file_30m) assert file_1h.exists() From e6030b7f59d71348c2107124e39059e3197e0f38 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 7 Dec 2025 20:01:08 +0100 Subject: [PATCH 037/117] chore: minor adjustments for clarity --- freqtrade/data/converter/converter.py | 1 + freqtrade/data/dataprovider.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/freqtrade/data/converter/converter.py b/freqtrade/data/converter/converter.py index 290461d39..99301d291 100644 --- a/freqtrade/data/converter/converter.py +++ b/freqtrade/data/converter/converter.py @@ -38,6 +38,7 @@ def ohlcv_to_dataframe( cols = DEFAULT_DATAFRAME_COLUMNS df = DataFrame(ohlcv, columns=cols) + # Floor date to seconds to account for exchange imprecisions df["date"] = to_datetime(df["date"], unit="ms", utc=True).dt.floor("s") # Some exchanges return int values for Volume and even for OHLC. diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 9c740709c..ed396ba8e 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -350,7 +350,7 @@ class DataProvider: def __fix_funding_rate_timeframe( self, pair: str, timeframe: str | None, candle_type: str - ) -> str: + ) -> str | None: if ( candle_type == CandleType.FUNDING_RATE and (ff_tf := self.get_funding_rate_timeframe()) != timeframe From 412392aea9ff7b2693f5edadde5326c57601a865 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 03:01:42 +0000 Subject: [PATCH 038/117] chore(deps-dev): bump scipy-stubs in the scipy group Bumps the scipy group with 1 update: [scipy-stubs](https://github.com/scipy/scipy-stubs). Updates `scipy-stubs` from 1.16.3.1 to 1.16.3.2 - [Release notes](https://github.com/scipy/scipy-stubs/releases) - [Commits](https://github.com/scipy/scipy-stubs/compare/v1.16.3.1...v1.16.3.2) --- updated-dependencies: - dependency-name: scipy-stubs dependency-version: 1.16.3.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: scipy ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index a9add54c4..869b17cc0 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -24,7 +24,7 @@ time-machine==3.1.0 nbconvert==7.16.6 # mypy types -scipy-stubs==1.16.3.1 # keep in sync with `scipy` in `requirements-hyperopt.txt` +scipy-stubs==1.16.3.2 # keep in sync with `scipy` in `requirements-hyperopt.txt` types-cachetools==6.2.0.20251022 types-filelock==3.2.7 types-requests==2.32.4.20250913 From 6540fbb8e784ad352ff16c09ca63cdb2708a023e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 03:02:07 +0000 Subject: [PATCH 039/117] chore(deps): bump fastapi from 0.122.0 to 0.123.0 Bumps [fastapi](https://github.com/fastapi/fastapi) from 0.122.0 to 0.123.0. - [Release notes](https://github.com/fastapi/fastapi/releases) - [Commits](https://github.com/fastapi/fastapi/compare/0.122.0...0.123.0) --- updated-dependencies: - dependency-name: fastapi dependency-version: 0.123.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index f4099ca05..e04f9fec6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -37,7 +37,7 @@ orjson==3.11.4 sdnotify==0.3.2 # API Server -fastapi==0.122.0 +fastapi==0.123.0 pydantic==2.12.5 uvicorn==0.38.0 pyjwt==2.10.1 From cb55ef5c591fd63b818239988af6cdbfe7714bc4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 03:02:14 +0000 Subject: [PATCH 040/117] chore(deps-dev): bump mypy from 1.18.2 to 1.19.0 Bumps [mypy](https://github.com/python/mypy) from 1.18.2 to 1.19.0. - [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md) - [Commits](https://github.com/python/mypy/compare/v1.18.2...v1.19.0) --- updated-dependencies: - dependency-name: mypy dependency-version: 1.19.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index a9add54c4..a5dca590c 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -7,7 +7,7 @@ -r docs/requirements-docs.txt ruff==0.14.6 -mypy==1.18.2 +mypy==1.19.0 pre-commit==4.5.0 pytest==9.0.1 pytest-asyncio==1.3.0 From f23fad420eac01c89ef186b346d843033ffb8db2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 07:11:06 +0000 Subject: [PATCH 041/117] chore(deps-dev): bump ruff from 0.14.6 to 0.14.7 Bumps [ruff](https://github.com/astral-sh/ruff) from 0.14.6 to 0.14.7. - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/ruff/compare/0.14.6...0.14.7) --- updated-dependencies: - dependency-name: ruff dependency-version: 0.14.7 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index a5dca590c..625b645d7 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -6,7 +6,7 @@ -r requirements-freqai-rl.txt -r docs/requirements-docs.txt -ruff==0.14.6 +ruff==0.14.7 mypy==1.19.0 pre-commit==4.5.0 pytest==9.0.1 From ebb362d9fa22ecb94e14971b276d8f2e71a43a7a Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 8 Dec 2025 08:16:30 +0100 Subject: [PATCH 042/117] chore: bump scipy-stubs in pre-commit config --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7375708e6..6ee0b73b2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -31,7 +31,7 @@ repos: - types-requests==2.32.4.20250913 - types-tabulate==0.9.0.20241207 - types-python-dateutil==2.9.0.20251115 - - scipy-stubs==1.16.3.1 + - scipy-stubs==1.16.3.2 - SQLAlchemy==2.0.44 # stages: [push] From 62d4da3b94ea7d66d3b3ab0c16e6f04187721b39 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 8 Dec 2025 08:43:50 +0100 Subject: [PATCH 043/117] test: add test for get_funding_rate_timeframe --- tests/data/test_dataprovider.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/data/test_dataprovider.py b/tests/data/test_dataprovider.py index afbba3d5d..aacc41554 100644 --- a/tests/data/test_dataprovider.py +++ b/tests/data/test_dataprovider.py @@ -636,3 +636,21 @@ def test_check_delisting(mocker, default_conf_usdt): assert res == dt_utc(2025, 10, 2) assert delist_mock2.call_count == 1 + + +def test_get_funding_rate_timeframe(mocker, default_conf_usdt): + default_conf_usdt["trading_mode"] = "futures" + default_conf_usdt["margin_mode"] = "isolated" + exchange = get_patched_exchange(mocker, default_conf_usdt) + mock_get_option = mocker.spy(exchange, "get_option") + dp = DataProvider(default_conf_usdt, exchange) + + assert dp.get_funding_rate_timeframe() == "1h" + mock_get_option.assert_called_once_with("funding_fee_timeframe") + + +def test_get_funding_rate_timeframe_no_exchange(default_conf_usdt): + dp = DataProvider(default_conf_usdt, None) + + with pytest.raises(OperationalException, match=r"Exchange is not available to DataProvider."): + dp.get_funding_rate_timeframe() From 0ec1066b347256da8fbc668fcdecb729476f09ea Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 8 Dec 2025 08:48:37 +0100 Subject: [PATCH 044/117] test: add test for funding_rate fix --- tests/data/test_dataprovider.py | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/tests/data/test_dataprovider.py b/tests/data/test_dataprovider.py index aacc41554..d3bd5fb98 100644 --- a/tests/data/test_dataprovider.py +++ b/tests/data/test_dataprovider.py @@ -9,7 +9,7 @@ from freqtrade.enums import CandleType, RunMode from freqtrade.exceptions import ExchangeError, OperationalException from freqtrade.plugins.pairlistmanager import PairListManager from freqtrade.util import dt_utc -from tests.conftest import EXMS, generate_test_data, get_patched_exchange +from tests.conftest import EXMS, generate_test_data, get_patched_exchange, log_has_re @pytest.mark.parametrize( @@ -185,6 +185,28 @@ def test_get_pair_dataframe(mocker, default_conf, ohlcv_history, candle_type): assert len(df) == 2 # ohlcv_history is limited to 2 rows now +def test_get_pair_dataframe_funding_rate(mocker, default_conf, ohlcv_history, caplog): + default_conf["runmode"] = RunMode.DRY_RUN + timeframe = "1h" + exchange = get_patched_exchange(mocker, default_conf) + candletype = CandleType.FUNDING_RATE + exchange._klines[("XRP/BTC", timeframe, candletype)] = ohlcv_history + exchange._klines[("UNITTEST/BTC", timeframe, candletype)] = ohlcv_history + + dp = DataProvider(default_conf, exchange) + assert dp.runmode == RunMode.DRY_RUN + assert ohlcv_history.equals( + dp.get_pair_dataframe("UNITTEST/BTC", timeframe, candle_type="funding_rate") + ) + msg = r".*funding rate timeframe not matching" + assert not log_has_re(msg, caplog) + + assert ohlcv_history.equals( + dp.get_pair_dataframe("UNITTEST/BTC", "5h", candle_type="funding_rate") + ) + assert log_has_re(msg, caplog) + + def test_available_pairs(mocker, default_conf, ohlcv_history): exchange = get_patched_exchange(mocker, default_conf) timeframe = default_conf["timeframe"] From f5e6504e22a36c9f2002a859c5960300eb111e34 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 8 Dec 2025 09:11:49 +0100 Subject: [PATCH 045/117] test: add test for funding rate exchange fix --- tests/exchange/test_exchange.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 4daeb1855..030f04452 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -2837,6 +2837,29 @@ def test_refresh_ohlcv_with_cache(mocker, default_conf, time_machine) -> None: assert ohlcv_mock.call_args_list[0][0][0] == pairs +def test_refresh_latest_ohlcv_funding_rate(mocker, default_conf_usdt, caplog) -> None: + ohlcv = generate_test_data_raw("1h", 24, "2025-01-02 12:00:00+00:00") + funding_data = [{"timestamp": x[0], "fundingRate": x[1]} for x in ohlcv] + + caplog.set_level(logging.DEBUG) + exchange = get_patched_exchange(mocker, default_conf_usdt) + exchange._api_async.fetch_ohlcv = get_mock_coro(ohlcv) + exchange._api_async.fetch_funding_rate_history = get_mock_coro(funding_data) + + pairs = [ + ("IOTA/USDT:USDT", "8h", CandleType.FUNDING_RATE), + ("XRP/USDT:USDT", "1h", CandleType.FUNDING_RATE), + ] + # empty dicts + assert not exchange._klines + res = exchange.refresh_latest_ohlcv(pairs, cache=False) + + assert len(res) == len(pairs) + assert log_has_re(r"Wrong funding rate timeframe 8h for pair IOTA/USDT:USDT", caplog) + assert not log_has_re(r"Wrong funding rate timeframe 8h for pair XRP/USDT:USDT", caplog) + assert exchange._api_async.fetch_ohlcv.call_count == 0 + + @pytest.mark.parametrize("exchange_name", EXCHANGES) async def test__async_get_candle_history(default_conf, mocker, caplog, exchange_name): ohlcv = [ From 9f4e167455b533202f10874c19929b442963fadc Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 8 Dec 2025 09:27:48 +0100 Subject: [PATCH 046/117] chore: force keyword usage on refresh_backtest_ohlcv --- freqtrade/data/history/history_utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/freqtrade/data/history/history_utils.py b/freqtrade/data/history/history_utils.py index 1467497d6..3e076351b 100644 --- a/freqtrade/data/history/history_utils.py +++ b/freqtrade/data/history/history_utils.py @@ -353,6 +353,7 @@ def _download_pair_history( def refresh_backtest_ohlcv_data( exchange: Exchange, + *, pairs: list[str], timeframes: list[str], datadir: Path, From cde886b8844ed8cd073106172d4ed730f2b859fb Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 8 Dec 2025 10:20:00 +0100 Subject: [PATCH 047/117] chore: use str for safe usage of candle_type --- freqtrade/exchange/exchange.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index b5b2bff89..dfa50a6be 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -2896,7 +2896,7 @@ class Exchange: ) if candle_type and candle_type not in (CandleType.SPOT, CandleType.FUTURES): - params.update({"price": candle_type.value}) + params.update({"price": str(candle_type)}) if candle_type != CandleType.FUNDING_RATE: data = await self._api_async.fetch_ohlcv( pair, timeframe=timeframe, since=since_ms, limit=candle_limit, params=params From e4fc5df1cf0383838e3aac9b0752efcc70845cea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 09:25:30 +0000 Subject: [PATCH 048/117] chore(deps): bump ccxt from 4.5.24 to 4.5.25 Bumps [ccxt](https://github.com/ccxt/ccxt) from 4.5.24 to 4.5.25. - [Release notes](https://github.com/ccxt/ccxt/releases) - [Commits](https://github.com/ccxt/ccxt/compare/v4.5.24...v4.5.25) --- updated-dependencies: - dependency-name: ccxt dependency-version: 4.5.25 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index e04f9fec6..6cd25e43b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,7 @@ ft-pandas-ta==0.3.16 ta-lib==0.6.8 technical==1.5.3 -ccxt==4.5.24 +ccxt==4.5.26 cryptography==46.0.3 aiohttp==3.13.2 SQLAlchemy==2.0.44 From 38e48c0c5ee875f100056b7e48a4eb40403d2aab Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 8 Dec 2025 11:55:26 +0100 Subject: [PATCH 049/117] test: update refresh ohlcv data test --- tests/data/test_history.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/data/test_history.py b/tests/data/test_history.py index 32dc33f07..e09572ad8 100644 --- a/tests/data/test_history.py +++ b/tests/data/test_history.py @@ -534,15 +534,15 @@ def test_validate_backtest_data(default_conf, mocker, caplog, testdatadir) -> No @pytest.mark.parametrize( - "trademode,callcount", + "trademode,callcount, callcount_parallel", [ - ("spot", 4), - ("margin", 4), - ("futures", 8), # Called 8 times - 4 normal, 2 funding and 2 mark/index calls + ("spot", 4, 2), + ("margin", 4, 2), + ("futures", 8, 2), # Called 8 times - 4 normal, 2 funding and 2 mark/index calls ], ) def test_refresh_backtest_ohlcv_data( - mocker, default_conf, markets, caplog, testdatadir, trademode, callcount + mocker, default_conf, markets, caplog, testdatadir, trademode, callcount, callcount_parallel ): caplog.set_level(logging.DEBUG) dl_mock = mocker.patch("freqtrade.data.history.history_utils._download_pair_history") @@ -573,7 +573,8 @@ def test_refresh_backtest_ohlcv_data( ) # Called once per timeframe (as we return an empty dataframe) - assert parallel_mock.call_count == 2 + # called twice for spot/margin and 4 times for futures + assert parallel_mock.call_count == callcount_parallel assert dl_mock.call_count == callcount assert dl_mock.call_args[1]["timerange"].starttype == "date" From 359eba462b23c59136852e14dca1409ba6b6d64d Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 8 Dec 2025 12:45:41 +0100 Subject: [PATCH 050/117] feat: add candle_types argument to download-data --- freqtrade/commands/arguments.py | 1 + freqtrade/data/history/history_utils.py | 70 ++++++++++++++----------- tests/data/test_history.py | 2 +- 3 files changed, 40 insertions(+), 33 deletions(-) diff --git a/freqtrade/commands/arguments.py b/freqtrade/commands/arguments.py index ca3b2b422..d6b326050 100755 --- a/freqtrade/commands/arguments.py +++ b/freqtrade/commands/arguments.py @@ -174,6 +174,7 @@ ARGS_DOWNLOAD_DATA = [ "dataformat_ohlcv", "dataformat_trades", "trading_mode", + "candle_types", "prepend_data", ] diff --git a/freqtrade/data/history/history_utils.py b/freqtrade/data/history/history_utils.py index 3e076351b..5c4bde06d 100644 --- a/freqtrade/data/history/history_utils.py +++ b/freqtrade/data/history/history_utils.py @@ -364,6 +364,7 @@ def refresh_backtest_ohlcv_data( data_format: str | None = None, prepend: bool = False, progress_tracker: CustomProgress | None = None, + candle_types: list[CandleType] | None = None, no_parallel_download: bool = False, ) -> list[str]: """ @@ -376,10 +377,41 @@ def refresh_backtest_ohlcv_data( pairs_not_available = [] fast_candles: dict[PairWithTimeframe, DataFrame] = {} data_handler = get_datahandler(datadir, data_format) - candle_type = CandleType.get_default(trading_mode) + def_candletype = CandleType.SPOT if trading_mode != "futures" else CandleType.FUTURES + if trading_mode != "futures": + # Ignore user passed candle types for non-futures trading + timeframes_with_candletype = [(tf, def_candletype) for tf in timeframes] + else: + # Filter out SPOT candle type for futures trading + candle_types = ( + [ct for ct in candle_types if ct != CandleType.SPOT] if candle_types else None + ) + fr_candle_type = CandleType.from_string(exchange.get_option("mark_ohlcv_price")) + tf_funding_rate = exchange.get_option("funding_fee_timeframe") + tf_mark = exchange.get_option("mark_ohlcv_timeframe") + + if candle_types: + timeframes_with_candletype = [ + (tf, ct) + for ct in candle_types + for tf in timeframes + if ct != CandleType.FUNDING_RATE + ] + else: + # Default behavior + timeframes_with_candletype = [(tf, def_candletype) for tf in timeframes] + timeframes_with_candletype.append((tf_mark, fr_candle_type)) + if not candle_types or CandleType.FUNDING_RATE in candle_types: + # All exchanges need FundingRate for futures trading. + # The timeframe is aligned to the mark-price timeframe. + timeframes_with_candletype.append((tf_funding_rate, CandleType.FUNDING_RATE)) + + logger.debug( + "Downloading %s.", ", ".join(f'"{tf} {ct}"' for tf, ct in timeframes_with_candletype) + ) + with progress_tracker as progress: - tf_length = len(timeframes) if trading_mode != "futures" else len(timeframes) + 2 - timeframe_task = progress.add_task("Timeframe", total=tf_length) + timeframe_task = progress.add_task("Timeframe", total=len(timeframes_with_candletype)) pair_task = progress.add_task("Downloading data...", total=len(pairs)) for pair in pairs: @@ -390,7 +422,7 @@ def refresh_backtest_ohlcv_data( pairs_not_available.append(f"{pair}: Pair not available on exchange.") logger.info(f"Skipping pair {pair}...") continue - for timeframe in timeframes: + for timeframe, candle_type in timeframes_with_candletype: # Get fast candles via parallel method on first loop through per timeframe # and candle type. Downloads all the pairs in the list and stores them. # Also skips if only 1 pair/timeframe combination is scheduled for download. @@ -417,7 +449,7 @@ def refresh_backtest_ohlcv_data( # get the already downloaded pair candles if they exist pair_candles = fast_candles.pop((pair, timeframe, candle_type), None) - progress.update(timeframe_task, description=f"Timeframe {timeframe}") + progress.update(timeframe_task, description=f"Timeframe {timeframe} {candle_type}") logger.debug(f"Downloading pair {pair}, {candle_type}, interval {timeframe}.") _download_pair_history( pair=pair, @@ -433,33 +465,6 @@ def refresh_backtest_ohlcv_data( pair_candles=pair_candles, # optional pass of dataframe of parallel candles ) progress.update(timeframe_task, advance=1) - if trading_mode == "futures": - # Predefined candletype (and timeframe) depending on exchange - # Downloads what is necessary to backtest based on futures data. - tf_mark = exchange.get_option("mark_ohlcv_timeframe") - tf_funding_rate = exchange.get_option("funding_fee_timeframe") - - fr_candle_type = CandleType.from_string(exchange.get_option("mark_ohlcv_price")) - # All exchanges need FundingRate for futures trading. - # The timeframe is aligned to the mark-price timeframe. - combs = ((CandleType.FUNDING_RATE, tf_funding_rate), (fr_candle_type, tf_mark)) - for candle_type_f, tf in combs: - logger.debug(f"Downloading pair {pair}, {candle_type_f}, interval {tf}.") - _download_pair_history( - pair=pair, - datadir=datadir, - exchange=exchange, - timerange=timerange, - data_handler=data_handler, - timeframe=str(tf), - new_pairs_days=new_pairs_days, - candle_type=candle_type_f, - erase=erase, - prepend=prepend, - ) - progress.update( - timeframe_task, advance=1, description=f"Timeframe {candle_type_f}, {tf}" - ) progress.update(pair_task, advance=1) progress.update(timeframe_task, description="Timeframe") @@ -805,6 +810,7 @@ def download_data( trading_mode=config.get("trading_mode", "spot"), prepend=config.get("prepend_data", False), progress_tracker=progress_tracker, + candle_types=config.get("candle_types"), no_parallel_download=config.get("no_parallel_download", False), ) finally: diff --git a/tests/data/test_history.py b/tests/data/test_history.py index e09572ad8..3051a4140 100644 --- a/tests/data/test_history.py +++ b/tests/data/test_history.py @@ -538,7 +538,7 @@ def test_validate_backtest_data(default_conf, mocker, caplog, testdatadir) -> No [ ("spot", 4, 2), ("margin", 4, 2), - ("futures", 8, 2), # Called 8 times - 4 normal, 2 funding and 2 mark/index calls + ("futures", 8, 4), # Called 8 times - 4 normal, 2 funding and 2 mark/index calls ], ) def test_refresh_backtest_ohlcv_data( From 994e61fe4219077e59c6b3e756e189a2736db700 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 8 Dec 2025 13:47:26 +0100 Subject: [PATCH 051/117] feat: add (commented) validation for fetch_*_ohlcv methods --- freqtrade/exchange/common.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/freqtrade/exchange/common.py b/freqtrade/exchange/common.py index 650db19b7..9dc64eb7e 100644 --- a/freqtrade/exchange/common.py +++ b/freqtrade/exchange/common.py @@ -97,6 +97,9 @@ EXCHANGE_HAS_OPTIONAL = [ # 'fetchLeverageTiers', # Futures initialization # 'fetchMarketLeverageTiers', # Futures initialization # 'fetchOpenOrders', 'fetchClosedOrders', # 'fetchOrders', # Refinding balance... + # "fetchPremiumIndexOHLCV", # Futures additional data + # "fetchMarkOHLCV", # Futures additional data + # "fetchIndexOHLCV", # Futures additional data # ccxt.pro "watchOHLCV", ] From c7636734def052466cf666a770cc70be10422568 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 8 Dec 2025 14:29:16 +0100 Subject: [PATCH 052/117] feat: validate supported candle types when downloading data --- freqtrade/data/history/history_utils.py | 2 ++ freqtrade/exchange/exchange.py | 29 +++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/freqtrade/data/history/history_utils.py b/freqtrade/data/history/history_utils.py index 5c4bde06d..d370a80aa 100644 --- a/freqtrade/data/history/history_utils.py +++ b/freqtrade/data/history/history_utils.py @@ -391,6 +391,8 @@ def refresh_backtest_ohlcv_data( tf_mark = exchange.get_option("mark_ohlcv_timeframe") if candle_types: + for ct in candle_types: + exchange.verify_candle_type_support(ct) timeframes_with_candletype = [ (tf, ct) for ct in candle_types diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index dfa50a6be..6dd26c1a3 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -2895,9 +2895,10 @@ class Exchange: timeframe, candle_type=candle_type, since_ms=since_ms ) - if candle_type and candle_type not in (CandleType.SPOT, CandleType.FUTURES): - params.update({"price": str(candle_type)}) if candle_type != CandleType.FUNDING_RATE: + if candle_type and candle_type not in (CandleType.SPOT, CandleType.FUTURES): + self.verify_candle_type_support(candle_type) + params.update({"price": str(candle_type)}) data = await self._api_async.fetch_ohlcv( pair, timeframe=timeframe, since=since_ms, limit=candle_limit, params=params ) @@ -2962,6 +2963,30 @@ class Exchange: data = [[x["timestamp"], x["fundingRate"], 0, 0, 0, 0] for x in data] return data + def verify_candle_type_support(self, candle_type: CandleType) -> None: + """ + Verify that the exchange supports the given candle type. + :param candle_type: CandleType to verify + :raises OperationalException: if the candle type is not supported + """ + if candle_type == CandleType.FUNDING_RATE: + if not self.exchange_has("fetchFundingRateHistory"): + raise OperationalException( + f"Exchange {self._api.name} does not support fetching funding rate history." + ) + elif candle_type not in (CandleType.SPOT, CandleType.FUTURES): + mapping = { + CandleType.MARK: "fetchMarkOHLCV", + CandleType.INDEX: "fetchIndexOHLCV", + CandleType.PREMIUMINDEX: "fetchPremiumIndexOHLCV", + CandleType.FUNDING_RATE: "fetchFundingRateHistory", + } + _method = mapping.get(candle_type, "fetchOHLCV") + if not self.exchange_has(_method): + raise OperationalException( + f"Exchange {self._api.name} does not support fetching {candle_type} candles." + ) + # fetch Trade data stuff def needed_candle_for_trades_ms(self, timeframe: str, candle_type: CandleType) -> int: From f33fd98c8363b35b2d3132f0ad927766387ea2c9 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 8 Dec 2025 14:43:12 +0100 Subject: [PATCH 053/117] test: Add test for candle type verification --- tests/exchange/test_exchange.py | 49 ++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 030f04452..422b8033f 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -2388,6 +2388,7 @@ async def test__async_get_historic_ohlcv(default_conf, mocker, caplog, exchange_ 5, # volume (in quote currency) ] ] + mocker.patch(f"{EXMS}.verify_candle_type_support", MagicMock()) exchange = get_patched_exchange(mocker, default_conf, exchange=exchange_name) # Monkey-patch async function exchange._api_async.fetch_ohlcv = get_mock_coro(ohlcv) @@ -2438,6 +2439,7 @@ def test_refresh_latest_ohlcv(mocker, default_conf_usdt, caplog, candle_type) -> ] caplog.set_level(logging.DEBUG) + mocker.patch(f"{EXMS}.verify_candle_type_support", MagicMock()) exchange = get_patched_exchange(mocker, default_conf_usdt) exchange._api_async.fetch_ohlcv = get_mock_coro(ohlcv) @@ -2688,6 +2690,7 @@ def test_refresh_latest_ohlcv_cache(mocker, default_conf, candle_type, time_mach ohlcv = generate_test_data_raw("1h", 100, start.strftime("%Y-%m-%d")) time_machine.move_to(start + timedelta(hours=99, minutes=30)) + mocker.patch(f"{EXMS}.verify_candle_type_support", MagicMock()) exchange = get_patched_exchange(mocker, default_conf) exchange._set_startup_candle_count(default_conf) @@ -5472,8 +5475,13 @@ def test__fetch_and_calculate_funding_fees( api_mock = MagicMock() api_mock.fetch_funding_rate_history = get_mock_coro(return_value=funding_rate_history) api_mock.fetch_ohlcv = get_mock_coro(return_value=mark_ohlcv) - type(api_mock).has = PropertyMock(return_value={"fetchOHLCV": True}) - type(api_mock).has = PropertyMock(return_value={"fetchFundingRateHistory": True}) + type(api_mock).has = PropertyMock( + return_value={ + "fetchFundingRateHistory": True, + "fetchMarkOHLCV": True, + "fetchOHLCV": True, + } + ) ex = get_patched_exchange(mocker, default_conf, api_mock, exchange=exchange) mocker.patch(f"{EXMS}.timeframes", PropertyMock(return_value=["1h", "4h", "8h"])) @@ -5517,8 +5525,13 @@ def test__fetch_and_calculate_funding_fees_datetime_called( api_mock.fetch_funding_rate_history = get_mock_coro( return_value=funding_rate_history_octohourly ) - type(api_mock).has = PropertyMock(return_value={"fetchOHLCV": True}) - type(api_mock).has = PropertyMock(return_value={"fetchFundingRateHistory": True}) + type(api_mock).has = PropertyMock( + return_value={ + "fetchFundingRateHistory": True, + "fetchMarkOHLCV": True, + "fetchOHLCV": True, + } + ) mocker.patch(f"{EXMS}.timeframes", PropertyMock(return_value=["4h", "8h"])) exchange = get_patched_exchange(mocker, default_conf, api_mock, exchange=exchange) d1 = datetime.strptime("2021-08-31 23:00:01 +0000", "%Y-%m-%d %H:%M:%S %z") @@ -6605,3 +6618,31 @@ def test_fetch_funding_rate(default_conf, mocker, exchange_name): with pytest.raises(DependencyException, match=r"Pair XRP/ETH not available"): exchange.fetch_funding_rate(pair="XRP/ETH") + + +def test_verify_candle_type_support(default_conf, mocker): + api_mock = MagicMock() + type(api_mock).has = PropertyMock( + return_value={ + "fetchFundingRateHistory": True, + "fetchIndexOHLCV": True, + "fetchMarkOHLCV": True, + "fetchPremiumIndexOHLCV": False, + } + ) + exchange = get_patched_exchange(mocker, default_conf, api_mock) + + # Should pass + exchange.verify_candle_type_support("futures") + exchange.verify_candle_type_support(CandleType.FUTURES) + exchange.verify_candle_type_support(CandleType.FUNDING_RATE) + exchange.verify_candle_type_support(CandleType.SPOT) + exchange.verify_candle_type_support(CandleType.MARK) + + # Should fail: + + with pytest.raises( + OperationalException, + match=r"Exchange .* does not support fetching premiumindex candles\.", + ): + exchange.verify_candle_type_support(CandleType.PREMIUMINDEX) From 80d5b6e24c8aac5169205289b849c0bc31081535 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 8 Dec 2025 16:22:20 +0100 Subject: [PATCH 054/117] test: minor refactor in online tests --- tests/exchange_online/test_ccxt_compat.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/exchange_online/test_ccxt_compat.py b/tests/exchange_online/test_ccxt_compat.py index 073ce0a38..cc7f37f4a 100644 --- a/tests/exchange_online/test_ccxt_compat.py +++ b/tests/exchange_online/test_ccxt_compat.py @@ -270,11 +270,13 @@ class TestCCXTExchange: assert exch.klines(pair_tf).iloc[-1]["date"] >= timeframe_to_prev_date(timeframe, now) assert exch.klines(pair_tf)["date"].astype(int).iloc[0] // 1e6 == since_ms - def _ccxt__async_get_candle_history(self, exchange, pair, timeframe, candle_type, factor=0.9): + def _ccxt__async_get_candle_history( + self, exchange, pair: str, timeframe: str, candle_type: CandleType, factor: float = 0.9 + ): timeframe_ms = timeframe_to_msecs(timeframe) now = timeframe_to_prev_date(timeframe, datetime.now(UTC)) - for offset in (360, 120, 30, 10, 5, 2): - since = now - timedelta(days=offset) + for offset_days in (360, 120, 30, 10, 5, 2): + since = now - timedelta(days=offset_days) since_ms = int(since.timestamp() * 1000) res = exchange.loop.run_until_complete( @@ -290,7 +292,7 @@ class TestCCXTExchange: candle_count = exchange.ohlcv_candle_limit(timeframe, candle_type, since_ms) * factor candle_count1 = (now.timestamp() * 1000 - since_ms) // timeframe_ms * factor assert len(candles) >= min(candle_count, candle_count1), ( - f"{len(candles)} < {candle_count} in {timeframe}, Offset: {offset} {factor}" + f"{len(candles)} < {candle_count} in {timeframe} {offset_days=} {factor=}" ) # Check if first-timeframe is either the start, or start + 1 assert candles[0][0] == since_ms or (since_ms + timeframe_ms) From 96849fcafe46417452a3dce17230312fefcbdc8f Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 8 Dec 2025 17:01:36 +0100 Subject: [PATCH 055/117] refactor: provide a non-failing check_candle_support method --- freqtrade/exchange/exchange.py | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 6dd26c1a3..49addd7fe 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -2963,17 +2963,15 @@ class Exchange: data = [[x["timestamp"], x["fundingRate"], 0, 0, 0, 0] for x in data] return data - def verify_candle_type_support(self, candle_type: CandleType) -> None: + def check_candle_type_support(self, candle_type: CandleType) -> bool: """ - Verify that the exchange supports the given candle type. + Check that the exchange supports the given candle type. :param candle_type: CandleType to verify - :raises OperationalException: if the candle type is not supported + :return: True if supported, False otherwise """ if candle_type == CandleType.FUNDING_RATE: if not self.exchange_has("fetchFundingRateHistory"): - raise OperationalException( - f"Exchange {self._api.name} does not support fetching funding rate history." - ) + return False elif candle_type not in (CandleType.SPOT, CandleType.FUTURES): mapping = { CandleType.MARK: "fetchMarkOHLCV", @@ -2983,9 +2981,19 @@ class Exchange: } _method = mapping.get(candle_type, "fetchOHLCV") if not self.exchange_has(_method): - raise OperationalException( - f"Exchange {self._api.name} does not support fetching {candle_type} candles." - ) + return False + return True + + def verify_candle_type_support(self, candle_type: CandleType) -> None: + """ + Verify that the exchange supports the given candle type. + :param candle_type: CandleType to verify + :raises OperationalException: if the candle type is not supported + """ + if not self.check_candle_type_support(candle_type): + raise OperationalException( + f"Exchange {self._api.name} does not support fetching {candle_type} candles." + ) # fetch Trade data stuff From 00f687f3f54681eb21f067349d2032ba6a7c2f99 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 8 Dec 2025 17:07:26 +0100 Subject: [PATCH 056/117] test: test futures data with online exchanges --- tests/exchange_online/test_ccxt_compat.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/exchange_online/test_ccxt_compat.py b/tests/exchange_online/test_ccxt_compat.py index cc7f37f4a..3e9ce3ee5 100644 --- a/tests/exchange_online/test_ccxt_compat.py +++ b/tests/exchange_online/test_ccxt_compat.py @@ -311,6 +311,8 @@ class TestCCXTExchange: [ CandleType.FUTURES, CandleType.FUNDING_RATE, + CandleType.INDEX, + CandleType.PREMIUMINDEX, CandleType.MARK, ], ) @@ -324,6 +326,10 @@ class TestCCXTExchange: timeframe = exchange._ft_has.get( "funding_fee_timeframe", exchange._ft_has["mark_ohlcv_timeframe"] ) + else: + # never skip funding rate! + if not exchange.check_candle_type_support(candle_type): + pytest.skip(f"Exchange does not support candle type {candle_type}") self._ccxt__async_get_candle_history( exchange, pair=pair, From 01fbf314057fefdb019e6fab11d506a6902ec994 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 8 Dec 2025 17:15:41 +0100 Subject: [PATCH 057/117] chore: don't suggest binance.us supports futures it doesn't. --- freqtrade/exchange/__init__.py | 2 +- freqtrade/exchange/binance.py | 23 +++++++++++++++++++++++ freqtrade/exchange/common.py | 4 ++-- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/freqtrade/exchange/__init__.py b/freqtrade/exchange/__init__.py index 667bbfe42..075906e11 100644 --- a/freqtrade/exchange/__init__.py +++ b/freqtrade/exchange/__init__.py @@ -4,7 +4,7 @@ from freqtrade.exchange.common import MAP_EXCHANGE_CHILDCLASS from freqtrade.exchange.exchange import Exchange # isort: on -from freqtrade.exchange.binance import Binance +from freqtrade.exchange.binance import Binance, Binanceus, Binanceusdm from freqtrade.exchange.bingx import Bingx from freqtrade.exchange.bitget import Bitget from freqtrade.exchange.bitmart import Bitmart diff --git a/freqtrade/exchange/binance.py b/freqtrade/exchange/binance.py index b5c6c5d52..7d9c616bb 100644 --- a/freqtrade/exchange/binance.py +++ b/freqtrade/exchange/binance.py @@ -544,3 +544,26 @@ class Binance(Exchange): cache[ft_symbol] = delist_dt return cache.get(pair, None) + + +class Binanceusdm(Binance): + """Binacne USDM Exchange + Same as Binance - only futures trading is supported (via ccxt). + + Not actually necessary, binance should be preferred. + """ + + _supported_trading_mode_margin_pairs: list[tuple[TradingMode, MarginMode]] = [ + (TradingMode.FUTURES, MarginMode.CROSS), + (TradingMode.FUTURES, MarginMode.ISOLATED), + ] + + +class Binanceus(Binance): + """Binance US exchange class. + Minimal adjustment to disable futures trading for the US subsidiary of Binance + """ + + _supported_trading_mode_margin_pairs: list[tuple[TradingMode, MarginMode]] = [ + (TradingMode.SPOT, MarginMode.NONE), + ] diff --git a/freqtrade/exchange/common.py b/freqtrade/exchange/common.py index 650db19b7..628838db2 100644 --- a/freqtrade/exchange/common.py +++ b/freqtrade/exchange/common.py @@ -45,8 +45,6 @@ BAD_EXCHANGES = { } MAP_EXCHANGE_CHILDCLASS = { - "binanceus": "binance", - "binanceusdm": "binance", "okex": "okx", "gateio": "gate", "huboi": "htx", @@ -54,6 +52,8 @@ MAP_EXCHANGE_CHILDCLASS = { SUPPORTED_EXCHANGES = [ "binance", + "binanceus", + "binanceusdm", "bingx", "bitmart", "bitget", From 3689b52309c5cecea0ed0ebacfde12d3e1973d54 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 8 Dec 2025 17:21:51 +0100 Subject: [PATCH 058/117] docs: add Section about very loose stoploss on exchange closes #12598 --- docs/stoploss.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/stoploss.md b/docs/stoploss.md index 9eb3f9c90..f12c86abd 100644 --- a/docs/stoploss.md +++ b/docs/stoploss.md @@ -31,9 +31,14 @@ The Order-type will be ignored if only one mode is available. --8<-- "includes/exchange-features.md" !!! Note "Tight stoploss" - Do not set too low/tight stoploss value when using stop loss on exchange! + Do not set too low/tight stoploss value when using stop loss on exchange! If set to low/tight you will have greater risk of missing fill on the order and stoploss will not work. +!!! Warning "Loose stoploss" + Using stoploss on exchange with a very wide stoploss (e.g. -1) may fail to place the stoploss order on exchange due to exchange limitations. + In that case, the bot will fallback to using the `emergency_exit` order type to place a market order as placing the stoploss order failed. + Freqtrade currently does not implement a limitation to avoid this situation, so please ensure your stoploss values are within reasonable limits for your exchange or disable stoploss on exchange. + ### stoploss_on_exchange and stoploss_on_exchange_limit_ratio Enable or Disable stop loss on exchange. From 072ed705fcfc8ccee8f82e5398025173c2a4dc67 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 8 Dec 2025 19:21:48 +0100 Subject: [PATCH 059/117] test: fix funding_fee online tests --- tests/exchange_online/test_ccxt_compat.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/exchange_online/test_ccxt_compat.py b/tests/exchange_online/test_ccxt_compat.py index 3e9ce3ee5..944674da7 100644 --- a/tests/exchange_online/test_ccxt_compat.py +++ b/tests/exchange_online/test_ccxt_compat.py @@ -274,6 +274,7 @@ class TestCCXTExchange: self, exchange, pair: str, timeframe: str, candle_type: CandleType, factor: float = 0.9 ): timeframe_ms = timeframe_to_msecs(timeframe) + timeframe_ms_8h = timeframe_to_msecs("8h") now = timeframe_to_prev_date(timeframe, datetime.now(UTC)) for offset_days in (360, 120, 30, 10, 5, 2): since = now - timedelta(days=offset_days) @@ -291,7 +292,14 @@ class TestCCXTExchange: candles = res[3] candle_count = exchange.ohlcv_candle_limit(timeframe, candle_type, since_ms) * factor candle_count1 = (now.timestamp() * 1000 - since_ms) // timeframe_ms * factor - assert len(candles) >= min(candle_count, candle_count1), ( + # funding fees can be 1h or 8h - depending on pair and time. + candle_count2 = (now.timestamp() * 1000 - since_ms) // timeframe_ms_8h * factor + min_value = min( + candle_count, + candle_count1, + candle_count2 if candle_type == CandleType.FUNDING_RATE else candle_count1, + ) + assert len(candles) >= min_value, ( f"{len(candles)} < {candle_count} in {timeframe} {offset_days=} {factor=}" ) # Check if first-timeframe is either the start, or start + 1 From 309985503daafd336f4b2d8aa52da151efcc79b5 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 8 Dec 2025 20:17:10 +0100 Subject: [PATCH 060/117] test: fix funding_rate_history online test --- tests/exchange_online/test_ccxt_compat.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/tests/exchange_online/test_ccxt_compat.py b/tests/exchange_online/test_ccxt_compat.py index 944674da7..9789bfea9 100644 --- a/tests/exchange_online/test_ccxt_compat.py +++ b/tests/exchange_online/test_ccxt_compat.py @@ -353,6 +353,7 @@ class TestCCXTExchange: timeframe_ff = exchange._ft_has.get( "funding_fee_timeframe", exchange._ft_has["mark_ohlcv_timeframe"] ) + timeframe_ff_8h = "8h" pair_tf = (pair, timeframe_ff, CandleType.FUNDING_RATE) funding_ohlcv = exchange.refresh_latest_ohlcv( @@ -366,14 +367,26 @@ class TestCCXTExchange: hour1 = timeframe_to_prev_date(timeframe_ff, this_hour - timedelta(minutes=1)) hour2 = timeframe_to_prev_date(timeframe_ff, hour1 - timedelta(minutes=1)) hour3 = timeframe_to_prev_date(timeframe_ff, hour2 - timedelta(minutes=1)) - val0 = rate[rate["date"] == this_hour].iloc[0]["open"] - val1 = rate[rate["date"] == hour1].iloc[0]["open"] - val2 = rate[rate["date"] == hour2].iloc[0]["open"] - val3 = rate[rate["date"] == hour3].iloc[0]["open"] + # Alternative 8h timeframe - funding fee timeframe is not stable. + h8_this_hour = timeframe_to_prev_date(timeframe_ff_8h) + h8_hour1 = timeframe_to_prev_date(timeframe_ff_8h, h8_this_hour - timedelta(minutes=1)) + h8_hour2 = timeframe_to_prev_date(timeframe_ff_8h, h8_hour1 - timedelta(minutes=1)) + h8_hour3 = timeframe_to_prev_date(timeframe_ff_8h, h8_hour2 - timedelta(minutes=1)) + row0 = rate.iloc[-1] + row1 = rate.iloc[-2] + row2 = rate.iloc[-3] + row3 = rate.iloc[-4] + + assert row0["date"] == this_hour or row0["date"] == h8_this_hour + assert row1["date"] == hour1 or row1["date"] == h8_hour1 + assert row2["date"] == hour2 or row2["date"] == h8_hour2 + assert row3["date"] == hour3 or row3["date"] == h8_hour3 # Test For last 4 hours # Avoids random test-failure when funding-fees are 0 for a few hours. - assert val0 != 0.0 or val1 != 0.0 or val2 != 0.0 or val3 != 0.0 + assert ( + row0["open"] != 0.0 or row1["open"] != 0.0 or row2["open"] != 0.0 or row3["open"] != 0.0 + ) # We expect funding rates to be different from 0.0 - or moving around. assert ( rate["open"].max() != 0.0 From 732610e200db47f8c77f5333f4488c8d70aa1a06 Mon Sep 17 00:00:00 2001 From: Freqtrade Bot <154552126+freqtrade-bot@users.noreply.github.com> Date: Tue, 9 Dec 2025 03:27:07 +0000 Subject: [PATCH 061/117] chore: update pre-commit hooks --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6ee0b73b2..6e92eaaff 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -44,7 +44,7 @@ repos: - repo: https://github.com/charliermarsh/ruff-pre-commit # Ruff version. - rev: 'v0.14.7' + rev: 'v0.14.8' hooks: - id: ruff - id: ruff-format From 2d3ff2f8ca5919bdd173bf55ead4aa34a56c7e36 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 9 Dec 2025 13:42:59 +0100 Subject: [PATCH 062/117] test: mark-test should use the candle's defined mark price attribute --- tests/exchange_online/test_ccxt_compat.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/exchange_online/test_ccxt_compat.py b/tests/exchange_online/test_ccxt_compat.py index 9789bfea9..d0dc715b9 100644 --- a/tests/exchange_online/test_ccxt_compat.py +++ b/tests/exchange_online/test_ccxt_compat.py @@ -398,7 +398,10 @@ class TestCCXTExchange: exchange, exchangename = exchange_futures pair = EXCHANGES[exchangename].get("futures_pair", EXCHANGES[exchangename]["pair"]) since = int((datetime.now(UTC) - timedelta(days=5)).timestamp() * 1000) - pair_tf = (pair, "1h", CandleType.MARK) + candle_type = CandleType.from_string( + exchange.get_option("mark_ohlcv_price", default=CandleType.MARK) + ) + pair_tf = (pair, "1h", candle_type) mark_ohlcv = exchange.refresh_latest_ohlcv([pair_tf], since_ms=since, drop_incomplete=False) From 645a9159e4085ba87884eccaa011627b4401fdc2 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 9 Dec 2025 13:43:49 +0100 Subject: [PATCH 063/117] chore: hyperliquid doesn't have mark candles it uses regular futures candles as multiplicator for funding fees. --- freqtrade/exchange/hyperliquid.py | 1 + 1 file changed, 1 insertion(+) diff --git a/freqtrade/exchange/hyperliquid.py b/freqtrade/exchange/hyperliquid.py index c72b79755..f5e6fb7ee 100644 --- a/freqtrade/exchange/hyperliquid.py +++ b/freqtrade/exchange/hyperliquid.py @@ -39,6 +39,7 @@ class Hyperliquid(Exchange): "stop_price_prop": "stopPrice", "funding_fee_candle_limit": 500, "uses_leverage_tiers": False, + "mark_ohlcv_price": "futures", } _supported_trading_mode_margin_pairs: list[tuple[TradingMode, MarginMode]] = [ From bbafb1dabd8fce8ba018f851a4d93f288a4e794f Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 9 Dec 2025 13:54:05 +0100 Subject: [PATCH 064/117] fix: deduplicate list before downloading This avoids duplicate downloads, for example on hyperliquid, which uses "futures" as mark candle type. --- freqtrade/data/history/history_utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/freqtrade/data/history/history_utils.py b/freqtrade/data/history/history_utils.py index d370a80aa..13b7101cd 100644 --- a/freqtrade/data/history/history_utils.py +++ b/freqtrade/data/history/history_utils.py @@ -407,7 +407,8 @@ def refresh_backtest_ohlcv_data( # All exchanges need FundingRate for futures trading. # The timeframe is aligned to the mark-price timeframe. timeframes_with_candletype.append((tf_funding_rate, CandleType.FUNDING_RATE)) - + # Deduplicate list ... + timeframes_with_candletype = list(dict.fromkeys(timeframes_with_candletype)) logger.debug( "Downloading %s.", ", ".join(f'"{tf} {ct}"' for tf, ct in timeframes_with_candletype) ) From b3a1442a69d13ae0496a4dcf4ca21ec8fd450785 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 9 Dec 2025 18:25:11 +0100 Subject: [PATCH 065/117] feat: allow varying help texts for different subcommands --- freqtrade/commands/arguments.py | 7 ++++++- freqtrade/commands/cli_options.py | 16 +++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/freqtrade/commands/arguments.py b/freqtrade/commands/arguments.py index d6b326050..3ccb854b3 100755 --- a/freqtrade/commands/arguments.py +++ b/freqtrade/commands/arguments.py @@ -3,6 +3,7 @@ This module contains the argument manager class """ from argparse import ArgumentParser, Namespace, _ArgumentGroup +from copy import deepcopy from functools import partial from pathlib import Path from typing import Any @@ -349,7 +350,11 @@ class Arguments: def _build_args(self, optionlist: list[str], parser: ArgumentParser | _ArgumentGroup) -> None: for val in optionlist: opt = AVAILABLE_CLI_OPTIONS[val] - parser.add_argument(*opt.cli, dest=val, **opt.kwargs) + options = deepcopy(opt.kwargs) + help_text = options.pop("help", None) + if opt.fthelp and isinstance(opt.fthelp, dict): + help_text = opt.fthelp.get(parser.prog, help_text) + parser.add_argument(*opt.cli, dest=val, help=help_text, **options) def _build_subcommands(self) -> None: """ diff --git a/freqtrade/commands/cli_options.py b/freqtrade/commands/cli_options.py index c256c46f3..ebc221523 100755 --- a/freqtrade/commands/cli_options.py +++ b/freqtrade/commands/cli_options.py @@ -38,8 +38,14 @@ def check_int_nonzero(value: str) -> int: class Arg: # Optional CLI arguments - def __init__(self, *args, **kwargs): + def __init__(self, *args, fthelp: dict[str, str] | None = None, **kwargs): + """ + CLI Arguments - used to build subcommand parsers consistently. + :param fthelp: dict - fthelp per command - should be "freqtrade ": help_text + If not provided or not found, 'help' from kwargs is used instead. + """ self.cli = args + self.fthelp = fthelp self.kwargs = kwargs @@ -422,6 +428,14 @@ AVAILABLE_CLI_OPTIONS = { ), "candle_types": Arg( "--candle-types", + fthelp={ + "freqtrade download-data": ( + "Select candle type to download. " + "Defaults to the necessary candles for the selected trading mode " + "(e.g. 'spot' or ('futures', 'funding_rate' and 'mark') for futures)." + ), + "_": "Select candle type to convert. Defaults to all available types.", + }, help="Select candle type to convert. Defaults to all available types.", choices=[c.value for c in CandleType], nargs="+", From f0f48395c5875a2ddf0074a8383871f2d288280f Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 9 Dec 2025 18:25:54 +0100 Subject: [PATCH 066/117] chore: update download-data help text --- docs/commands/download-data.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/commands/download-data.md b/docs/commands/download-data.md index 35f15d19d..dd6474e12 100644 --- a/docs/commands/download-data.md +++ b/docs/commands/download-data.md @@ -11,6 +11,7 @@ usage: freqtrade download-data [-h] [-v] [--no-color] [--logfile FILE] [-V] [--data-format-ohlcv {json,jsongz,feather,parquet}] [--data-format-trades {json,jsongz,feather,parquet}] [--trading-mode {spot,margin,futures}] + [--candle-types {spot,futures,mark,index,premiumIndex,funding_rate} [{spot,futures,mark,index,premiumIndex,funding_rate} ...]] [--prepend] options: @@ -50,6 +51,11 @@ options: `feather`). --trading-mode, --tradingmode {spot,margin,futures} Select Trading mode + --candle-types {spot,futures,mark,index,premiumIndex,funding_rate} [{spot,futures,mark,index,premiumIndex,funding_rate} ...] + Select candle type to download. Defaults to the + necessary candles for the selected trading mode (e.g. + 'spot' or ('futures', 'funding_rate' and 'mark') for + futures). --prepend Allow data prepending. (Data-appending is disabled) Common arguments: From 46538d9a5b347cfc5ef9ea5b5d5b6fb91744c330 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 9 Dec 2025 19:34:58 +0100 Subject: [PATCH 067/117] fix: verify prog actually exists before using it --- freqtrade/commands/arguments.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/commands/arguments.py b/freqtrade/commands/arguments.py index 3ccb854b3..f84822ac8 100755 --- a/freqtrade/commands/arguments.py +++ b/freqtrade/commands/arguments.py @@ -352,7 +352,7 @@ class Arguments: opt = AVAILABLE_CLI_OPTIONS[val] options = deepcopy(opt.kwargs) help_text = options.pop("help", None) - if opt.fthelp and isinstance(opt.fthelp, dict): + if opt.fthelp and isinstance(opt.fthelp, dict) and hasattr(parser, "prog"): help_text = opt.fthelp.get(parser.prog, help_text) parser.add_argument(*opt.cli, dest=val, help=help_text, **options) From 6aeab16ce4cfb7ce9bf6009d75041ae743059e79 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 9 Dec 2025 20:13:10 +0100 Subject: [PATCH 068/117] test: improve candle type verification test --- tests/exchange/test_exchange.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 422b8033f..4a1f4ae5f 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -6646,3 +6646,23 @@ def test_verify_candle_type_support(default_conf, mocker): match=r"Exchange .* does not support fetching premiumindex candles\.", ): exchange.verify_candle_type_support(CandleType.PREMIUMINDEX) + + type(api_mock).has = PropertyMock( + return_value={ + "fetchFundingRateHistory": False, + "fetchIndexOHLCV": False, + "fetchMarkOHLCV": False, + "fetchPremiumIndexOHLCV": True, + } + ) + for candle_type in [ + CandleType.FUNDING_RATE, + CandleType.INDEX, + CandleType.MARK, + ]: + with pytest.raises( + OperationalException, + match=rf"Exchange .* does not support fetching {candle_type.value} candles\.", + ): + exchange.verify_candle_type_support(candle_type) + exchange.verify_candle_type_support(CandleType.PREMIUMINDEX) From d15d08a2d5c9c54b2082c738ddf28a295b0a59b9 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 9 Dec 2025 20:18:12 +0100 Subject: [PATCH 069/117] test: Improve refresh_backtest test --- tests/data/test_history.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/data/test_history.py b/tests/data/test_history.py index 3051a4140..59606d485 100644 --- a/tests/data/test_history.py +++ b/tests/data/test_history.py @@ -546,6 +546,7 @@ def test_refresh_backtest_ohlcv_data( ): caplog.set_level(logging.DEBUG) dl_mock = mocker.patch("freqtrade.data.history.history_utils._download_pair_history") + mocker.patch(f"{EXMS}.verify_candle_type_support", MagicMock()) def parallel_mock(pairs, timeframe, candle_type, **kwargs): return {(pair, timeframe, candle_type): DataFrame() for pair in pairs} @@ -600,6 +601,24 @@ def test_refresh_backtest_ohlcv_data( ) assert parallel_mock.call_count == 0 + if trademode == "futures": + dl_mock.reset_mock() + refresh_backtest_ohlcv_data( + exchange=ex, + pairs=[ + "ETH/BTC", + ], + timeframes=["5m", "1h"], + datadir=testdatadir, + timerange=timerange, + erase=False, + trading_mode=trademode, + no_parallel_download=True, + candle_types=["premiumIndex", "funding_rate"], + ) + assert parallel_mock.call_count == 0 + assert dl_mock.call_count == 3 # 2 timeframes premiumIndex + 1x funding_rate + def test_download_data_no_markets(mocker, default_conf, caplog, testdatadir): dl_mock = mocker.patch( From 23a426085937b84363da9d03c8d3c0b3237bd7bc Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 10 Dec 2025 17:23:01 +0100 Subject: [PATCH 070/117] chore: simplify okx cancel stoploss method --- freqtrade/exchange/okx.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index c8c1130e5..51c112010 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -266,14 +266,7 @@ class Okx(Exchange): return order["id"] def cancel_stoploss_order(self, order_id: str, pair: str, params: dict | None = None) -> dict: - params1 = {"stop": True} - # 'ordType': 'conditional' - # - return self.cancel_order( - order_id=order_id, - pair=pair, - params=params1, - ) + return self.cancel_order(order_id=order_id, pair=pair, params={"stop": True}) def _fetch_orders_emulate(self, pair: str, since_ms: int) -> list[CcxtOrder]: orders = [] From 4c3d9b8c70d2310a96fb6ffb9d88f8c39ff10b17 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 10 Dec 2025 19:28:19 +0100 Subject: [PATCH 071/117] test: simplify some stoploss test setups --- tests/exchange/test_exchange.py | 18 ++--- tests/freqtradebot/test_integration.py | 9 ++- .../freqtradebot/test_stoploss_on_exchange.py | 69 ++++++++++++------- tests/rpc/test_rpc.py | 15 ++-- tests/rpc/test_rpc_apiserver.py | 3 +- 5 files changed, 69 insertions(+), 45 deletions(-) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 8d7e0b0d8..8c01500fb 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -3901,37 +3901,29 @@ def test_cancel_stoploss_order(default_conf, mocker, exchange_name): @pytest.mark.parametrize("exchange_name", EXCHANGES) def test_cancel_stoploss_order_with_result(default_conf, mocker, exchange_name): default_conf["dry_run"] = False - mock_prefix = "freqtrade.exchange.gate.Gate" - if exchange_name == "okx": - mock_prefix = "freqtrade.exchange.okx.Okx" - mocker.patch(f"{EXMS}.fetch_stoploss_order", return_value={"for": 123}) - mocker.patch(f"{mock_prefix}.fetch_stoploss_order", return_value={"for": 123}) exchange = get_patched_exchange(mocker, default_conf, exchange=exchange_name) + mocker.patch.object(exchange, "fetch_stoploss_order", return_value={"for": 123}) res = {"fee": {}, "status": "canceled", "amount": 1234} - mocker.patch(f"{EXMS}.cancel_stoploss_order", return_value=res) - mocker.patch(f"{mock_prefix}.cancel_stoploss_order", return_value=res) + mocker.patch.object(exchange, "cancel_stoploss_order", return_value=res) co = exchange.cancel_stoploss_order_with_result(order_id="_", pair="TKN/BTC", amount=555) assert co == res - mocker.patch(f"{EXMS}.cancel_stoploss_order", return_value="canceled") - mocker.patch(f"{mock_prefix}.cancel_stoploss_order", return_value="canceled") + mocker.patch.object(exchange, "cancel_stoploss_order", return_value="canceled") # Fall back to fetch_stoploss_order co = exchange.cancel_stoploss_order_with_result(order_id="_", pair="TKN/BTC", amount=555) assert co == {"for": 123} exc = InvalidOrderException("") - mocker.patch(f"{EXMS}.fetch_stoploss_order", side_effect=exc) - mocker.patch(f"{mock_prefix}.fetch_stoploss_order", side_effect=exc) + mocker.patch.object(exchange, "fetch_stoploss_order", side_effect=exc) co = exchange.cancel_stoploss_order_with_result(order_id="_", pair="TKN/BTC", amount=555) assert co["amount"] == 555 assert co == {"id": "_", "fee": {}, "status": "canceled", "amount": 555, "info": {}} with pytest.raises(InvalidOrderException): exc = InvalidOrderException("Did not find order") - mocker.patch(f"{EXMS}.cancel_stoploss_order", side_effect=exc) - mocker.patch(f"{mock_prefix}.cancel_stoploss_order", side_effect=exc) exchange = get_patched_exchange(mocker, default_conf, exchange=exchange_name) + mocker.patch.object(exchange, "cancel_stoploss_order", side_effect=exc) exchange.cancel_stoploss_order_with_result(order_id="_", pair="TKN/BTC", amount=123) diff --git a/tests/freqtradebot/test_integration.py b/tests/freqtradebot/test_integration.py index 5d3df4c3b..b5520ae42 100644 --- a/tests/freqtradebot/test_integration.py +++ b/tests/freqtradebot/test_integration.py @@ -60,13 +60,10 @@ def test_may_execute_exit_stoploss_on_exchange_multi(default_conf, ticker, fee, cancel_order_mock = MagicMock(side_effect=patch_stoploss) mocker.patch.multiple( EXMS, - create_stoploss=stoploss, fetch_ticker=ticker, get_fee=fee, amount_to_precision=lambda s, x, y: y, price_to_precision=lambda s, x, y: y, - fetch_stoploss_order=stoploss_order_mock, - cancel_stoploss_order_with_result=cancel_order_mock, ) mocker.patch.multiple( @@ -80,6 +77,12 @@ def test_may_execute_exit_stoploss_on_exchange_multi(default_conf, ticker, fee, mocker.patch("freqtrade.wallets.Wallets.check_exit_amount", return_value=True) freqtrade = get_patched_freqtradebot(mocker, default_conf) + mocker.patch.multiple( + freqtrade.exchange, + create_stoploss=stoploss, + fetch_stoploss_order=stoploss_order_mock, + cancel_stoploss_order_with_result=cancel_order_mock, + ) freqtrade.strategy.order_types["stoploss_on_exchange"] = True # Switch ordertype to market to close trade immediately freqtrade.strategy.order_types["exit"] = "market" diff --git a/tests/freqtradebot/test_stoploss_on_exchange.py b/tests/freqtradebot/test_stoploss_on_exchange.py index c71621620..1cfedbf7c 100644 --- a/tests/freqtradebot/test_stoploss_on_exchange.py +++ b/tests/freqtradebot/test_stoploss_on_exchange.py @@ -103,7 +103,7 @@ def test_handle_stoploss_on_exchange( trade.is_open = True hanging_stoploss_order = MagicMock(return_value={"id": "13434334", "status": "open"}) - mocker.patch(f"{EXMS}.fetch_stoploss_order", hanging_stoploss_order) + mocker.patch.object(freqtrade.exchange, "fetch_stoploss_order", hanging_stoploss_order) assert freqtrade.handle_stoploss_on_exchange(trade) is False hanging_stoploss_order.assert_called_once_with("13434334", trade.pair) @@ -116,7 +116,7 @@ def test_handle_stoploss_on_exchange( trade.is_open = True canceled_stoploss_order = MagicMock(return_value={"id": "13434334", "status": "canceled"}) - mocker.patch(f"{EXMS}.fetch_stoploss_order", canceled_stoploss_order) + mocker.patch.object(freqtrade.exchange, "fetch_stoploss_order", canceled_stoploss_order) stoploss.reset_mock() amount_before = trade.amount @@ -149,7 +149,7 @@ def test_handle_stoploss_on_exchange( "amount": enter_order["amount"], } ) - mocker.patch(f"{EXMS}.fetch_stoploss_order", stoploss_order_hit) + mocker.patch.object(freqtrade.exchange, "fetch_stoploss_order", stoploss_order_hit) freqtrade.strategy.order_filled = MagicMock(return_value=None) assert freqtrade.handle_stoploss_on_exchange(trade) is True assert log_has_re(r"STOP_LOSS_LIMIT is hit for Trade\(id=1, .*\)\.", caplog) @@ -158,7 +158,7 @@ def test_handle_stoploss_on_exchange( assert freqtrade.strategy.order_filled.call_count == 1 caplog.clear() - mocker.patch(f"{EXMS}.create_stoploss", side_effect=ExchangeError()) + mocker.patch.object(freqtrade.exchange, "create_stoploss", side_effect=ExchangeError()) trade.is_open = True freqtrade.handle_stoploss_on_exchange(trade) assert log_has("Unable to place a stoploss order on exchange.", caplog) @@ -168,8 +168,13 @@ def test_handle_stoploss_on_exchange( # It should try to add stoploss order stop_order_dict.update({"id": "105"}) stoploss.reset_mock() - mocker.patch(f"{EXMS}.fetch_stoploss_order", side_effect=InvalidOrderException()) - mocker.patch(f"{EXMS}.create_stoploss", stoploss) + mocker.patch.multiple( + freqtrade.exchange, + fetch_stoploss_order=MagicMock( + side_effect=InvalidOrderException(), + ), + create_stoploss=stoploss, + ) freqtrade.handle_stoploss_on_exchange(trade) assert len(trade.open_sl_orders) == 1 assert stoploss.call_count == 1 @@ -179,8 +184,7 @@ def test_handle_stoploss_on_exchange( trade.is_open = False trade.open_sl_orders[-1].ft_is_open = False stoploss.reset_mock() - mocker.patch(f"{EXMS}.fetch_order") - mocker.patch(f"{EXMS}.create_stoploss", stoploss) + mocker.patch.multiple(freqtrade.exchange, fetch_order=MagicMock(), create_stoploss=stoploss) assert freqtrade.handle_stoploss_on_exchange(trade) is False assert trade.has_open_sl_orders is False assert stoploss.call_count == 0 @@ -644,8 +648,11 @@ def test_handle_stoploss_on_exchange_trailing( stoploss_order_cancel = deepcopy(stoploss_order_hanging) stoploss_order_cancel["status"] = "canceled" - mocker.patch(f"{EXMS}.fetch_stoploss_order", return_value=stoploss_order_hanging) - mocker.patch(f"{EXMS}.cancel_stoploss_order", return_value=stoploss_order_cancel) + mocker.patch.multiple( + freqtrade.exchange, + fetch_stoploss_order=MagicMock(return_value=stoploss_order_hanging), + cancel_stoploss_order=MagicMock(return_value=stoploss_order_cancel), + ) # stoploss initially at 5% assert freqtrade.handle_trade(trade) is False @@ -671,9 +678,12 @@ def test_handle_stoploss_on_exchange_trailing( return_value={"id": "13434334", "status": "canceled", "fee": {}, "amount": trade.amount} ) stoploss_order_mock = MagicMock(return_value={"id": "so1", "status": "open"}) - mocker.patch(f"{EXMS}.fetch_stoploss_order") - mocker.patch(f"{EXMS}.cancel_stoploss_order", cancel_order_mock) - mocker.patch(f"{EXMS}.create_stoploss", stoploss_order_mock) + mocker.patch.multiple( + freqtrade.exchange, + fetch_stoploss_order=MagicMock(), + cancel_stoploss_order=cancel_order_mock, + create_stoploss=stoploss_order_mock, + ) # stoploss should not be updated as the interval is 60 seconds assert freqtrade.handle_trade(trade) is False @@ -711,8 +721,9 @@ def test_handle_stoploss_on_exchange_trailing( } ), ) - mocker.patch( - f"{EXMS}.cancel_stoploss_order_with_result", + mocker.patch.object( + freqtrade.exchange, + "cancel_stoploss_order_with_result", return_value={"id": "so1", "status": "canceled"}, ) assert len(trade.open_sl_orders) == 1 @@ -786,8 +797,12 @@ def test_handle_stoploss_on_exchange_trailing_error( order_date=dt_now(), ) ) - mocker.patch(f"{EXMS}.cancel_stoploss_order", side_effect=InvalidOrderException()) - mocker.patch(f"{EXMS}.fetch_stoploss_order", return_value=stoploss_order_hanging) + mocker.patch.object( + freqtrade.exchange, "cancel_stoploss_order", side_effect=InvalidOrderException() + ) + mocker.patch.object( + freqtrade.exchange, "fetch_stoploss_order", return_value=stoploss_order_hanging + ) time_machine.shift(timedelta(minutes=50)) freqtrade.handle_trailing_stoploss_on_exchange(trade, stoploss_order_hanging) assert log_has_re(r"Could not cancel stoploss order abcd for pair ETH/USDT.*", caplog) @@ -799,8 +814,8 @@ def test_handle_stoploss_on_exchange_trailing_error( # Fail creating stoploss order caplog.clear() - cancel_mock = mocker.patch(f"{EXMS}.cancel_stoploss_order") - mocker.patch(f"{EXMS}.create_stoploss", side_effect=ExchangeError()) + cancel_mock = mocker.patch.object(freqtrade.exchange, "cancel_stoploss_order") + mocker.patch.object(freqtrade.exchange, "create_stoploss", side_effect=ExchangeError()) time_machine.shift(timedelta(minutes=50)) freqtrade.handle_trailing_stoploss_on_exchange(trade, stoploss_order_hanging) assert cancel_mock.call_count == 2 @@ -932,8 +947,11 @@ def test_handle_stoploss_on_exchange_custom_stop( cancel_order_mock = MagicMock() stoploss_order_mock = MagicMock(return_value={"id": "so1", "status": "open"}) - mocker.patch(f"{EXMS}.cancel_stoploss_order", cancel_order_mock) - mocker.patch(f"{EXMS}.create_stoploss", stoploss_order_mock) + mocker.patch.multiple( + freqtrade.exchange, + cancel_stoploss_order=cancel_order_mock, + create_stoploss=stoploss_order_mock, + ) # stoploss should not be updated as the interval is 60 seconds assert freqtrade.handle_trade(trade) is False @@ -1054,7 +1072,9 @@ def test_execute_trade_exit_sloe_cancel_exception( mocker, default_conf_usdt, ticker_usdt, fee, caplog ) -> None: freqtrade = get_patched_freqtradebot(mocker, default_conf_usdt) - mocker.patch(f"{EXMS}.cancel_stoploss_order", side_effect=InvalidOrderException()) + mocker.patch.object( + freqtrade.exchange, "cancel_stoploss_order", side_effect=InvalidOrderException() + ) mocker.patch("freqtrade.wallets.Wallets.get_free", MagicMock(return_value=300)) create_order_mock = MagicMock( side_effect=[ @@ -1114,12 +1134,15 @@ def test_execute_trade_exit_with_stoploss_on_exchange( get_fee=fee, amount_to_precision=lambda s, x, y: y, price_to_precision=lambda s, x, y: y, + ) + freqtrade = FreqtradeBot(default_conf_usdt) + mocker.patch.multiple( + freqtrade.exchange, create_stoploss=stoploss, cancel_stoploss_order=cancel_order, _dry_is_price_crossed=MagicMock(side_effect=[True, False]), ) - freqtrade = FreqtradeBot(default_conf_usdt) freqtrade.strategy.order_types["stoploss_on_exchange"] = True patch_get_signal(freqtrade, enter_short=is_short, enter_long=not is_short) diff --git a/tests/rpc/test_rpc.py b/tests/rpc/test_rpc.py index 40e2b8266..f288cd0ba 100644 --- a/tests/rpc/test_rpc.py +++ b/tests/rpc/test_rpc.py @@ -386,11 +386,14 @@ def test_rpc_delete_trade(mocker, default_conf, fee, markets, caplog, is_short): mocker.patch.multiple( EXMS, markets=PropertyMock(return_value=markets), - cancel_order=cancel_mock, - cancel_stoploss_order=stoploss_mock, ) freqtradebot = get_patched_freqtradebot(mocker, default_conf) + mocker.patch.multiple( + freqtradebot.exchange, + cancel_order=cancel_mock, + cancel_stoploss_order=stoploss_mock, + ) freqtradebot.strategy.order_types["stoploss_on_exchange"] = True create_mock_trades(fee, is_short) rpc = RPC(freqtradebot) @@ -426,13 +429,17 @@ def test_rpc_delete_trade(mocker, default_conf, fee, markets, caplog, is_short): assert stoploss_mock.call_count == 1 assert res["cancel_order_count"] == 1 - stoploss_mock = mocker.patch(f"{EXMS}.cancel_stoploss_order", side_effect=InvalidOrderException) + stoploss_mock = mocker.patch.object( + freqtradebot.exchange, "cancel_stoploss_order", side_effect=InvalidOrderException + ) res = rpc._rpc_delete("3") assert stoploss_mock.call_count == 1 stoploss_mock.reset_mock() - cancel_mock = mocker.patch(f"{EXMS}.cancel_order", side_effect=InvalidOrderException) + cancel_mock = mocker.patch.object( + freqtradebot.exchange, "cancel_order", side_effect=InvalidOrderException + ) res = rpc._rpc_delete("4") assert cancel_mock.call_count == 1 diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index aa5483e88..edfb4ff75 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -1034,8 +1034,7 @@ def test_api_delete_trade(botclient, mocker, fee, markets, is_short): stoploss_mock = MagicMock() cancel_mock = MagicMock() mocker.patch.multiple( - EXMS, - markets=PropertyMock(return_value=markets), + ftbot.exchange, cancel_order=cancel_mock, cancel_stoploss_order=stoploss_mock, ) From 6d017c9a6ce4fc05fedf794a2a3946c6a8242a48 Mon Sep 17 00:00:00 2001 From: Freqtrade Bot <154552126+freqtrade-bot@users.noreply.github.com> Date: Thu, 11 Dec 2025 03:29:24 +0000 Subject: [PATCH 072/117] chore: update pre-commit hooks --- .../exchange/binance_leverage_tiers.json | 3328 +++++++---------- 1 file changed, 1429 insertions(+), 1899 deletions(-) diff --git a/freqtrade/exchange/binance_leverage_tiers.json b/freqtrade/exchange/binance_leverage_tiers.json index e0e983fc8..e5bf4695d 100644 --- a/freqtrade/exchange/binance_leverage_tiers.json +++ b/freqtrade/exchange/binance_leverage_tiers.json @@ -2415,15 +2415,15 @@ "symbol": "1000WHY/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -2431,55 +2431,21 @@ "tier": 2.0, "symbol": "1000WHY/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, - "info": { - "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "symbol": "1000WHY/USDT:USDT", - "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, - "info": { - "bracket": "3", - "initialLeverage": "6", - "notionalCap": "25000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" - } - }, - { - "tier": 4.0, - "symbol": "1000WHY/USDT:USDT", - "currency": "USDT", - "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "25000", + "notionalFloor": "10000", "maintMarginRatio": "0.1", - "cum": "1525.0" + "cum": "500.0" } }, { - "tier": 5.0, + "tier": 3.0, "symbol": "1000WHY/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, @@ -2487,16 +2453,16 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "4", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2775.0" + "cum": "1750.0" } }, { - "tier": 6.0, + "tier": 4.0, "symbol": "1000WHY/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, @@ -2504,46 +2470,46 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "3", "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "6945.0" + "cum": "5920.0" } }, { - "tier": 7.0, + "tier": 5.0, "symbol": "1000WHY/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", - "notionalCap": "500000", + "notionalCap": "2500000", "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "27770.0" + "cum": "26745.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "1000WHY/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 800000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "800000", - "notionalFloor": "500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "152770.0" + "cum": "651745.0" } } ], @@ -3466,15 +3432,15 @@ "symbol": "42/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -3482,119 +3448,85 @@ "tier": 2.0, "symbol": "42/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "42/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "6", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "1750.0" } }, { "tier": 4.0, "symbol": "42/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "20000", - "maintMarginRatio": "0.1", - "cum": "1300.0" + "initialLeverage": "3", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "5920.0" } }, { "tier": 5.0, "symbol": "42/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2550.0" + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.25", + "cum": "26745.0" } }, { "tier": 6.0, "symbol": "42/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "12975.0" - } - }, - { - "tier": 7.0, - "symbol": "42/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "54625.0" - } - }, - { - "tier": 8.0, - "symbol": "42/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "651745.0" } } ], @@ -4553,10 +4485,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 40.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "40", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -5912,15 +5844,15 @@ "symbol": "AGT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -5928,119 +5860,85 @@ "tier": 2.0, "symbol": "AGT/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "AGT/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "6", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "1750.0" } }, { "tier": 4.0, "symbol": "AGT/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "20000", - "maintMarginRatio": "0.1", - "cum": "1300.0" + "initialLeverage": "3", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "5920.0" } }, { "tier": 5.0, "symbol": "AGT/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2550.0" + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.25", + "cum": "26745.0" } }, { "tier": 6.0, "symbol": "AGT/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "12975.0" - } - }, - { - "tier": 7.0, - "symbol": "AGT/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "54625.0" - } - }, - { - "tier": 8.0, - "symbol": "AGT/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "651745.0" } } ], @@ -7033,15 +6931,15 @@ "symbol": "AKE/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -7049,119 +6947,85 @@ "tier": 2.0, "symbol": "AKE/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "AKE/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "6", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "1750.0" } }, { "tier": 4.0, "symbol": "AKE/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "20000", - "maintMarginRatio": "0.1", - "cum": "1300.0" + "initialLeverage": "3", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "5920.0" } }, { "tier": 5.0, "symbol": "AKE/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2550.0" + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.25", + "cum": "26745.0" } }, { "tier": 6.0, "symbol": "AKE/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "12975.0" - } - }, - { - "tier": 7.0, - "symbol": "AKE/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "54625.0" - } - }, - { - "tier": 8.0, - "symbol": "AKE/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "651745.0" } } ], @@ -16078,15 +15942,15 @@ "symbol": "BDXN/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -16094,55 +15958,21 @@ "tier": 2.0, "symbol": "BDXN/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, - "info": { - "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "symbol": "BDXN/USDT:USDT", - "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, - "info": { - "bracket": "3", - "initialLeverage": "6", - "notionalCap": "25000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" - } - }, - { - "tier": 4.0, - "symbol": "BDXN/USDT:USDT", - "currency": "USDT", - "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "25000", + "notionalFloor": "10000", "maintMarginRatio": "0.1", - "cum": "1525.0" + "cum": "500.0" } }, { - "tier": 5.0, + "tier": 3.0, "symbol": "BDXN/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, @@ -16150,16 +15980,16 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "4", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2775.0" + "cum": "1750.0" } }, { - "tier": 6.0, + "tier": 4.0, "symbol": "BDXN/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, @@ -16167,16 +15997,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "3", "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "6945.0" + "cum": "5920.0" } }, { - "tier": 7.0, + "tier": 5.0, "symbol": "BDXN/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -16184,16 +16014,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", "notionalCap": "2500000", "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "27770.0" + "cum": "26745.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "BDXN/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, @@ -16201,12 +16031,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", "notionalCap": "5000000", "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "652770.0" + "cum": "651745.0" } } ], @@ -17008,15 +16838,15 @@ "symbol": "BID/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -17024,55 +16854,21 @@ "tier": 2.0, "symbol": "BID/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, - "info": { - "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "symbol": "BID/USDT:USDT", - "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, - "info": { - "bracket": "3", - "initialLeverage": "6", - "notionalCap": "25000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" - } - }, - { - "tier": 4.0, - "symbol": "BID/USDT:USDT", - "currency": "USDT", - "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "25000", + "notionalFloor": "10000", "maintMarginRatio": "0.1", - "cum": "1525.0" + "cum": "500.0" } }, { - "tier": 5.0, + "tier": 3.0, "symbol": "BID/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, @@ -17080,16 +16876,16 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "4", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2775.0" + "cum": "1750.0" } }, { - "tier": 6.0, + "tier": 4.0, "symbol": "BID/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, @@ -17097,16 +16893,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "3", "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "6945.0" + "cum": "5920.0" } }, { - "tier": 7.0, + "tier": 5.0, "symbol": "BID/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -17114,16 +16910,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", "notionalCap": "2500000", "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "27770.0" + "cum": "26745.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "BID/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, @@ -17131,12 +16927,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", "notionalCap": "5000000", "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "652770.0" + "cum": "651745.0" } } ], @@ -19989,15 +19785,15 @@ "symbol": "BROCCOLIF3B/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -20005,55 +19801,21 @@ "tier": 2.0, "symbol": "BROCCOLIF3B/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, - "info": { - "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "symbol": "BROCCOLIF3B/USDT:USDT", - "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, - "info": { - "bracket": "3", - "initialLeverage": "6", - "notionalCap": "25000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" - } - }, - { - "tier": 4.0, - "symbol": "BROCCOLIF3B/USDT:USDT", - "currency": "USDT", - "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "25000", + "notionalFloor": "10000", "maintMarginRatio": "0.1", - "cum": "1525.0" + "cum": "500.0" } }, { - "tier": 5.0, + "tier": 3.0, "symbol": "BROCCOLIF3B/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, @@ -20061,16 +19823,16 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "4", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2775.0" + "cum": "1750.0" } }, { - "tier": 6.0, + "tier": 4.0, "symbol": "BROCCOLIF3B/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, @@ -20078,16 +19840,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "3", "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "6945.0" + "cum": "5920.0" } }, { - "tier": 7.0, + "tier": 5.0, "symbol": "BROCCOLIF3B/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -20095,16 +19857,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", "notionalCap": "2500000", "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "27770.0" + "cum": "26745.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "BROCCOLIF3B/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, @@ -20112,12 +19874,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", "notionalCap": "5000000", "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "652770.0" + "cum": "651745.0" } } ], @@ -21299,15 +21061,15 @@ "symbol": "BTR/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -21315,119 +21077,85 @@ "tier": 2.0, "symbol": "BTR/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "BTR/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "6", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "1750.0" } }, { "tier": 4.0, "symbol": "BTR/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "20000", - "maintMarginRatio": "0.1", - "cum": "1300.0" + "initialLeverage": "3", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "5920.0" } }, { "tier": 5.0, "symbol": "BTR/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2550.0" + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.25", + "cum": "26745.0" } }, { "tier": 6.0, "symbol": "BTR/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "12975.0" - } - }, - { - "tier": 7.0, - "symbol": "BTR/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "54625.0" - } - }, - { - "tier": 8.0, - "symbol": "BTR/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "651745.0" } } ], @@ -21437,15 +21165,15 @@ "symbol": "BULLA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -21453,119 +21181,85 @@ "tier": 2.0, "symbol": "BULLA/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "BULLA/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "6", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "1750.0" } }, { "tier": 4.0, "symbol": "BULLA/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "20000", - "maintMarginRatio": "0.1", - "cum": "1300.0" + "initialLeverage": "3", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "5920.0" } }, { "tier": 5.0, "symbol": "BULLA/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2550.0" + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.25", + "cum": "26745.0" } }, { "tier": 6.0, "symbol": "BULLA/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "12975.0" - } - }, - { - "tier": 7.0, - "symbol": "BULLA/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "54625.0" - } - }, - { - "tier": 8.0, - "symbol": "BULLA/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "651745.0" } } ], @@ -23331,15 +23025,15 @@ "symbol": "CHESS/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -23347,55 +23041,21 @@ "tier": 2.0, "symbol": "CHESS/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, - "info": { - "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "symbol": "CHESS/USDT:USDT", - "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, - "info": { - "bracket": "3", - "initialLeverage": "6", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" - } - }, - { - "tier": 4.0, - "symbol": "CHESS/USDT:USDT", - "currency": "USDT", - "minNotional": 20000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "10000", "maintMarginRatio": "0.1", - "cum": "1275.0" + "cum": "500.0" } }, { - "tier": 5.0, + "tier": 3.0, "symbol": "CHESS/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, @@ -23403,16 +23063,16 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "4", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2525.0" + "cum": "1750.0" } }, { - "tier": 6.0, + "tier": 4.0, "symbol": "CHESS/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, @@ -23420,16 +23080,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "3", "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "6695.0" + "cum": "5920.0" } }, { - "tier": 7.0, + "tier": 5.0, "symbol": "CHESS/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -23437,16 +23097,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", "notionalCap": "2500000", "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "27520.0" + "cum": "26745.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "CHESS/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, @@ -23454,12 +23114,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", "notionalCap": "5000000", "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "652520.0" + "cum": "651745.0" } } ], @@ -25038,15 +24698,15 @@ "symbol": "COS/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -25054,55 +24714,21 @@ "tier": 2.0, "symbol": "COS/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, - "info": { - "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "symbol": "COS/USDT:USDT", - "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, - "info": { - "bracket": "3", - "initialLeverage": "6", - "notionalCap": "25000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" - } - }, - { - "tier": 4.0, - "symbol": "COS/USDT:USDT", - "currency": "USDT", - "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "25000", + "notionalFloor": "10000", "maintMarginRatio": "0.1", - "cum": "1525.0" + "cum": "500.0" } }, { - "tier": 5.0, + "tier": 3.0, "symbol": "COS/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, @@ -25110,16 +24736,16 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "4", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2775.0" + "cum": "1750.0" } }, { - "tier": 6.0, + "tier": 4.0, "symbol": "COS/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, @@ -25127,16 +24753,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "3", "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "6945.0" + "cum": "5920.0" } }, { - "tier": 7.0, + "tier": 5.0, "symbol": "COS/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -25144,16 +24770,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", "notionalCap": "2500000", "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "27770.0" + "cum": "26745.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "COS/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, @@ -25161,12 +24787,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", "notionalCap": "5000000", "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "652770.0" + "cum": "651745.0" } } ], @@ -26227,15 +25853,15 @@ "symbol": "CUDIS/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -26243,119 +25869,85 @@ "tier": 2.0, "symbol": "CUDIS/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "CUDIS/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "6", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "1750.0" } }, { "tier": 4.0, "symbol": "CUDIS/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "20000", - "maintMarginRatio": "0.1", - "cum": "1300.0" + "initialLeverage": "3", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "5920.0" } }, { "tier": 5.0, "symbol": "CUDIS/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2550.0" + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.25", + "cum": "26745.0" } }, { "tier": 6.0, "symbol": "CUDIS/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "12975.0" - } - }, - { - "tier": 7.0, - "symbol": "CUDIS/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "54625.0" - } - }, - { - "tier": 8.0, - "symbol": "CUDIS/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "651745.0" } } ], @@ -26968,15 +26560,15 @@ "symbol": "DAM/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -26984,119 +26576,85 @@ "tier": 2.0, "symbol": "DAM/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "DAM/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "6", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "1750.0" } }, { "tier": 4.0, "symbol": "DAM/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "20000", - "maintMarginRatio": "0.1", - "cum": "1300.0" + "initialLeverage": "3", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "5920.0" } }, { "tier": 5.0, "symbol": "DAM/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2550.0" + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.25", + "cum": "26745.0" } }, { "tier": 6.0, "symbol": "DAM/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "12975.0" - } - }, - { - "tier": 7.0, - "symbol": "DAM/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "54625.0" - } - }, - { - "tier": 8.0, - "symbol": "DAM/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "651745.0" } } ], @@ -28692,15 +28250,15 @@ "symbol": "DMC/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -28708,55 +28266,21 @@ "tier": 2.0, "symbol": "DMC/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, - "info": { - "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "symbol": "DMC/USDT:USDT", - "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, - "info": { - "bracket": "3", - "initialLeverage": "6", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" - } - }, - { - "tier": 4.0, - "symbol": "DMC/USDT:USDT", - "currency": "USDT", - "minNotional": 20000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "10000", "maintMarginRatio": "0.1", - "cum": "1275.0" + "cum": "500.0" } }, { - "tier": 5.0, + "tier": 3.0, "symbol": "DMC/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, @@ -28764,16 +28288,16 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "4", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2525.0" + "cum": "1750.0" } }, { - "tier": 6.0, + "tier": 4.0, "symbol": "DMC/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, @@ -28781,16 +28305,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "3", "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "6695.0" + "cum": "5920.0" } }, { - "tier": 7.0, + "tier": 5.0, "symbol": "DMC/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -28798,16 +28322,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", "notionalCap": "2500000", "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "27520.0" + "cum": "26745.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "DMC/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, @@ -28815,12 +28339,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", "notionalCap": "5000000", "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "652520.0" + "cum": "651745.0" } } ], @@ -32187,15 +31711,15 @@ "symbol": "EPT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -32203,55 +31727,21 @@ "tier": 2.0, "symbol": "EPT/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, - "info": { - "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "symbol": "EPT/USDT:USDT", - "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, - "info": { - "bracket": "3", - "initialLeverage": "6", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" - } - }, - { - "tier": 4.0, - "symbol": "EPT/USDT:USDT", - "currency": "USDT", - "minNotional": 20000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "10000", "maintMarginRatio": "0.1", - "cum": "1275.0" + "cum": "500.0" } }, { - "tier": 5.0, + "tier": 3.0, "symbol": "EPT/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, @@ -32259,16 +31749,16 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "4", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2525.0" + "cum": "1750.0" } }, { - "tier": 6.0, + "tier": 4.0, "symbol": "EPT/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, @@ -32276,16 +31766,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "3", "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "6695.0" + "cum": "5920.0" } }, { - "tier": 7.0, + "tier": 5.0, "symbol": "EPT/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -32293,16 +31783,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", "notionalCap": "2500000", "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "27520.0" + "cum": "26745.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "EPT/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, @@ -32310,12 +31800,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", "notionalCap": "5000000", "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "652520.0" + "cum": "651745.0" } } ], @@ -34355,15 +33845,15 @@ "symbol": "EVAA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -34371,119 +33861,85 @@ "tier": 2.0, "symbol": "EVAA/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "EVAA/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "6", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "1750.0" } }, { "tier": 4.0, "symbol": "EVAA/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "20000", - "maintMarginRatio": "0.1", - "cum": "1300.0" + "initialLeverage": "3", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "5920.0" } }, { "tier": 5.0, "symbol": "EVAA/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2550.0" + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.25", + "cum": "26745.0" } }, { "tier": 6.0, "symbol": "EVAA/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "12975.0" - } - }, - { - "tier": 7.0, - "symbol": "EVAA/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "54625.0" - } - }, - { - "tier": 8.0, - "symbol": "EVAA/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "651745.0" } } ], @@ -35164,15 +34620,15 @@ "symbol": "FHE/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -35180,55 +34636,21 @@ "tier": 2.0, "symbol": "FHE/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, - "info": { - "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "symbol": "FHE/USDT:USDT", - "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, - "info": { - "bracket": "3", - "initialLeverage": "6", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" - } - }, - { - "tier": 4.0, - "symbol": "FHE/USDT:USDT", - "currency": "USDT", - "minNotional": 20000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "10000", "maintMarginRatio": "0.1", - "cum": "1275.0" + "cum": "500.0" } }, { - "tier": 5.0, + "tier": 3.0, "symbol": "FHE/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, @@ -35236,16 +34658,16 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "4", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2525.0" + "cum": "1750.0" } }, { - "tier": 6.0, + "tier": 4.0, "symbol": "FHE/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, @@ -35253,16 +34675,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "3", "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "6695.0" + "cum": "5920.0" } }, { - "tier": 7.0, + "tier": 5.0, "symbol": "FHE/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -35270,16 +34692,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", "notionalCap": "2500000", "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "27520.0" + "cum": "26745.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "FHE/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, @@ -35287,12 +34709,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", "notionalCap": "5000000", "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "652520.0" + "cum": "651745.0" } } ], @@ -35784,15 +35206,15 @@ "symbol": "FIO/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -35800,55 +35222,21 @@ "tier": 2.0, "symbol": "FIO/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, - "info": { - "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "symbol": "FIO/USDT:USDT", - "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, - "info": { - "bracket": "3", - "initialLeverage": "6", - "notionalCap": "25000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" - } - }, - { - "tier": 4.0, - "symbol": "FIO/USDT:USDT", - "currency": "USDT", - "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "25000", + "notionalFloor": "10000", "maintMarginRatio": "0.1", - "cum": "1525.0" + "cum": "500.0" } }, { - "tier": 5.0, + "tier": 3.0, "symbol": "FIO/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, @@ -35856,16 +35244,16 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "4", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2775.0" + "cum": "1750.0" } }, { - "tier": 6.0, + "tier": 4.0, "symbol": "FIO/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, @@ -35873,46 +35261,46 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "3", "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "6945.0" + "cum": "5920.0" } }, { - "tier": 7.0, + "tier": 5.0, "symbol": "FIO/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", - "notionalCap": "500000", + "notionalCap": "2500000", "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "27770.0" + "cum": "26745.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "FIO/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 800000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "800000", - "notionalFloor": "500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "152770.0" + "cum": "651745.0" } } ], @@ -35922,15 +35310,15 @@ "symbol": "FIS/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -35938,55 +35326,21 @@ "tier": 2.0, "symbol": "FIS/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, - "info": { - "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "symbol": "FIS/USDT:USDT", - "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, - "info": { - "bracket": "3", - "initialLeverage": "6", - "notionalCap": "25000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" - } - }, - { - "tier": 4.0, - "symbol": "FIS/USDT:USDT", - "currency": "USDT", - "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "25000", + "notionalFloor": "10000", "maintMarginRatio": "0.1", - "cum": "1525.0" + "cum": "500.0" } }, { - "tier": 5.0, + "tier": 3.0, "symbol": "FIS/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, @@ -35994,16 +35348,16 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "4", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2775.0" + "cum": "1750.0" } }, { - "tier": 6.0, + "tier": 4.0, "symbol": "FIS/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, @@ -36011,46 +35365,46 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "3", "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "6945.0" + "cum": "5920.0" } }, { - "tier": 7.0, + "tier": 5.0, "symbol": "FIS/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", - "notionalCap": "500000", + "notionalCap": "2500000", "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "27770.0" + "cum": "26745.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "FIS/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 800000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "800000", - "notionalFloor": "500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "152770.0" + "cum": "651745.0" } } ], @@ -40695,15 +40049,15 @@ "symbol": "HANA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -40711,119 +40065,85 @@ "tier": 2.0, "symbol": "HANA/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "HANA/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "6", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "1750.0" } }, { "tier": 4.0, "symbol": "HANA/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "20000", - "maintMarginRatio": "0.1", - "cum": "1300.0" + "initialLeverage": "3", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "5920.0" } }, { "tier": 5.0, "symbol": "HANA/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2550.0" + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.25", + "cum": "26745.0" } }, { "tier": 6.0, "symbol": "HANA/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "12975.0" - } - }, - { - "tier": 7.0, - "symbol": "HANA/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "54625.0" - } - }, - { - "tier": 8.0, - "symbol": "HANA/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "651745.0" } } ], @@ -49188,15 +48508,15 @@ "symbol": "KOMA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -49204,55 +48524,21 @@ "tier": 2.0, "symbol": "KOMA/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, - "info": { - "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "symbol": "KOMA/USDT:USDT", - "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, - "info": { - "bracket": "3", - "initialLeverage": "6", - "notionalCap": "25000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" - } - }, - { - "tier": 4.0, - "symbol": "KOMA/USDT:USDT", - "currency": "USDT", - "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "25000", + "notionalFloor": "10000", "maintMarginRatio": "0.1", - "cum": "1525.0" + "cum": "500.0" } }, { - "tier": 5.0, + "tier": 3.0, "symbol": "KOMA/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, @@ -49260,16 +48546,16 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "4", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2775.0" + "cum": "1750.0" } }, { - "tier": 6.0, + "tier": 4.0, "symbol": "KOMA/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, @@ -49277,16 +48563,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "3", "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "6945.0" + "cum": "5920.0" } }, { - "tier": 7.0, + "tier": 5.0, "symbol": "KOMA/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -49294,16 +48580,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", "notionalCap": "2500000", "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "27770.0" + "cum": "26745.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "KOMA/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, @@ -49311,12 +48597,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", "notionalCap": "5000000", "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "652770.0" + "cum": "651745.0" } } ], @@ -53943,14 +53229,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.03, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.03", "cum": "0.0" } }, @@ -53960,15 +53246,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "maintMarginRatio": "0.05", + "cum": "100.0" } }, { @@ -53976,50 +53262,50 @@ "symbol": "MAVIA/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "20000", + "initialLeverage": "5", + "notionalCap": "50000", "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" + "maintMarginRatio": "0.1", + "cum": "600.0" } }, { "tier": 4.0, "symbol": "MAVIA/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 50000.0, + "maxNotional": 150000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "20000", - "maintMarginRatio": "0.1", - "cum": "1300.0" + "initialLeverage": "4", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "1850.0" } }, { "tier": 5.0, "symbol": "MAVIA/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, + "minNotional": 150000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "5", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2550.0" + "notionalFloor": "150000", + "maintMarginRatio": "0.1667", + "cum": "8105.0" } }, { @@ -54027,50 +53313,33 @@ "symbol": "MAVIA/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "6", - "initialLeverage": "3", - "notionalCap": "500000", + "initialLeverage": "2", + "notionalCap": "800000", "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "12975.0" + "maintMarginRatio": "0.25", + "cum": "28930.0" } }, { "tier": 7.0, "symbol": "MAVIA/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "54625.0" - } - }, - { - "tier": 8.0, - "symbol": "MAVIA/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 800000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "1000000", + "notionalFloor": "800000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "228930.0" } } ], @@ -59484,6 +58753,144 @@ } } ], + "NIGHT/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "NIGHT/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.015", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "NIGHT/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "NIGHT/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "20000", + "notionalFloor": "10000", + "maintMarginRatio": "0.05", + "cum": "300.0" + } + }, + { + "tier": 4.0, + "symbol": "NIGHT/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" + } + }, + { + "tier": 5.0, + "symbol": "NIGHT/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "2550.0" + } + }, + { + "tier": 6.0, + "symbol": "NIGHT/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "6", + "initialLeverage": "3", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1667", + "cum": "12975.0" + } + }, + { + "tier": 7.0, + "symbol": "NIGHT/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.25", + "cum": "54625.0" + } + }, + { + "tier": 8.0, + "symbol": "NIGHT/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "1929625.0" + } + } + ], "NIL/USDT:USDT": [ { "tier": 1.0, @@ -64089,13 +63496,13 @@ "symbol": "PAXG/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 20000.0, + "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "20000", + "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -64105,136 +63512,170 @@ "tier": 2.0, "symbol": "PAXG/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 200000.0, + "minNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "200000", - "notionalFloor": "20000", + "notionalCap": "10000", + "notionalFloor": "5000", "maintMarginRatio": "0.015", - "cum": "100.0" + "cum": "25.0" } }, { "tier": 3.0, "symbol": "PAXG/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 1000000.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "1000000", - "notionalFloor": "200000", + "notionalCap": "50000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "1100.0" + "cum": "75.0" } }, { "tier": 4.0, "symbol": "PAXG/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "6100.0" + "cum": "325.0" } }, { "tier": 5.0, "symbol": "PAXG/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 100000.0, + "maxNotional": 175000.0, + "maintenanceMarginRate": 0.03333, + "maxLeverage": 15.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "5000000", - "notionalFloor": "2000000", - "maintMarginRatio": "0.05", - "cum": "56100.0" + "initialLeverage": "15", + "notionalCap": "175000", + "notionalFloor": "100000", + "maintMarginRatio": "0.03333", + "cum": "1158.0" } }, { "tier": 6.0, "symbol": "PAXG/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 175000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "6", - "initialLeverage": "5", - "notionalCap": "7500000", - "notionalFloor": "5000000", - "maintMarginRatio": "0.1", - "cum": "306100.0" + "initialLeverage": "10", + "notionalCap": "500000", + "notionalFloor": "175000", + "maintMarginRatio": "0.05", + "cum": "4075.25" } }, { "tier": 7.0, "symbol": "PAXG/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 10000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 500000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "10000000", - "notionalFloor": "7500000", - "maintMarginRatio": "0.125", - "cum": "493600.0" + "initialLeverage": "5", + "notionalCap": "750000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1", + "cum": "29075.25" } }, { "tier": 8.0, "symbol": "PAXG/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 12500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "12500000", - "notionalFloor": "10000000", - "maintMarginRatio": "0.25", - "cum": "1743600.0" + "initialLeverage": "4", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.125", + "cum": "47825.25" } }, { "tier": 9.0, "symbol": "PAXG/USDT:USDT", "currency": "USDT", - "minNotional": 12500000.0, - "maxNotional": 15000000.0, + "minNotional": 1500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "9", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.1667", + "cum": "110375.25" + } + }, + { + "tier": 10.0, + "symbol": "PAXG/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "10", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "485225.25" + } + }, + { + "tier": 11.0, + "symbol": "PAXG/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "11", "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "12500000", + "notionalCap": "12500000", + "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "4868600.0" + "cum": "2360225.25" } } ], @@ -67253,6 +66694,127 @@ } } ], + "POWER/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "POWER/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "1", + "initialLeverage": "20", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.025", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "POWER/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.05", + "cum": "125.0" + } + }, + { + "tier": 3.0, + "symbol": "POWER/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "625.0" + } + }, + { + "tier": 4.0, + "symbol": "POWER/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "4", + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "1875.0" + } + }, + { + "tier": 5.0, + "symbol": "POWER/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "5", + "initialLeverage": "3", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "6045.0" + } + }, + { + "tier": 6.0, + "symbol": "POWER/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.25", + "cum": "26870.0" + } + }, + { + "tier": 7.0, + "symbol": "POWER/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "800000", + "notionalFloor": "500000", + "maintMarginRatio": "0.5", + "cum": "151870.0" + } + } + ], "POWR/USDT:USDT": [ { "tier": 1.0, @@ -68310,15 +67872,15 @@ "symbol": "PUMPBTC/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -68326,55 +67888,21 @@ "tier": 2.0, "symbol": "PUMPBTC/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, - "info": { - "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "symbol": "PUMPBTC/USDT:USDT", - "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, - "info": { - "bracket": "3", - "initialLeverage": "6", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" - } - }, - { - "tier": 4.0, - "symbol": "PUMPBTC/USDT:USDT", - "currency": "USDT", - "minNotional": 20000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "10000", "maintMarginRatio": "0.1", - "cum": "1275.0" + "cum": "500.0" } }, { - "tier": 5.0, + "tier": 3.0, "symbol": "PUMPBTC/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, @@ -68382,16 +67910,16 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "4", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2525.0" + "cum": "1750.0" } }, { - "tier": 6.0, + "tier": 4.0, "symbol": "PUMPBTC/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, @@ -68399,16 +67927,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "3", "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "6695.0" + "cum": "5920.0" } }, { - "tier": 7.0, + "tier": 5.0, "symbol": "PUMPBTC/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -68416,16 +67944,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", "notionalCap": "2500000", "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "27520.0" + "cum": "26745.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "PUMPBTC/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, @@ -68433,12 +67961,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", "notionalCap": "5000000", "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "652520.0" + "cum": "651745.0" } } ], @@ -70465,15 +69993,15 @@ "symbol": "REI/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -70481,55 +70009,21 @@ "tier": 2.0, "symbol": "REI/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, - "info": { - "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "symbol": "REI/USDT:USDT", - "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, - "info": { - "bracket": "3", - "initialLeverage": "6", - "notionalCap": "25000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" - } - }, - { - "tier": 4.0, - "symbol": "REI/USDT:USDT", - "currency": "USDT", - "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "25000", + "notionalFloor": "10000", "maintMarginRatio": "0.1", - "cum": "1525.0" + "cum": "500.0" } }, { - "tier": 5.0, + "tier": 3.0, "symbol": "REI/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, @@ -70537,16 +70031,16 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "4", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2775.0" + "cum": "1750.0" } }, { - "tier": 6.0, + "tier": 4.0, "symbol": "REI/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, @@ -70554,46 +70048,46 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "3", "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "6945.0" + "cum": "5920.0" } }, { - "tier": 7.0, + "tier": 5.0, "symbol": "REI/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", - "notionalCap": "500000", + "notionalCap": "2500000", "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "27770.0" + "cum": "26745.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "REI/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 800000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "800000", - "notionalFloor": "500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "152770.0" + "cum": "651745.0" } } ], @@ -72773,15 +72267,15 @@ "symbol": "RVV/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -72789,55 +72283,21 @@ "tier": 2.0, "symbol": "RVV/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, - "info": { - "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "symbol": "RVV/USDT:USDT", - "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, - "info": { - "bracket": "3", - "initialLeverage": "6", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" - } - }, - { - "tier": 4.0, - "symbol": "RVV/USDT:USDT", - "currency": "USDT", - "minNotional": 20000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "10000", "maintMarginRatio": "0.1", - "cum": "1275.0" + "cum": "500.0" } }, { - "tier": 5.0, + "tier": 3.0, "symbol": "RVV/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, @@ -72845,16 +72305,16 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "4", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2525.0" + "cum": "1750.0" } }, { - "tier": 6.0, + "tier": 4.0, "symbol": "RVV/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, @@ -72862,16 +72322,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "3", "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "6695.0" + "cum": "5920.0" } }, { - "tier": 7.0, + "tier": 5.0, "symbol": "RVV/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -72879,16 +72339,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", "notionalCap": "2500000", "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "27520.0" + "cum": "26745.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "RVV/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, @@ -72896,12 +72356,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", "notionalCap": "5000000", "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "652520.0" + "cum": "651745.0" } } ], @@ -78407,14 +77867,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 40.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "40", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.01", "cum": "0.0" } }, @@ -78424,14 +77884,14 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "50", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.015", "cum": "25.0" } }, @@ -78441,15 +77901,15 @@ "currency": "USDT", "minNotional": 10000.0, "maxNotional": 25000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "25", "notionalCap": "25000", "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" + "maintMarginRatio": "0.02", + "cum": "75.0" } }, { @@ -78458,15 +77918,15 @@ "currency": "USDT", "minNotional": 25000.0, "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "4", - "initialLeverage": "5", + "initialLeverage": "20", "notionalCap": "50000", "notionalFloor": "25000", - "maintMarginRatio": "0.1", - "cum": "1525.0" + "maintMarginRatio": "0.025", + "cum": "200.0" } }, { @@ -78474,33 +77934,33 @@ "symbol": "STABLE/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "100000", + "initialLeverage": "10", + "notionalCap": "125000", "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2775.0" + "maintMarginRatio": "0.05", + "cum": "1450.0" } }, { "tier": 6.0, "symbol": "STABLE/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, + "minNotional": 125000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.167, - "maxLeverage": 3.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "6", - "initialLeverage": "3", + "initialLeverage": "5", "notionalCap": "250000", - "notionalFloor": "100000", - "maintMarginRatio": "0.167", - "cum": "6975.0" + "notionalFloor": "125000", + "maintMarginRatio": "0.1", + "cum": "7700.0" } }, { @@ -78508,33 +77968,67 @@ "symbol": "STABLE/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 2500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "7", - "initialLeverage": "2", - "notionalCap": "2500000", + "initialLeverage": "4", + "notionalCap": "500000", "notionalFloor": "250000", - "maintMarginRatio": "0.25", - "cum": "27725.0" + "maintMarginRatio": "0.125", + "cum": "13950.0" } }, { "tier": 8.0, "symbol": "STABLE/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34800.0" + } + }, + { + "tier": 9.0, + "symbol": "STABLE/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "118100.0" + } + }, + { + "tier": 10.0, + "symbol": "STABLE/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "2500000", + "notionalCap": "12500000", + "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "652725.0" + "cum": "1993100.0" } } ], @@ -82510,15 +82004,15 @@ "symbol": "TANSSI/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -82526,55 +82020,21 @@ "tier": 2.0, "symbol": "TANSSI/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, - "info": { - "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "symbol": "TANSSI/USDT:USDT", - "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, - "info": { - "bracket": "3", - "initialLeverage": "6", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" - } - }, - { - "tier": 4.0, - "symbol": "TANSSI/USDT:USDT", - "currency": "USDT", - "minNotional": 20000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "10000", "maintMarginRatio": "0.1", - "cum": "1275.0" + "cum": "500.0" } }, { - "tier": 5.0, + "tier": 3.0, "symbol": "TANSSI/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, @@ -82582,16 +82042,16 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "4", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2525.0" + "cum": "1750.0" } }, { - "tier": 6.0, + "tier": 4.0, "symbol": "TANSSI/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, @@ -82599,16 +82059,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "3", "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "6695.0" + "cum": "5920.0" } }, { - "tier": 7.0, + "tier": 5.0, "symbol": "TANSSI/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -82616,16 +82076,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", "notionalCap": "2500000", "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "27520.0" + "cum": "26745.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "TANSSI/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, @@ -82633,12 +82093,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", "notionalCap": "5000000", "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "652520.0" + "cum": "651745.0" } } ], @@ -89678,15 +89138,15 @@ "symbol": "VOXEL/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -89694,55 +89154,21 @@ "tier": 2.0, "symbol": "VOXEL/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, - "info": { - "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "symbol": "VOXEL/USDT:USDT", - "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, - "info": { - "bracket": "3", - "initialLeverage": "6", - "notionalCap": "25000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" - } - }, - { - "tier": 4.0, - "symbol": "VOXEL/USDT:USDT", - "currency": "USDT", - "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "25000", + "notionalFloor": "10000", "maintMarginRatio": "0.1", - "cum": "1525.0" + "cum": "500.0" } }, { - "tier": 5.0, + "tier": 3.0, "symbol": "VOXEL/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, @@ -89750,16 +89176,16 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "4", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2775.0" + "cum": "1750.0" } }, { - "tier": 6.0, + "tier": 4.0, "symbol": "VOXEL/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, @@ -89767,46 +89193,46 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "3", "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "6945.0" + "cum": "5920.0" } }, { - "tier": 7.0, + "tier": 5.0, "symbol": "VOXEL/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", - "notionalCap": "500000", + "notionalCap": "2500000", "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "27770.0" + "cum": "26745.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "VOXEL/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 800000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "800000", - "notionalFloor": "500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "152770.0" + "cum": "651745.0" } } ], @@ -90878,6 +90304,144 @@ } } ], + "WET/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "WET/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.015", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "WET/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "WET/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "20000", + "notionalFloor": "10000", + "maintMarginRatio": "0.05", + "cum": "300.0" + } + }, + { + "tier": 4.0, + "symbol": "WET/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" + } + }, + { + "tier": 5.0, + "symbol": "WET/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "2550.0" + } + }, + { + "tier": 6.0, + "symbol": "WET/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "6", + "initialLeverage": "3", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1667", + "cum": "12975.0" + } + }, + { + "tier": 7.0, + "symbol": "WET/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.25", + "cum": "54625.0" + } + }, + { + "tier": 8.0, + "symbol": "WET/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "1929625.0" + } + } + ], "WIF/USDC:USDC": [ { "tier": 1.0, @@ -94139,15 +93703,15 @@ "symbol": "YALA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -94155,119 +93719,85 @@ "tier": 2.0, "symbol": "YALA/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "8", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "YALA/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "6", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "1750.0" } }, { "tier": 4.0, "symbol": "YALA/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "20000", - "maintMarginRatio": "0.1", - "cum": "1300.0" + "initialLeverage": "3", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "5920.0" } }, { "tier": 5.0, "symbol": "YALA/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2550.0" + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.25", + "cum": "26745.0" } }, { "tier": 6.0, "symbol": "YALA/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "12975.0" - } - }, - { - "tier": 7.0, - "symbol": "YALA/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "54625.0" - } - }, - { - "tier": 8.0, - "symbol": "YALA/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "651745.0" } } ], From 878bd7cbc7584097f328e58bf6858bcab7c79fed Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 11 Dec 2025 06:35:27 +0100 Subject: [PATCH 073/117] chore: pin pycares for now --- requirements.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/requirements.txt b/requirements.txt index 6cd25e43b..5da6d5722 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,6 +8,8 @@ ta-lib==0.6.8 technical==1.5.3 ccxt==4.5.26 +# TODO: remove pycares pin must wait until aiodns releases a new version: # https://github.com/aio-libs/aiodns/issues/214 +pycares==4.11.0 cryptography==46.0.3 aiohttp==3.13.2 SQLAlchemy==2.0.44 From 451eef5c99e2e962f142207ebb118ae347b8e9f3 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 11 Dec 2025 06:49:56 +0100 Subject: [PATCH 074/117] test: further test simplifications --- tests/exchange/test_exchange.py | 2 +- .../freqtradebot/test_stoploss_on_exchange.py | 59 +++++++++++-------- 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 8c01500fb..a846cb3e6 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -4108,7 +4108,7 @@ def test_fetch_order_or_stoploss_order(default_conf, mocker): fetch_order_mock = MagicMock() fetch_stoploss_order_mock = MagicMock() mocker.patch.multiple( - EXMS, + exchange, fetch_order=fetch_order_mock, fetch_stoploss_order=fetch_stoploss_order_mock, ) diff --git a/tests/freqtradebot/test_stoploss_on_exchange.py b/tests/freqtradebot/test_stoploss_on_exchange.py index 1cfedbf7c..a3271e4ea 100644 --- a/tests/freqtradebot/test_stoploss_on_exchange.py +++ b/tests/freqtradebot/test_stoploss_on_exchange.py @@ -256,9 +256,12 @@ def test_handle_stoploss_on_exchange_emergency( stoploss = MagicMock(side_effect=InvalidOrderException()) assert trade.has_open_sl_orders is True Trade.commit() - mocker.patch(f"{EXMS}.cancel_stoploss_order_with_result", side_effect=InvalidOrderException()) - mocker.patch(f"{EXMS}.fetch_stoploss_order", stoploss_order_cancelled) - mocker.patch(f"{EXMS}.create_stoploss", stoploss) + mocker.patch.multiple( + freqtrade.exchange, + cancel_stoploss_order_with_result=MagicMock(side_effect=InvalidOrderException()), + fetch_stoploss_order=stoploss_order_cancelled, + create_stoploss=stoploss, + ) assert freqtrade.handle_stoploss_on_exchange(trade) is False assert trade.has_open_sl_orders is False assert trade.is_open is False @@ -315,7 +318,7 @@ def test_handle_stoploss_on_exchange_partial( "amount": enter_order["amount"], } ) - mocker.patch(f"{EXMS}.fetch_stoploss_order", stoploss_order_hit) + mocker.patch.multiple(freqtrade.exchange, fetch_stoploss_order=stoploss_order_hit) assert freqtrade.handle_stoploss_on_exchange(trade) is False # Stoploss filled partially ... assert trade.amount == 15 @@ -387,8 +390,11 @@ def test_handle_stoploss_on_exchange_partial_cancel_here( "amount": enter_order["amount"], } ) - mocker.patch(f"{EXMS}.fetch_stoploss_order", stoploss_order_hit) - mocker.patch(f"{EXMS}.cancel_stoploss_order_with_result", stoploss_order_cancel) + mocker.patch.multiple( + freqtrade.exchange, + fetch_stoploss_order=stoploss_order_hit, + cancel_stoploss_order_with_result=stoploss_order_cancel, + ) time_machine.shift(timedelta(minutes=15)) assert freqtrade.handle_stoploss_on_exchange(trade) is False @@ -412,20 +418,20 @@ def test_handle_sle_cancel_cant_recreate( mocker.patch.multiple( EXMS, fetch_ticker=MagicMock(return_value={"bid": 1.9, "ask": 2.2, "last": 1.9}), + get_fee=fee, + ) + freqtrade = FreqtradeBot(default_conf_usdt) + mocker.patch.multiple( + freqtrade.exchange, create_order=MagicMock( side_effect=[ enter_order, exit_order, ] ), - get_fee=fee, - ) - mocker.patch.multiple( - EXMS, fetch_stoploss_order=MagicMock(return_value={"status": "canceled", "id": "100"}), create_stoploss=MagicMock(side_effect=ExchangeError()), ) - freqtrade = FreqtradeBot(default_conf_usdt) patch_get_signal(freqtrade, enter_short=is_short, enter_long=not is_short) freqtrade.enter_positions() @@ -861,20 +867,9 @@ def test_handle_stoploss_on_exchange_custom_stop( mocker.patch.multiple( EXMS, fetch_ticker=MagicMock(return_value={"bid": 1.9, "ask": 2.2, "last": 1.9}), - create_order=MagicMock( - side_effect=[ - enter_order, - exit_order, - ] - ), get_fee=fee, is_cancel_order_result_suitable=MagicMock(return_value=True), ) - mocker.patch.multiple( - EXMS, - create_stoploss=stoploss, - stoploss_adjust=MagicMock(return_value=True), - ) # enabling TSL default_conf_usdt["use_custom_stoploss"] = True @@ -883,6 +878,17 @@ def test_handle_stoploss_on_exchange_custom_stop( default_conf_usdt["minimal_roi"]["0"] = 999999999 freqtrade = get_patched_freqtradebot(mocker, default_conf_usdt) + mocker.patch.multiple( + freqtrade.exchange, + create_order=MagicMock( + side_effect=[ + enter_order, + exit_order, + ] + ), + create_stoploss=stoploss, + stoploss_adjust=MagicMock(return_value=True), + ) # enabling stoploss on exchange freqtrade.strategy.order_types["stoploss_on_exchange"] = True @@ -927,8 +933,11 @@ def test_handle_stoploss_on_exchange_custom_stop( x["id"] = order_id return x - mocker.patch(f"{EXMS}.fetch_stoploss_order", MagicMock(fetch_stoploss_order_mock)) - mocker.patch(f"{EXMS}.cancel_stoploss_order", return_value=slo_canceled) + mocker.patch.multiple( + freqtrade.exchange, + fetch_stoploss_order=MagicMock(fetch_stoploss_order_mock), + cancel_stoploss_order=MagicMock(return_value=slo_canceled), + ) assert freqtrade.handle_trade(trade) is False assert freqtrade.handle_stoploss_on_exchange(trade) is False @@ -1231,7 +1240,7 @@ def test_may_execute_trade_exit_after_stoploss_on_exchange_hit( "trades": None, } ) - mocker.patch(f"{EXMS}.fetch_stoploss_order", stoploss_executed) + mocker.patch.object(freqtrade.exchange, "fetch_stoploss_order", stoploss_executed) freqtrade.exit_positions(trades) assert trade.has_open_sl_orders is False From d4ced7b4160815ea3c510bb76c8430598142276d Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 11 Dec 2025 07:05:58 +0100 Subject: [PATCH 075/117] docs: improve doc wording --- docs/strategy-callbacks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/strategy-callbacks.md b/docs/strategy-callbacks.md index 727075215..c24857612 100644 --- a/docs/strategy-callbacks.md +++ b/docs/strategy-callbacks.md @@ -644,7 +644,7 @@ Each of these methods are called right before placing an order on the exchange. If your custom pricing function return None or an invalid value, price will fall back to `proposed_rate`, which is based on the regular pricing configuration. !!! Note - Using custom_entry_price, the Trade object will be available as soon as the first entry order associated with the trade is created, for the first entry, `trade` parameter value will be `None`. + When using `custom_entry_price()`, the Trade object will be available as soon as the first entry order associated with the trade is created, for the first entry, `trade` parameter value will be `None`. ### Custom order entry and exit price example From 4c7944ac77997468dfba867671e03e39b5e0d665 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 11 Dec 2025 07:09:23 +0100 Subject: [PATCH 076/117] chore: update comment wording --- freqtrade/freqtradebot.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 09afd8528..eae16c158 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -2101,7 +2101,7 @@ class FreqtradeBot(LoggingMixin): order_type = ordertype or self.strategy.order_types[exit_type] if exit_check.exit_type == ExitType.EMERGENCY_EXIT: - # Emergency sells (default to market!) + # Emergency exits (default to market!) order_type = self.strategy.order_types.get("emergency_exit", "market") amount = self._safe_exit_amount(trade, trade.pair, sub_trade_amt or trade.amount) @@ -2130,7 +2130,7 @@ class FreqtradeBot(LoggingMixin): return False try: - # Execute sell and update trade record + # Execute exit and update trade record order = self.exchange.create_order( pair=trade.pair, ordertype=order_type, @@ -2157,7 +2157,7 @@ class FreqtradeBot(LoggingMixin): trade.exit_reason = exit_reason self._notify_exit(trade, order_type, sub_trade=bool(sub_trade_amt), order=order_obj) - # In case of market sell orders the order can be closed immediately + # In case of market exit orders the order can be closed immediately if order.get("status", "unknown") in ("closed", "expired"): self.update_trade_state(trade, order_obj.order_id, order) Trade.commit() From 12206f028b00fff572b0512495b87d75b0b3081a Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 11 Dec 2025 07:16:28 +0100 Subject: [PATCH 077/117] chore: comment wording improvements --- freqtrade/freqtradebot.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index eae16c158..80de52025 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -2011,14 +2011,14 @@ class FreqtradeBot(LoggingMixin): def _safe_exit_amount(self, trade: Trade, pair: str, amount: float) -> float: """ - Get sellable amount. + Get exitable amount. Should be trade.amount - but will fall back to the available amount if necessary. This should cover cases where get_real_amount() was not able to update the amount for whatever reason. :param trade: Trade we're working with - :param pair: Pair we're trying to sell + :param pair: Pair we're trying to exit :param amount: amount we expect to be available - :return: amount to sell + :return: amount to exit :raise: DependencyException: if available balance is not within 2% of the available amount. """ # Update wallets to ensure amounts tied up in a stoploss is now free! @@ -2058,7 +2058,7 @@ class FreqtradeBot(LoggingMixin): """ Executes a trade exit for the given trade and limit :param trade: Trade instance - :param limit: limit rate for the sell order + :param limit: limit rate for the exit order :param exit_check: CheckTuple with signal and reason :return: True if it succeeds False """ From 97e2e0a405760c9b850c2792281794ce4589a983 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 11 Dec 2025 18:23:58 +0100 Subject: [PATCH 078/117] chore: remove hard-pin of pycares --- requirements.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 5da6d5722..6cd25e43b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,8 +8,6 @@ ta-lib==0.6.8 technical==1.5.3 ccxt==4.5.26 -# TODO: remove pycares pin must wait until aiodns releases a new version: # https://github.com/aio-libs/aiodns/issues/214 -pycares==4.11.0 cryptography==46.0.3 aiohttp==3.13.2 SQLAlchemy==2.0.44 From 93bde7dc4676314a2efcbf4a2087a736462e8758 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 12 Dec 2025 06:52:11 +0100 Subject: [PATCH 079/117] fix: support binance algo orders closes #12610 --- freqtrade/exchange/binance.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/freqtrade/exchange/binance.py b/freqtrade/exchange/binance.py index 7d9c616bb..37c355d4d 100644 --- a/freqtrade/exchange/binance.py +++ b/freqtrade/exchange/binance.py @@ -17,7 +17,7 @@ from freqtrade.exchange.binance_public_data import ( download_archive_trades, ) from freqtrade.exchange.common import retrier -from freqtrade.exchange.exchange_types import FtHas, Tickers +from freqtrade.exchange.exchange_types import CcxtOrder, FtHas, Tickers from freqtrade.exchange.exchange_utils_timeframe import timeframe_to_msecs from freqtrade.misc import deep_merge_dicts, json_load from freqtrade.util import FtTTLCache @@ -145,6 +145,20 @@ class Binance(Exchange): except ccxt.BaseError as e: raise OperationalException(e) from e + def fetch_stoploss_order( + self, order_id: str, pair: str, params: dict | None = None + ) -> CcxtOrder: + if self.trading_mode == TradingMode.FUTURES: + params = params or {} + params.update({"stop": True}) + return self.fetch_order(order_id, pair, params) + + def cancel_stoploss_order(self, order_id: str, pair: str, params: dict | None = None) -> dict: + if self.trading_mode == TradingMode.FUTURES: + params = params or {} + params.update({"stop": True}) + return self.cancel_order(order_id=order_id, pair=pair, params=params) + def get_historic_ohlcv( self, pair: str, From 6d2c30abca93c0f8767ea2e7620b45c73de660a2 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 12 Dec 2025 06:54:29 +0100 Subject: [PATCH 080/117] chore: bump ccxt to 4.5.27 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 6cd25e43b..d2dcb63eb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,7 @@ ft-pandas-ta==0.3.16 ta-lib==0.6.8 technical==1.5.3 -ccxt==4.5.26 +ccxt==4.5.27 cryptography==46.0.3 aiohttp==3.13.2 SQLAlchemy==2.0.44 From 51e0b204b6131d672a1c2688f47f8726abba4a5c Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 13 Dec 2025 18:30:30 +0100 Subject: [PATCH 081/117] docs: improve download data docs --- docs/data-download.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/data-download.md b/docs/data-download.md index c2b104b1b..4339e9862 100644 --- a/docs/data-download.md +++ b/docs/data-download.md @@ -60,6 +60,7 @@ freqtrade download-data --exchange binance --pairs ".*/USDT" * Given starting points are ignored if data is already available, downloading only missing data up to today. * Use `--timeframes` to specify what timeframe download the historical candle (OHLCV) data for. Default is `--timeframes 1m 5m` which will download 1-minute and 5-minute data. * To use exchange, timeframe and list of pairs as defined in your configuration file, use the `-c/--config` option. With this, the script uses the whitelist defined in the config as the list of currency pairs to download data for and does not require the pairs.json file. You can combine `-c/--config` with most other options. +* When downloading futures data (`--trading-mode futures` or a configuration specifying futures mode), freqtrade will automatically download the necessary candle types (e.g. `mark` and `funding_rate` candles) unless specified otherwise via `--candle-types`. ??? Note "Permission denied errors" If your configuration directory `user_data` was made by docker, you may get the following error: From 83b372a32d2a254da308813b34a03f63ef880d7b Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 13 Dec 2025 19:30:21 +0100 Subject: [PATCH 082/117] docs: add "Funding fee adjustment" to deprecated docs --- docs/deprecated.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/docs/deprecated.md b/docs/deprecated.md index f6ef8768f..6af1e0d76 100644 --- a/docs/deprecated.md +++ b/docs/deprecated.md @@ -98,3 +98,33 @@ Please use configuration based [log setup](advanced-setup.md#advanced-logging) i The edge module has been deprecated in 2023.9 and removed in 2025.6. All functionalities of edge have been removed, and having edge configured will result in an error. + +## Adjustment to dynamic funding rate handling + +With version 2025.12, the handling of dynamic funding rates has been adjusted to also support dynamic funding rates down to 1h funding intervals. +As a consequence, the mark and funding rate timeframes have been changed to 1h for every supported futures exchange. + +As the timeframe for both mark and funding_fee candles has changed (usually from 8h to 1h) - already downloaded data will have to be adjusted or partially re-downloaded. +You can either re-download everything (`freqtrade download-data [...] --erase` - :warning: can take a long time) - or download the updated data selectively. + +### Selective data re-download + +The script below should serve as an example - you may need to adjust the timeframe and exchange to your needs! + +``` bash +# Cleanup no longer needed data +rm user_data/data//futures/*-mark-* +rm user_data/data//futures/*-funding_rate-* + +# download new data (only required once to fix the mark and funding fee data) +freqtrade download-data -t 1h --trading-mode futures --candle-types funding_rate mark [...] --timerange + +``` + +The result of the above will be that your funding_rates and mark data will have the 1h timeframe. +you can verify this with `freqtrade list-data --exchange --show`. + +!!! Note "Additional arguments" + Additional arguments to the above commands may be necessary, like configuration files or explicit user_data if they deviate from the default. + +**Hyperliquid** is a special case now - which will no longer require 1h mark data - but will use regular candles instead (this data never existed and is identical to 1h futures candles). As we don't support download-data for hyperliquid (they don't provide historic data) - there won't be actions necessary for hyperliquid users. From 31d3a19836cf5d011d29f9da7f9b60d580e8595b Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 14 Dec 2025 13:49:39 +0100 Subject: [PATCH 083/117] feat: support candle_type parameter via API download --- freqtrade/rpc/api_server/api_download_data.py | 2 ++ freqtrade/rpc/api_server/api_schemas.py | 1 + freqtrade/rpc/api_server/api_v1.py | 3 ++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/freqtrade/rpc/api_server/api_download_data.py b/freqtrade/rpc/api_server/api_download_data.py index 6e446b063..b755474c9 100644 --- a/freqtrade/rpc/api_server/api_download_data.py +++ b/freqtrade/rpc/api_server/api_download_data.py @@ -63,6 +63,8 @@ def pairlists_evaluate( config_loc["timeframes"] = payload.timeframes config_loc["erase"] = payload.erase config_loc["download_trades"] = payload.download_trades + if payload.candle_types is not None: + config_loc["candle_types"] = payload.candle_types handleExchangePayload(payload, config_loc) diff --git a/freqtrade/rpc/api_server/api_schemas.py b/freqtrade/rpc/api_server/api_schemas.py index 21a93807c..51507fb04 100644 --- a/freqtrade/rpc/api_server/api_schemas.py +++ b/freqtrade/rpc/api_server/api_schemas.py @@ -506,6 +506,7 @@ class DownloadDataPayload(ExchangeModePayloadMixin, BaseModel): timerange: str | None = None erase: bool = False download_trades: bool = False + candle_types: list[str] | None = None @model_validator(mode="before") def check_mutually_exclusive(cls, values): diff --git a/freqtrade/rpc/api_server/api_v1.py b/freqtrade/rpc/api_server/api_v1.py index dc9682b09..3d1ec8433 100644 --- a/freqtrade/rpc/api_server/api_v1.py +++ b/freqtrade/rpc/api_server/api_v1.py @@ -91,7 +91,8 @@ logger = logging.getLogger(__name__) # 2.41: Add download-data endpoint # 2.42: Add /pair_history endpoint with live data # 2.43: Add /profit_all endpoint -API_VERSION = 2.43 +# 2.44: Add candle_types parameter to download-data endpoint +API_VERSION = 2.44 # Public API, requires no auth. router_public = APIRouter() From b406219515a964601b5051cbf56d5c81ae9788d6 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 14 Dec 2025 15:51:06 +0100 Subject: [PATCH 084/117] test: add candle_types test --- tests/rpc/test_rpc_apiserver.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index aa5483e88..c4e4978f9 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -3251,6 +3251,7 @@ def test_api_download_data(botclient, mocker, tmp_path): body = { "pairs": ["ETH/BTC", "XRP/BTC"], "timeframes": ["5m"], + "candle_types": ["spot"], } # Fail, already running From bd5630a104977b504053cd2c6b3cffca79d6dcef Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 14 Dec 2025 16:19:37 +0100 Subject: [PATCH 085/117] test: simplify test mock --- tests/exchange/test_exchange.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 4a1f4ae5f..4ec983cdf 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -2388,8 +2388,8 @@ async def test__async_get_historic_ohlcv(default_conf, mocker, caplog, exchange_ 5, # volume (in quote currency) ] ] - mocker.patch(f"{EXMS}.verify_candle_type_support", MagicMock()) exchange = get_patched_exchange(mocker, default_conf, exchange=exchange_name) + mocker.patch.object(exchange, "verify_candle_type_support") # Monkey-patch async function exchange._api_async.fetch_ohlcv = get_mock_coro(ohlcv) @@ -2439,8 +2439,8 @@ def test_refresh_latest_ohlcv(mocker, default_conf_usdt, caplog, candle_type) -> ] caplog.set_level(logging.DEBUG) - mocker.patch(f"{EXMS}.verify_candle_type_support", MagicMock()) exchange = get_patched_exchange(mocker, default_conf_usdt) + mocker.patch.object(exchange, "verify_candle_type_support") exchange._api_async.fetch_ohlcv = get_mock_coro(ohlcv) pairs = [("IOTA/USDT", "5m", candle_type), ("XRP/USDT", "5m", candle_type)] @@ -2690,8 +2690,8 @@ def test_refresh_latest_ohlcv_cache(mocker, default_conf, candle_type, time_mach ohlcv = generate_test_data_raw("1h", 100, start.strftime("%Y-%m-%d")) time_machine.move_to(start + timedelta(hours=99, minutes=30)) - mocker.patch(f"{EXMS}.verify_candle_type_support", MagicMock()) exchange = get_patched_exchange(mocker, default_conf) + mocker.patch.object(exchange, "verify_candle_type_support") exchange._set_startup_candle_count(default_conf) mocker.patch(f"{EXMS}.ohlcv_candle_limit", return_value=100) From 2e3d2763046115e0dee042bb2c7603a229aa1c7c Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 14 Dec 2025 17:13:03 +0100 Subject: [PATCH 086/117] docs: Add strategy docs to migrate funding fees --- docs/deprecated.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/deprecated.md b/docs/deprecated.md index 6af1e0d76..ce3bf3b95 100644 --- a/docs/deprecated.md +++ b/docs/deprecated.md @@ -107,6 +107,13 @@ As a consequence, the mark and funding rate timeframes have been changed to 1h f As the timeframe for both mark and funding_fee candles has changed (usually from 8h to 1h) - already downloaded data will have to be adjusted or partially re-downloaded. You can either re-download everything (`freqtrade download-data [...] --erase` - :warning: can take a long time) - or download the updated data selectively. +### Strategy + +Most strategies should not need adjustments to continue to work as expected - however, strategies using `@informative("8h", candle_type="funding_rate")` or similar will have to switch the timeframe to 1h. +The same is true for `dp.get_pair_dataframe(metadata["pair"], "8h", candle_type="funding_rate")` - which will need to be switched to 1h. + +freqtrade will auto-adjust the timeframe and return `funding_rates` despite the wrongly given timeframe. It'll issue a warning - and may still break your strategy. + ### Selective data re-download The script below should serve as an example - you may need to adjust the timeframe and exchange to your needs! From 0ed3bdc747839465c9ebd7e9f65e3dc9b1d2f200 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 12 Dec 2025 06:23:55 +0100 Subject: [PATCH 087/117] test: add test for force exit API logic --- tests/rpc/test_rpc_apiserver.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index beb772712..768858aac 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -1852,9 +1852,35 @@ def test_api_forceexit(botclient, mocker, ticker, fee, markets): Trade.rollback() trade = Trade.get_trades([Trade.id == 5]).first() + last_order = trade.orders[-1] + + assert last_order.side == "sell" + assert last_order.status == "closed" + assert last_order.order_type == "market" + assert last_order.amount == 23 assert pytest.approx(trade.amount) == 100 assert trade.is_open is True + # Test with explicit price + rc = client_post( + client, + f"{BASE_URI}/forceexit", + data={"tradeid": "5", "ordertype": "limit", "amount": 25, "price": 0.12345}, + ) + assert_response(rc) + assert rc.json() == {"result": "Created exit order for trade 5."} + Trade.rollback() + + trade = Trade.get_trades([Trade.id == 5]).first() + last_order = trade.orders[-1] + assert last_order.status == "closed" + assert last_order.order_type == "limit" + assert pytest.approx(last_order.safe_price) == 0.12345 + assert pytest.approx(last_order.amount) == 25 + + assert pytest.approx(trade.amount) == 75 + assert trade.is_open is True + rc = client_post(client, f"{BASE_URI}/forceexit", data={"tradeid": "5"}) assert_response(rc) assert rc.json() == {"result": "Created exit order for trade 5."} From bac6219cc13b46a1482df104931cb2afa9a929f5 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 12 Dec 2025 06:24:21 +0100 Subject: [PATCH 088/117] feat: add price to force-exit --- freqtrade/rpc/api_server/api_schemas.py | 1 + freqtrade/rpc/api_server/api_v1.py | 7 +++++-- freqtrade/rpc/rpc.py | 26 +++++++++++++++++++------ 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/freqtrade/rpc/api_server/api_schemas.py b/freqtrade/rpc/api_server/api_schemas.py index 51507fb04..0dcd95edf 100644 --- a/freqtrade/rpc/api_server/api_schemas.py +++ b/freqtrade/rpc/api_server/api_schemas.py @@ -426,6 +426,7 @@ class ForceExitPayload(BaseModel): tradeid: str | int ordertype: OrderTypeValues | None = None amount: float | None = None + price: float | None = None class BlacklistPayload(BaseModel): diff --git a/freqtrade/rpc/api_server/api_v1.py b/freqtrade/rpc/api_server/api_v1.py index 3d1ec8433..39c8e9821 100644 --- a/freqtrade/rpc/api_server/api_v1.py +++ b/freqtrade/rpc/api_server/api_v1.py @@ -92,7 +92,8 @@ logger = logging.getLogger(__name__) # 2.42: Add /pair_history endpoint with live data # 2.43: Add /profit_all endpoint # 2.44: Add candle_types parameter to download-data endpoint -API_VERSION = 2.44 +# 2.45: Add price to forceexit endpoint +API_VERSION = 2.45 # Public API, requires no auth. router_public = APIRouter() @@ -325,7 +326,9 @@ def force_entry(payload: ForceEnterPayload, rpc: RPC = Depends(get_rpc)): @router.post("/forcesell", response_model=ResultMsg, tags=["trading"]) def forceexit(payload: ForceExitPayload, rpc: RPC = Depends(get_rpc)): ordertype = payload.ordertype.value if payload.ordertype else None - return rpc._rpc_force_exit(str(payload.tradeid), ordertype, amount=payload.amount) + return rpc._rpc_force_exit( + str(payload.tradeid), ordertype, amount=payload.amount, price=payload.price + ) @router.get("/blacklist", response_model=BlacklistResponse, tags=["info", "pairlist"]) diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index 22e457eef..b7630c47b 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -940,7 +940,11 @@ class RPC: return {"status": "Reloaded from orders from exchange"} def __exec_force_exit( - self, trade: Trade, ordertype: str | None, amount: float | None = None + self, + trade: Trade, + ordertype: str | None, + amount: float | None = None, + price: float | None = None, ) -> bool: # Check if there is there are open orders trade_entry_cancelation_registry = [] @@ -964,8 +968,13 @@ class RPC: # Order cancellation failed, so we can't exit. return False # Get current rate and execute sell - current_rate = self._freqtrade.exchange.get_rate( - trade.pair, side="exit", is_short=trade.is_short, refresh=True + + current_rate = ( + self._freqtrade.exchange.get_rate( + trade.pair, side="exit", is_short=trade.is_short, refresh=True + ) + if ordertype == "market" or price is None + else price ) exit_check = ExitCheckTuple(exit_type=ExitType.FORCE_EXIT) order_type = ordertype or self._freqtrade.strategy.order_types.get( @@ -990,11 +999,16 @@ class RPC: return False def _rpc_force_exit( - self, trade_id: str, ordertype: str | None = None, *, amount: float | None = None + self, + trade_id: str, + ordertype: str | None = None, + *, + amount: float | None = None, + price: float | None = None, ) -> dict[str, str]: """ Handler for forceexit . - Sells the given trade at current price + exts the given trade. Uses current price if price is None. """ if self._freqtrade.state == State.STOPPED: @@ -1024,7 +1038,7 @@ class RPC: logger.warning("force_exit: Invalid argument received") raise RPCException("invalid argument") - result = self.__exec_force_exit(trade, ordertype, amount) + result = self.__exec_force_exit(trade, ordertype, amount, price) Trade.commit() self._freqtrade.wallets.update() if not result: From e26529b6952bf54d462d48f1e3b459e765176985 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 12 Dec 2025 06:36:10 +0100 Subject: [PATCH 089/117] feat: Don't run custom_exit_price callback when exiting with price --- freqtrade/freqtradebot.py | 26 +++++++++++++++----------- freqtrade/rpc/rpc.py | 7 ++++++- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 80de52025..8f34ee748 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -2054,6 +2054,7 @@ class FreqtradeBot(LoggingMixin): exit_tag: str | None = None, ordertype: str | None = None, sub_trade_amt: float | None = None, + skip_custom_exit_price: bool = False, ) -> bool: """ Executes a trade exit for the given trade and limit @@ -2080,26 +2081,29 @@ class FreqtradeBot(LoggingMixin): ): exit_type = "stoploss" + order_type = ordertype or self.strategy.order_types[exit_type] # set custom_exit_price if available proposed_limit_rate = limit + custom_exit_price = limit + current_profit = trade.calc_profit_ratio(limit) - custom_exit_price = strategy_safe_wrapper( - self.strategy.custom_exit_price, default_retval=proposed_limit_rate - )( - pair=trade.pair, - trade=trade, - current_time=datetime.now(UTC), - proposed_rate=proposed_limit_rate, - current_profit=current_profit, - exit_tag=exit_reason, - ) + if order_type == "limit" and not skip_custom_exit_price: + custom_exit_price = strategy_safe_wrapper( + self.strategy.custom_exit_price, default_retval=proposed_limit_rate + )( + pair=trade.pair, + trade=trade, + current_time=datetime.now(UTC), + proposed_rate=proposed_limit_rate, + current_profit=current_profit, + exit_tag=exit_reason, + ) limit = self.get_valid_price(custom_exit_price, proposed_limit_rate) # First cancelling stoploss on exchange ... trade = self.cancel_stoploss_on_exchange(trade, allow_nonblocking=True) - order_type = ordertype or self.strategy.order_types[exit_type] if exit_check.exit_type == ExitType.EMERGENCY_EXIT: # Emergency exits (default to market!) order_type = self.strategy.order_types.get("emergency_exit", "market") diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index b7630c47b..8a8376afb 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -992,7 +992,12 @@ class RPC: sub_amount = amount self._freqtrade.execute_trade_exit( - trade, current_rate, exit_check, ordertype=order_type, sub_trade_amt=sub_amount + trade, + current_rate, + exit_check, + ordertype=order_type, + sub_trade_amt=sub_amount, + skip_custom_exit_price=price is not None and ordertype == "limit", ) return True From fe187310578b25a5cfa4b783d8268ac5bf68cc7d Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 12 Dec 2025 06:46:15 +0100 Subject: [PATCH 090/117] test: slightly improve custom_exit_rate test --- tests/freqtradebot/test_freqtradebot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/freqtradebot/test_freqtradebot.py b/tests/freqtradebot/test_freqtradebot.py index f8b790c44..d08daa2f1 100644 --- a/tests/freqtradebot/test_freqtradebot.py +++ b/tests/freqtradebot/test_freqtradebot.py @@ -3092,7 +3092,7 @@ def test_execute_trade_exit_custom_exit_price( "exit_reason": "foo", "open_date": ANY, "close_date": ANY, - "close_rate": ANY, + "close_rate": 2.25, # the custom exit price "sub_trade": False, "cumulative_profit": 0.0, "stake_amount": pytest.approx(60), From 13c86452e9d3af5b5657069f9f38c1dbfa5e9dba Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 14 Dec 2025 18:29:37 +0100 Subject: [PATCH 091/117] refactor: only assign order_type once --- freqtrade/freqtradebot.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 8f34ee748..4c5207e93 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -2081,7 +2081,12 @@ class FreqtradeBot(LoggingMixin): ): exit_type = "stoploss" - order_type = ordertype or self.strategy.order_types[exit_type] + order_type = ( + (ordertype or self.strategy.order_types[exit_type]) + if exit_check.exit_type != ExitType.EMERGENCY_EXIT + else self.strategy.order_types.get("emergency_exit", "market") + ) + # set custom_exit_price if available proposed_limit_rate = limit custom_exit_price = limit @@ -2104,10 +2109,6 @@ class FreqtradeBot(LoggingMixin): # First cancelling stoploss on exchange ... trade = self.cancel_stoploss_on_exchange(trade, allow_nonblocking=True) - if exit_check.exit_type == ExitType.EMERGENCY_EXIT: - # Emergency exits (default to market!) - order_type = self.strategy.order_types.get("emergency_exit", "market") - amount = self._safe_exit_amount(trade, trade.pair, sub_trade_amt or trade.amount) time_in_force = self.strategy.order_time_in_force["exit"] From a16d2a1ef90de96352cbf82d5dc6e5d3579d96b8 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 14 Dec 2025 18:29:43 +0100 Subject: [PATCH 092/117] chore: fix typo --- freqtrade/rpc/rpc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index 8a8376afb..81bb52ce5 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -1013,7 +1013,7 @@ class RPC: ) -> dict[str, str]: """ Handler for forceexit . - exts the given trade. Uses current price if price is None. + exits the given trade. Uses current price if price is None. """ if self._freqtrade.state == State.STOPPED: From 57d1e2427521d5b8ddd9e1bc3258aeb92268d0b6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 03:01:39 +0000 Subject: [PATCH 093/117] chore(deps-dev): bump pytest from 9.0.1 to 9.0.2 in the pytest group Bumps the pytest group with 1 update: [pytest](https://github.com/pytest-dev/pytest). Updates `pytest` from 9.0.1 to 9.0.2 - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/9.0.1...9.0.2) --- updated-dependencies: - dependency-name: pytest dependency-version: 9.0.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: pytest ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index c03470653..3e522955c 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -9,7 +9,7 @@ ruff==0.14.7 mypy==1.19.0 pre-commit==4.5.0 -pytest==9.0.1 +pytest==9.0.2 pytest-asyncio==1.3.0 pytest-cov==7.0.0 pytest-mock==3.15.1 From 293989f0194c1516e5b3f8c999ad7a54d8be2877 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 03:01:59 +0000 Subject: [PATCH 094/117] chore(deps): bump fastapi from 0.123.0 to 0.124.0 Bumps [fastapi](https://github.com/fastapi/fastapi) from 0.123.0 to 0.124.0. - [Release notes](https://github.com/fastapi/fastapi/releases) - [Commits](https://github.com/fastapi/fastapi/compare/0.123.0...0.124.0) --- updated-dependencies: - dependency-name: fastapi dependency-version: 0.124.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index d2dcb63eb..b3488cf5e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -37,7 +37,7 @@ orjson==3.11.4 sdnotify==0.3.2 # API Server -fastapi==0.123.0 +fastapi==0.124.0 pydantic==2.12.5 uvicorn==0.38.0 pyjwt==2.10.1 From 1099fd2525f8b4e1b0a215038a53ed78134bfbb4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 03:02:03 +0000 Subject: [PATCH 095/117] chore(deps): bump actions/checkout from 6.0.0 to 6.0.1 Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.0 to 6.0.1. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v6.0.0...v6.0.1) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 6.0.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/binance-lev-tier-update.yml | 2 +- .github/workflows/ci.yml | 16 ++++++++-------- .github/workflows/deploy-docs.yml | 2 +- .github/workflows/devcontainer-build.yml | 2 +- .github/workflows/docker-build.yml | 4 ++-- .github/workflows/docker-update-readme.yml | 2 +- .github/workflows/pre-commit-update.yml | 2 +- .github/workflows/zizmor.yml | 2 +- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/binance-lev-tier-update.yml b/.github/workflows/binance-lev-tier-update.yml index 05ac6c01e..2a3b8bb95 100644 --- a/.github/workflows/binance-lev-tier-update.yml +++ b/.github/workflows/binance-lev-tier-update.yml @@ -15,7 +15,7 @@ jobs: environment: name: develop steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 with: persist-credentials: false diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a341741f7..8013bd7b0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: python-version: ["3.11", "3.12", "3.13"] steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 with: persist-credentials: false @@ -177,7 +177,7 @@ jobs: name: "Mypy Version Check" runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 with: persist-credentials: false @@ -195,7 +195,7 @@ jobs: name: "Pre-commit checks" runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 with: persist-credentials: false @@ -208,7 +208,7 @@ jobs: name: "Documentation build" runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 with: persist-credentials: false @@ -240,7 +240,7 @@ jobs: name: "Tests and Linting - Online tests" runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 with: persist-credentials: false @@ -320,7 +320,7 @@ jobs: with: jobs: ${{ toJSON(needs) }} - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 with: persist-credentials: false @@ -367,7 +367,7 @@ jobs: id-token: write steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 with: persist-credentials: false @@ -396,7 +396,7 @@ jobs: id-token: write steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 with: persist-credentials: false diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index f109ddf7a..33272efa6 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -19,7 +19,7 @@ jobs: name: Deploy Docs through mike runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 with: persist-credentials: true diff --git a/.github/workflows/devcontainer-build.yml b/.github/workflows/devcontainer-build.yml index 429a2bbae..485ff30ed 100644 --- a/.github/workflows/devcontainer-build.yml +++ b/.github/workflows/devcontainer-build.yml @@ -24,7 +24,7 @@ jobs: packages: write runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 with: persist-credentials: false - name: Login to GitHub Container Registry diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index 6790b3497..500e02614 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -33,7 +33,7 @@ jobs: if: github.repository == 'freqtrade/freqtrade' steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 with: persist-credentials: false @@ -152,7 +152,7 @@ jobs: if: github.repository == 'freqtrade/freqtrade' steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 with: persist-credentials: false diff --git a/.github/workflows/docker-update-readme.yml b/.github/workflows/docker-update-readme.yml index de2e5faee..7f3a75280 100644 --- a/.github/workflows/docker-update-readme.yml +++ b/.github/workflows/docker-update-readme.yml @@ -11,7 +11,7 @@ jobs: dockerHubDescription: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 with: persist-credentials: false diff --git a/.github/workflows/pre-commit-update.yml b/.github/workflows/pre-commit-update.yml index 601c61d76..fe46aa6fe 100644 --- a/.github/workflows/pre-commit-update.yml +++ b/.github/workflows/pre-commit-update.yml @@ -13,7 +13,7 @@ jobs: auto-update: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6.0.0 + - uses: actions/checkout@v6.0.1 with: persist-credentials: false diff --git a/.github/workflows/zizmor.yml b/.github/workflows/zizmor.yml index 594b6507d..cec2469b8 100644 --- a/.github/workflows/zizmor.yml +++ b/.github/workflows/zizmor.yml @@ -22,7 +22,7 @@ jobs: # actions: read # only needed for private repos steps: - name: Checkout repository - uses: actions/checkout@v6.0.0 + uses: actions/checkout@v6.0.1 with: persist-credentials: false From 5d25adfc42d68ae3a118dc5165faddc993771784 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 03:02:07 +0000 Subject: [PATCH 096/117] chore(deps): bump stable-baselines3 from 2.7.0 to 2.7.1 Bumps [stable-baselines3](https://github.com/DLR-RM/stable-baselines3) from 2.7.0 to 2.7.1. - [Release notes](https://github.com/DLR-RM/stable-baselines3/releases) - [Commits](https://github.com/DLR-RM/stable-baselines3/compare/v2.7.0...v2.7.1) --- updated-dependencies: - dependency-name: stable-baselines3 dependency-version: 2.7.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-freqai-rl.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-freqai-rl.txt b/requirements-freqai-rl.txt index af86a1d0a..83a6515cc 100644 --- a/requirements-freqai-rl.txt +++ b/requirements-freqai-rl.txt @@ -5,7 +5,7 @@ torch==2.9.1; sys_platform != 'darwin' or platform_machine != 'x86_64' gymnasium==1.2.2 # SB3 >=2.5.0 depends on torch 2.3.0 - which implies it dropped support x86 macos -stable_baselines3==2.7.0; sys_platform != 'darwin' or platform_machine != 'x86_64' +stable_baselines3==2.7.1; sys_platform != 'darwin' or platform_machine != 'x86_64' sb3_contrib>=2.2.1; sys_platform != 'darwin' or platform_machine != 'x86_64' # Progress bar for stable-baselines3 and sb3-contrib tqdm==4.67.1 From 484b3ff2f383ce706ae5339b1937a9b486e57318 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 03:02:15 +0000 Subject: [PATCH 097/117] chore(deps): bump orjson from 3.11.4 to 3.11.5 Bumps [orjson](https://github.com/ijl/orjson) from 3.11.4 to 3.11.5. - [Release notes](https://github.com/ijl/orjson/releases) - [Changelog](https://github.com/ijl/orjson/blob/master/CHANGELOG.md) - [Commits](https://github.com/ijl/orjson/compare/3.11.4...3.11.5) --- updated-dependencies: - dependency-name: orjson dependency-version: 3.11.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index d2dcb63eb..685dd1bc1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -31,7 +31,7 @@ pyarrow==22.0.0; platform_machine != 'armv7l' # Load ticker files 30% faster python-rapidjson==1.22 # Properly format api responses -orjson==3.11.4 +orjson==3.11.5 # Notify systemd sdnotify==0.3.2 From c20f511418358734dcc35c7e4c95a7684af7d6c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 03:02:20 +0000 Subject: [PATCH 098/117] chore(deps): bump pymdown-extensions from 10.17.2 to 10.18 Bumps [pymdown-extensions](https://github.com/facelessuser/pymdown-extensions) from 10.17.2 to 10.18. - [Release notes](https://github.com/facelessuser/pymdown-extensions/releases) - [Commits](https://github.com/facelessuser/pymdown-extensions/compare/10.17.2...10.18) --- updated-dependencies: - dependency-name: pymdown-extensions dependency-version: '10.18' dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- docs/requirements-docs.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements-docs.txt b/docs/requirements-docs.txt index b98977366..becef5127 100644 --- a/docs/requirements-docs.txt +++ b/docs/requirements-docs.txt @@ -2,6 +2,6 @@ markdown==3.10 mkdocs==1.6.1 mkdocs-material==9.7.0 mdx_truly_sane_lists==1.3 -pymdown-extensions==10.17.2 +pymdown-extensions==10.18 jinja2==3.1.6 mike==2.1.3 From 7dc0d5d146a27095060e703ae9ecbcd40bf7b692 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 03:02:48 +0000 Subject: [PATCH 099/117] chore(deps-dev): bump ruff from 0.14.7 to 0.14.8 Bumps [ruff](https://github.com/astral-sh/ruff) from 0.14.7 to 0.14.8. - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/ruff/compare/0.14.7...0.14.8) --- updated-dependencies: - dependency-name: ruff dependency-version: 0.14.8 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index c03470653..b4d4ab36f 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -6,7 +6,7 @@ -r requirements-freqai-rl.txt -r docs/requirements-docs.txt -ruff==0.14.7 +ruff==0.14.8 mypy==1.19.0 pre-commit==4.5.0 pytest==9.0.1 From c0d40a03aa3bcfd77f4e3da7f8b96a4cea2d2030 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 05:50:08 +0000 Subject: [PATCH 100/117] chore(deps): bump python-rapidjson from 1.22 to 1.23 Bumps [python-rapidjson](https://github.com/python-rapidjson/python-rapidjson) from 1.22 to 1.23. - [Changelog](https://github.com/python-rapidjson/python-rapidjson/blob/master/CHANGES.rst) - [Commits](https://github.com/python-rapidjson/python-rapidjson/compare/v1.22...v1.23) --- updated-dependencies: - dependency-name: python-rapidjson dependency-version: '1.23' dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- ft_client/requirements.txt | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ft_client/requirements.txt b/ft_client/requirements.txt index 9d3110871..e492410b1 100644 --- a/ft_client/requirements.txt +++ b/ft_client/requirements.txt @@ -1,3 +1,3 @@ # Requirements for freqtrade client library requests==2.32.5 -python-rapidjson==1.22 +python-rapidjson==1.23 diff --git a/requirements.txt b/requirements.txt index 490d7efc9..d14fddede 100644 --- a/requirements.txt +++ b/requirements.txt @@ -29,7 +29,7 @@ pyarrow==22.0.0; platform_machine != 'armv7l' # Load ticker files 30% faster -python-rapidjson==1.22 +python-rapidjson==1.23 # Properly format api responses orjson==3.11.5 From 289e53ed5a4c428e0601ebdae44340877b57884f Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 15 Dec 2025 20:22:52 +0100 Subject: [PATCH 101/117] fix: allow set-leverage failures on followup orders --- freqtrade/exchange/exchange.py | 5 +++-- freqtrade/freqtradebot.py | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 6f8eab820..cc1cd3322 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1405,8 +1405,9 @@ class Exchange: amount: float, rate: float, leverage: float, - reduceOnly: bool = False, time_in_force: str = "GTC", + reduceOnly: bool = False, + initial_order: bool = True, ) -> CcxtOrder: if self._config["dry_run"]: dry_order = self.create_dry_run_order( @@ -1423,7 +1424,7 @@ class Exchange: rate_for_order = self.price_to_precision(pair, rate) if needs_price else None if not reduceOnly: - self._lev_prep(pair, leverage, side) + self._lev_prep(pair, leverage, side, accept_fail=not initial_order) order = self._api.create_order( pair, diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 4c5207e93..b80442ca0 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -937,6 +937,7 @@ class FreqtradeBot(LoggingMixin): reduceOnly=False, time_in_force=time_in_force, leverage=leverage, + initial_order=trade is None, ) order_obj = Order.parse_from_ccxt_object(order, pair, side, amount, enter_limit_requested) order_obj.ft_order_tag = enter_tag @@ -2145,6 +2146,7 @@ class FreqtradeBot(LoggingMixin): leverage=trade.leverage, reduceOnly=self.trading_mode == TradingMode.FUTURES, time_in_force=time_in_force, + initial_order=False, ) except InsufficientFundsError as e: logger.warning(f"Unable to place order {e}.") From fa5210aa4bbe59440b8974b4f3e5d9b6e9ab1d89 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 15 Dec 2025 20:35:05 +0100 Subject: [PATCH 102/117] fix: function signature mismatch --- freqtrade/exchange/kucoin.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/freqtrade/exchange/kucoin.py b/freqtrade/exchange/kucoin.py index 17afbd63a..e1fe469fb 100644 --- a/freqtrade/exchange/kucoin.py +++ b/freqtrade/exchange/kucoin.py @@ -44,8 +44,9 @@ class Kucoin(Exchange): amount: float, rate: float, leverage: float, - reduceOnly: bool = False, time_in_force: str = "GTC", + reduceOnly: bool = False, + initial_order: bool = True, ) -> CcxtOrder: res = super().create_order( pair=pair, @@ -56,6 +57,7 @@ class Kucoin(Exchange): leverage=leverage, reduceOnly=reduceOnly, time_in_force=time_in_force, + initial_order=initial_order, ) # Kucoin returns only the order-id. # ccxt returns status = 'closed' at the moment - which is information ccxt invented. From 98da54ae8245555695f15b24ada2707a2adf9ca9 Mon Sep 17 00:00:00 2001 From: Freqtrade Bot <154552126+freqtrade-bot@users.noreply.github.com> Date: Tue, 16 Dec 2025 03:30:35 +0000 Subject: [PATCH 103/117] chore: update pre-commit hooks --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6e92eaaff..e174acc50 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -21,7 +21,7 @@ repos: # stages: [push] - repo: https://github.com/pre-commit/mirrors-mypy - rev: "v1.19.0" + rev: "v1.19.1" hooks: - id: mypy exclude: build_helpers @@ -44,7 +44,7 @@ repos: - repo: https://github.com/charliermarsh/ruff-pre-commit # Ruff version. - rev: 'v0.14.8' + rev: 'v0.14.9' hooks: - id: ruff - id: ruff-format From 6a98c19dab961e097943c8a246e5a1f4e72e1f64 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 16 Dec 2025 20:12:34 +0100 Subject: [PATCH 104/117] fix: improve binance stoploss "triggered" behavior --- freqtrade/exchange/binance.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/freqtrade/exchange/binance.py b/freqtrade/exchange/binance.py index 37c355d4d..e05b9c702 100644 --- a/freqtrade/exchange/binance.py +++ b/freqtrade/exchange/binance.py @@ -151,7 +151,21 @@ class Binance(Exchange): if self.trading_mode == TradingMode.FUTURES: params = params or {} params.update({"stop": True}) - return self.fetch_order(order_id, pair, params) + order = self.fetch_order(order_id, pair, params) + if self.trading_mode == TradingMode.FUTURES and order.get("status", "open") == "closed": + # Places a real order - which we need to fetch explicitly. + + if new_orderid := order.get("info", {}).get("actualOrderId"): + order1 = self.fetch_order(order_id=new_orderid, pair=pair, params={}) + order1["id_stop"] = order1["id"] + order1["id"] = order_id + order1["type"] = "stoploss" + order1["stopPrice"] = order.get("stopPrice") + order1["status_stop"] = "triggered" + + return order1 + + return order def cancel_stoploss_order(self, order_id: str, pair: str, params: dict | None = None) -> dict: if self.trading_mode == TradingMode.FUTURES: From 5800002d4214ae4f3d2502b3046eed16024ab6e4 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 15 Dec 2025 06:48:53 +0100 Subject: [PATCH 105/117] feat: add stoploss_fetch_requires_stop_param property --- freqtrade/exchange/binance.py | 1 + freqtrade/exchange/bitget.py | 1 + freqtrade/exchange/exchange.py | 1 + freqtrade/exchange/exchange_types.py | 1 + freqtrade/exchange/gate.py | 1 + freqtrade/exchange/okx.py | 1 + 6 files changed, 6 insertions(+) diff --git a/freqtrade/exchange/binance.py b/freqtrade/exchange/binance.py index e05b9c702..258afc631 100644 --- a/freqtrade/exchange/binance.py +++ b/freqtrade/exchange/binance.py @@ -51,6 +51,7 @@ class Binance(Exchange): "funding_fee_candle_limit": 1000, "stoploss_order_types": {"limit": "stop", "market": "stop_market"}, "stoploss_blocks_assets": False, # Stoploss orders do not block assets + "stoploss_fetch_requires_stop_param": True, "tickers_have_price": False, "floor_leverage": True, "fetch_orders_limit_minutes": 7 * 1440, # "fetch_orders" is limited to 7 days diff --git a/freqtrade/exchange/bitget.py b/freqtrade/exchange/bitget.py index f0da55cb0..7fef482d2 100644 --- a/freqtrade/exchange/bitget.py +++ b/freqtrade/exchange/bitget.py @@ -31,6 +31,7 @@ class Bitget(Exchange): "stop_price_prop": "stopPrice", "stoploss_blocks_assets": False, # Stoploss orders do not block assets "stoploss_order_types": {"limit": "limit", "market": "market"}, + "stoploss_fetch_requires_stop_param": True, "ohlcv_candle_limit": 200, # 200 for historical candles, 1000 for recent ones. "order_time_in_force": ["GTC", "FOK", "IOC", "PO"], } diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index cc1cd3322..120b027e6 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -132,6 +132,7 @@ class Exchange: "stop_price_prop": "stopLossPrice", # Used for stoploss_on_exchange response parsing "stoploss_order_types": {}, "stoploss_blocks_assets": True, # By default stoploss orders block assets + "stoploss_fetch_requires_stop_param": False, # Require "stop": True" to fetch stop orders "order_time_in_force": ["GTC"], "ohlcv_params": {}, "ohlcv_has_history": True, # Some exchanges (Kraken) don't provide history via ohlcv diff --git a/freqtrade/exchange/exchange_types.py b/freqtrade/exchange/exchange_types.py index d2c2b46e2..0a69f8752 100644 --- a/freqtrade/exchange/exchange_types.py +++ b/freqtrade/exchange/exchange_types.py @@ -19,6 +19,7 @@ class FtHas(TypedDict, total=False): stop_price_type_value_mapping: dict stoploss_order_types: dict[str, str] stoploss_blocks_assets: bool + stoploss_fetch_requires_stop_param: bool # ohlcv ohlcv_params: dict ohlcv_candle_limit: int diff --git a/freqtrade/exchange/gate.py b/freqtrade/exchange/gate.py index 4c6d524d7..01be9d9cd 100644 --- a/freqtrade/exchange/gate.py +++ b/freqtrade/exchange/gate.py @@ -30,6 +30,7 @@ class Gate(Exchange): "stoploss_order_types": {"limit": "limit"}, "stop_price_param": "stopPrice", "stop_price_prop": "stopPrice", + "stoploss_fetch_requires_stop_param": True, "l2_limit_upper": 1000, "marketOrderRequiresPrice": True, "trades_has_history": False, # Endpoint would support this - but ccxt doesn't. diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index 14f20a0bb..43924d706 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -31,6 +31,7 @@ class Okx(Exchange): "ohlcv_candle_limit": 100, # Warning, special case with data prior to X months "stoploss_order_types": {"limit": "limit"}, "stoploss_on_exchange": True, + "stoploss_fetch_requires_stop_param": True, "trades_has_history": False, # Endpoint doesn't have a "since" parameter "ws_enabled": True, } From 84e9251fcd3d2f5bbab7404f3337791f6bf5da72 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 15 Dec 2025 07:01:23 +0100 Subject: [PATCH 106/117] test: use object patching instead of direct assignment --- tests/exchange/test_gate.py | 4 +--- tests/exchange/test_okx.py | 11 +++++------ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/tests/exchange/test_gate.py b/tests/exchange/test_gate.py index ee3d70c84..9c3246f46 100644 --- a/tests/exchange/test_gate.py +++ b/tests/exchange/test_gate.py @@ -42,9 +42,7 @@ def test_fetch_stoploss_order_gate(default_conf, mocker): def test_cancel_stoploss_order_gate(default_conf, mocker): exchange = get_patched_exchange(mocker, default_conf, exchange="gate") - - cancel_order_mock = MagicMock() - exchange.cancel_order = cancel_order_mock + cancel_order_mock = mocker.patch.object(exchange, "cancel_order") exchange.cancel_stoploss_order("1234", "ETH/BTC") assert cancel_order_mock.call_count == 1 diff --git a/tests/exchange/test_okx.py b/tests/exchange/test_okx.py index 750afbd40..43e14a51a 100644 --- a/tests/exchange/test_okx.py +++ b/tests/exchange/test_okx.py @@ -661,14 +661,13 @@ def test_stoploss_adjust_okx(mocker, default_conf, sl1, sl2, sl3, side): def test_stoploss_cancel_okx(mocker, default_conf): exchange = get_patched_exchange(mocker, default_conf, exchange="okx") - - exchange.cancel_order = MagicMock() + co_mock = mocker.patch.object(exchange, "cancel_order") exchange.cancel_stoploss_order("1234", "ETH/USDT") - assert exchange.cancel_order.call_count == 1 - assert exchange.cancel_order.call_args_list[0][1]["order_id"] == "1234" - assert exchange.cancel_order.call_args_list[0][1]["pair"] == "ETH/USDT" - assert exchange.cancel_order.call_args_list[0][1]["params"] == {"stop": True} + assert co_mock.call_count == 1 + assert co_mock.call_args_list[0][1]["order_id"] == "1234" + assert co_mock.call_args_list[0][1]["pair"] == "ETH/USDT" + assert co_mock.call_args_list[0][1]["params"] == {"stop": True} def test__get_stop_params_okx(mocker, default_conf): From cf6bf1b7b5d1c367da9754a4d3e20a9b3cd46a61 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 15 Dec 2025 06:56:26 +0100 Subject: [PATCH 107/117] refactor: reduce code duplication for cancel_stop_orders --- freqtrade/exchange/binance.py | 6 ------ freqtrade/exchange/bitget.py | 3 --- freqtrade/exchange/exchange.py | 3 +++ freqtrade/exchange/gate.py | 3 --- freqtrade/exchange/okx.py | 3 --- 5 files changed, 3 insertions(+), 15 deletions(-) diff --git a/freqtrade/exchange/binance.py b/freqtrade/exchange/binance.py index 258afc631..1486e5665 100644 --- a/freqtrade/exchange/binance.py +++ b/freqtrade/exchange/binance.py @@ -168,12 +168,6 @@ class Binance(Exchange): return order - def cancel_stoploss_order(self, order_id: str, pair: str, params: dict | None = None) -> dict: - if self.trading_mode == TradingMode.FUTURES: - params = params or {} - params.update({"stop": True}) - return self.cancel_order(order_id=order_id, pair=pair, params=params) - def get_historic_ohlcv( self, pair: str, diff --git a/freqtrade/exchange/bitget.py b/freqtrade/exchange/bitget.py index 7fef482d2..7c791a5a5 100644 --- a/freqtrade/exchange/bitget.py +++ b/freqtrade/exchange/bitget.py @@ -129,9 +129,6 @@ class Bitget(Exchange): return self._fetch_stop_order_fallback(order_id, pair) - def cancel_stoploss_order(self, order_id: str, pair: str, params: dict | None = None) -> dict: - return self.cancel_order(order_id=order_id, pair=pair, params={"stop": True}) - @retrier def additional_exchange_init(self) -> None: """ diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 120b027e6..18390d895 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1742,6 +1742,9 @@ class Exchange: raise OperationalException(e) from e def cancel_stoploss_order(self, order_id: str, pair: str, params: dict | None = None) -> dict: + if self.get_option("stoploss_fetch_requires_stop_param"): + params = params or {} + params["stop"] = True return self.cancel_order(order_id, pair, params) def is_cancel_order_result_suitable(self, corder) -> TypeGuard[CcxtOrder]: diff --git a/freqtrade/exchange/gate.py b/freqtrade/exchange/gate.py index 01be9d9cd..689959768 100644 --- a/freqtrade/exchange/gate.py +++ b/freqtrade/exchange/gate.py @@ -152,6 +152,3 @@ class Gate(Exchange): return order1 return order - - def cancel_stoploss_order(self, order_id: str, pair: str, params: dict | None = None) -> dict: - return self.cancel_order(order_id=order_id, pair=pair, params={"stop": True}) diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index 43924d706..d1777006d 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -264,9 +264,6 @@ class Okx(Exchange): return safe_value_fallback2(order, order, "id_stop", "id") return order["id"] - def cancel_stoploss_order(self, order_id: str, pair: str, params: dict | None = None) -> dict: - return self.cancel_order(order_id=order_id, pair=pair, params={"stop": True}) - def _fetch_orders_emulate(self, pair: str, since_ms: int) -> list[CcxtOrder]: orders = [] From f0908a10436b0ddf3842d1ace3d15e8c2edfd74a Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 15 Dec 2025 07:01:59 +0100 Subject: [PATCH 108/117] test: adapt test to new call logic --- tests/exchange/test_gate.py | 6 +++--- tests/exchange/test_okx.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/exchange/test_gate.py b/tests/exchange/test_gate.py index 9c3246f46..c78f9ce3e 100644 --- a/tests/exchange/test_gate.py +++ b/tests/exchange/test_gate.py @@ -46,9 +46,9 @@ def test_cancel_stoploss_order_gate(default_conf, mocker): exchange.cancel_stoploss_order("1234", "ETH/BTC") assert cancel_order_mock.call_count == 1 - assert cancel_order_mock.call_args_list[0][1]["order_id"] == "1234" - assert cancel_order_mock.call_args_list[0][1]["pair"] == "ETH/BTC" - assert cancel_order_mock.call_args_list[0][1]["params"] == {"stop": True} + assert cancel_order_mock.call_args_list[0][0][0] == "1234" + assert cancel_order_mock.call_args_list[0][0][1] == "ETH/BTC" + assert cancel_order_mock.call_args_list[0][0][2] == {"stop": True} @pytest.mark.parametrize( diff --git a/tests/exchange/test_okx.py b/tests/exchange/test_okx.py index 43e14a51a..5c5b8ed57 100644 --- a/tests/exchange/test_okx.py +++ b/tests/exchange/test_okx.py @@ -665,9 +665,9 @@ def test_stoploss_cancel_okx(mocker, default_conf): exchange.cancel_stoploss_order("1234", "ETH/USDT") assert co_mock.call_count == 1 - assert co_mock.call_args_list[0][1]["order_id"] == "1234" - assert co_mock.call_args_list[0][1]["pair"] == "ETH/USDT" - assert co_mock.call_args_list[0][1]["params"] == {"stop": True} + assert co_mock.call_args_list[0][0][0] == "1234" + assert co_mock.call_args_list[0][0][1] == "ETH/USDT" + assert co_mock.call_args_list[0][0][2] == {"stop": True} def test__get_stop_params_okx(mocker, default_conf): From d4aee7e433441f6fc03da1d0f6f20fc05e277a89 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 15 Dec 2025 07:04:40 +0100 Subject: [PATCH 109/117] test: add autospec=True to just changed tests --- tests/exchange/test_gate.py | 2 +- tests/exchange/test_okx.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/exchange/test_gate.py b/tests/exchange/test_gate.py index c78f9ce3e..5346e0efc 100644 --- a/tests/exchange/test_gate.py +++ b/tests/exchange/test_gate.py @@ -42,7 +42,7 @@ def test_fetch_stoploss_order_gate(default_conf, mocker): def test_cancel_stoploss_order_gate(default_conf, mocker): exchange = get_patched_exchange(mocker, default_conf, exchange="gate") - cancel_order_mock = mocker.patch.object(exchange, "cancel_order") + cancel_order_mock = mocker.patch.object(exchange, "cancel_order", autospec=True) exchange.cancel_stoploss_order("1234", "ETH/BTC") assert cancel_order_mock.call_count == 1 diff --git a/tests/exchange/test_okx.py b/tests/exchange/test_okx.py index 5c5b8ed57..5c8983858 100644 --- a/tests/exchange/test_okx.py +++ b/tests/exchange/test_okx.py @@ -661,7 +661,7 @@ def test_stoploss_adjust_okx(mocker, default_conf, sl1, sl2, sl3, side): def test_stoploss_cancel_okx(mocker, default_conf): exchange = get_patched_exchange(mocker, default_conf, exchange="okx") - co_mock = mocker.patch.object(exchange, "cancel_order") + co_mock = mocker.patch.object(exchange, "cancel_order", autospec=True) exchange.cancel_stoploss_order("1234", "ETH/USDT") assert co_mock.call_count == 1 From 8859b9009a7f015d229621ce4bfdc59a0f63aea8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Dec 2025 22:56:31 +0000 Subject: [PATCH 110/117] chore(deps): bump filelock from 3.20.0 to 3.20.1 Bumps [filelock](https://github.com/tox-dev/py-filelock) from 3.20.0 to 3.20.1. - [Release notes](https://github.com/tox-dev/py-filelock/releases) - [Changelog](https://github.com/tox-dev/filelock/blob/main/docs/changelog.rst) - [Commits](https://github.com/tox-dev/py-filelock/compare/3.20.0...3.20.1) --- updated-dependencies: - dependency-name: filelock dependency-version: 3.20.1 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- requirements-hyperopt.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-hyperopt.txt b/requirements-hyperopt.txt index 9c36b2385..b655f2ac9 100644 --- a/requirements-hyperopt.txt +++ b/requirements-hyperopt.txt @@ -4,6 +4,6 @@ # Required for hyperopt scipy==1.16.3 scikit-learn==1.7.2 -filelock==3.20.0 +filelock==3.20.1 optuna==4.6.0 cmaes==0.12.0 From c8d74baaa1a4fefc1064895d67402e5c0e9786cd Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 16 Dec 2025 20:43:02 +0100 Subject: [PATCH 111/117] refactor: unify fetch_stoploss_order --- freqtrade/exchange/binance.py | 25 ++----------------------- freqtrade/exchange/exchange.py | 20 +++++++++++++++++++- freqtrade/exchange/exchange_types.py | 1 + freqtrade/exchange/gate.py | 21 ++------------------- 4 files changed, 24 insertions(+), 43 deletions(-) diff --git a/freqtrade/exchange/binance.py b/freqtrade/exchange/binance.py index 1486e5665..3b3f0fb73 100644 --- a/freqtrade/exchange/binance.py +++ b/freqtrade/exchange/binance.py @@ -17,7 +17,7 @@ from freqtrade.exchange.binance_public_data import ( download_archive_trades, ) from freqtrade.exchange.common import retrier -from freqtrade.exchange.exchange_types import CcxtOrder, FtHas, Tickers +from freqtrade.exchange.exchange_types import FtHas, Tickers from freqtrade.exchange.exchange_utils_timeframe import timeframe_to_msecs from freqtrade.misc import deep_merge_dicts, json_load from freqtrade.util import FtTTLCache @@ -52,6 +52,7 @@ class Binance(Exchange): "stoploss_order_types": {"limit": "stop", "market": "stop_market"}, "stoploss_blocks_assets": False, # Stoploss orders do not block assets "stoploss_fetch_requires_stop_param": True, + "stoploss_algo_order_info_id": "actualOrderId", "tickers_have_price": False, "floor_leverage": True, "fetch_orders_limit_minutes": 7 * 1440, # "fetch_orders" is limited to 7 days @@ -146,28 +147,6 @@ class Binance(Exchange): except ccxt.BaseError as e: raise OperationalException(e) from e - def fetch_stoploss_order( - self, order_id: str, pair: str, params: dict | None = None - ) -> CcxtOrder: - if self.trading_mode == TradingMode.FUTURES: - params = params or {} - params.update({"stop": True}) - order = self.fetch_order(order_id, pair, params) - if self.trading_mode == TradingMode.FUTURES and order.get("status", "open") == "closed": - # Places a real order - which we need to fetch explicitly. - - if new_orderid := order.get("info", {}).get("actualOrderId"): - order1 = self.fetch_order(order_id=new_orderid, pair=pair, params={}) - order1["id_stop"] = order1["id"] - order1["id"] = order_id - order1["type"] = "stoploss" - order1["stopPrice"] = order.get("stopPrice") - order1["status_stop"] = "triggered" - - return order1 - - return order - def get_historic_ohlcv( self, pair: str, diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 18390d895..bf87e76e7 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1688,7 +1688,25 @@ class Exchange: def fetch_stoploss_order( self, order_id: str, pair: str, params: dict | None = None ) -> CcxtOrder: - return self.fetch_order(order_id, pair, params) + if self.get_option("stoploss_fetch_requires_stop_param"): + params = params or {} + params["stop"] = True + order = self.fetch_order(order_id, pair, params) + if (val := self.get_option("stoploss_algo_order_info_id")) and order.get( + "status", "open" + ) == "closed": + if new_orderid := order.get("info", {}).get(val): + # Fetch real order, which was placed by the algo order. + order1 = self.fetch_order(order_id=new_orderid, pair=pair, params=None) + order1["id_stop"] = order1["id"] + order1["id"] = order_id + order1["type"] = "stoploss" + order1["stopPrice"] = order.get("stopPrice") + order1["status_stop"] = "triggered" + + return order1 + + return order def fetch_order_or_stoploss_order( self, order_id: str, pair: str, stoploss_order: bool = False diff --git a/freqtrade/exchange/exchange_types.py b/freqtrade/exchange/exchange_types.py index 0a69f8752..d427f6182 100644 --- a/freqtrade/exchange/exchange_types.py +++ b/freqtrade/exchange/exchange_types.py @@ -20,6 +20,7 @@ class FtHas(TypedDict, total=False): stoploss_order_types: dict[str, str] stoploss_blocks_assets: bool stoploss_fetch_requires_stop_param: bool + stoploss_algo_order_info_id: str # ohlcv ohlcv_params: dict ohlcv_candle_limit: int diff --git a/freqtrade/exchange/gate.py b/freqtrade/exchange/gate.py index 689959768..83b61c6ad 100644 --- a/freqtrade/exchange/gate.py +++ b/freqtrade/exchange/gate.py @@ -31,6 +31,7 @@ class Gate(Exchange): "stop_price_param": "stopPrice", "stop_price_prop": "stopPrice", "stoploss_fetch_requires_stop_param": True, + "stoploss_algo_order_info_id": "fired_order_id", "l2_limit_upper": 1000, "marketOrderRequiresPrice": True, "trades_has_history": False, # Endpoint would support this - but ccxt doesn't. @@ -43,6 +44,7 @@ class Gate(Exchange): "stop_price_type_field": "price_type", "l2_limit_upper": 300, "stoploss_blocks_assets": False, + "stoploss_algo_order_info_id": "trade_id", "stop_price_type_value_mapping": { PriceType.LAST: 0, PriceType.MARK: 1, @@ -133,22 +135,3 @@ class Gate(Exchange): def get_order_id_conditional(self, order: CcxtOrder) -> str: return safe_value_fallback2(order, order, "id_stop", "id") - - def fetch_stoploss_order( - self, order_id: str, pair: str, params: dict | None = None - ) -> CcxtOrder: - order = self.fetch_order(order_id=order_id, pair=pair, params={"stop": True}) - if order.get("status", "open") == "closed": - # Places a real order - which we need to fetch explicitly. - val = "trade_id" if self.trading_mode == TradingMode.FUTURES else "fired_order_id" - - if new_orderid := order.get("info", {}).get(val): - order1 = self.fetch_order(order_id=new_orderid, pair=pair, params=params) - order1["id_stop"] = order1["id"] - order1["id"] = order_id - order1["type"] = "stoploss" - order1["stopPrice"] = order.get("stopPrice") - order1["status_stop"] = "triggered" - - return order1 - return order From c63fba2e578ec30b7ad1a39b29e905e6fd31a2b7 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 16 Dec 2025 20:44:06 +0100 Subject: [PATCH 112/117] chore: rename flag to better match what it does --- freqtrade/exchange/binance.py | 2 +- freqtrade/exchange/bitget.py | 2 +- freqtrade/exchange/exchange.py | 6 +++--- freqtrade/exchange/exchange_types.py | 2 +- freqtrade/exchange/gate.py | 2 +- freqtrade/exchange/okx.py | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/freqtrade/exchange/binance.py b/freqtrade/exchange/binance.py index 3b3f0fb73..40de29470 100644 --- a/freqtrade/exchange/binance.py +++ b/freqtrade/exchange/binance.py @@ -51,7 +51,7 @@ class Binance(Exchange): "funding_fee_candle_limit": 1000, "stoploss_order_types": {"limit": "stop", "market": "stop_market"}, "stoploss_blocks_assets": False, # Stoploss orders do not block assets - "stoploss_fetch_requires_stop_param": True, + "stoploss_query_requires_stop_flag": True, "stoploss_algo_order_info_id": "actualOrderId", "tickers_have_price": False, "floor_leverage": True, diff --git a/freqtrade/exchange/bitget.py b/freqtrade/exchange/bitget.py index 7c791a5a5..d298d14d6 100644 --- a/freqtrade/exchange/bitget.py +++ b/freqtrade/exchange/bitget.py @@ -31,7 +31,7 @@ class Bitget(Exchange): "stop_price_prop": "stopPrice", "stoploss_blocks_assets": False, # Stoploss orders do not block assets "stoploss_order_types": {"limit": "limit", "market": "market"}, - "stoploss_fetch_requires_stop_param": True, + "stoploss_query_requires_stop_flag": True, "ohlcv_candle_limit": 200, # 200 for historical candles, 1000 for recent ones. "order_time_in_force": ["GTC", "FOK", "IOC", "PO"], } diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index bf87e76e7..e01d341e6 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -132,7 +132,7 @@ class Exchange: "stop_price_prop": "stopLossPrice", # Used for stoploss_on_exchange response parsing "stoploss_order_types": {}, "stoploss_blocks_assets": True, # By default stoploss orders block assets - "stoploss_fetch_requires_stop_param": False, # Require "stop": True" to fetch stop orders + "stoploss_query_requires_stop_flag": False, # Require "stop": True" to fetch stop orders "order_time_in_force": ["GTC"], "ohlcv_params": {}, "ohlcv_has_history": True, # Some exchanges (Kraken) don't provide history via ohlcv @@ -1688,7 +1688,7 @@ class Exchange: def fetch_stoploss_order( self, order_id: str, pair: str, params: dict | None = None ) -> CcxtOrder: - if self.get_option("stoploss_fetch_requires_stop_param"): + if self.get_option("stoploss_query_requires_stop_flag"): params = params or {} params["stop"] = True order = self.fetch_order(order_id, pair, params) @@ -1760,7 +1760,7 @@ class Exchange: raise OperationalException(e) from e def cancel_stoploss_order(self, order_id: str, pair: str, params: dict | None = None) -> dict: - if self.get_option("stoploss_fetch_requires_stop_param"): + if self.get_option("stoploss_query_requires_stop_flag"): params = params or {} params["stop"] = True return self.cancel_order(order_id, pair, params) diff --git a/freqtrade/exchange/exchange_types.py b/freqtrade/exchange/exchange_types.py index d427f6182..fd5faecf7 100644 --- a/freqtrade/exchange/exchange_types.py +++ b/freqtrade/exchange/exchange_types.py @@ -19,7 +19,7 @@ class FtHas(TypedDict, total=False): stop_price_type_value_mapping: dict stoploss_order_types: dict[str, str] stoploss_blocks_assets: bool - stoploss_fetch_requires_stop_param: bool + stoploss_query_requires_stop_flag: bool stoploss_algo_order_info_id: str # ohlcv ohlcv_params: dict diff --git a/freqtrade/exchange/gate.py b/freqtrade/exchange/gate.py index 83b61c6ad..585dddad5 100644 --- a/freqtrade/exchange/gate.py +++ b/freqtrade/exchange/gate.py @@ -30,7 +30,7 @@ class Gate(Exchange): "stoploss_order_types": {"limit": "limit"}, "stop_price_param": "stopPrice", "stop_price_prop": "stopPrice", - "stoploss_fetch_requires_stop_param": True, + "stoploss_query_requires_stop_flag": True, "stoploss_algo_order_info_id": "fired_order_id", "l2_limit_upper": 1000, "marketOrderRequiresPrice": True, diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index d1777006d..4640d5647 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -31,7 +31,7 @@ class Okx(Exchange): "ohlcv_candle_limit": 100, # Warning, special case with data prior to X months "stoploss_order_types": {"limit": "limit"}, "stoploss_on_exchange": True, - "stoploss_fetch_requires_stop_param": True, + "stoploss_query_requires_stop_flag": True, "trades_has_history": False, # Endpoint doesn't have a "since" parameter "ws_enabled": True, } From d5b296c75cf8c713a235719852bc4706518bd0f5 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 16 Dec 2025 20:47:33 +0100 Subject: [PATCH 113/117] test: fix gate stoploss test --- tests/exchange/test_gate.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/exchange/test_gate.py b/tests/exchange/test_gate.py index 5346e0efc..66dfd13f8 100644 --- a/tests/exchange/test_gate.py +++ b/tests/exchange/test_gate.py @@ -16,9 +16,9 @@ def test_fetch_stoploss_order_gate(default_conf, mocker): exchange.fetch_stoploss_order("1234", "ETH/BTC") assert fetch_order_mock.call_count == 1 - assert fetch_order_mock.call_args_list[0][1]["order_id"] == "1234" - assert fetch_order_mock.call_args_list[0][1]["pair"] == "ETH/BTC" - assert fetch_order_mock.call_args_list[0][1]["params"] == {"stop": True} + assert fetch_order_mock.call_args_list[0][0][0] == "1234" + assert fetch_order_mock.call_args_list[0][0][1] == "ETH/BTC" + assert fetch_order_mock.call_args_list[0][0][2] == {"stop": True} default_conf["trading_mode"] = "futures" default_conf["margin_mode"] = "isolated" @@ -36,7 +36,7 @@ def test_fetch_stoploss_order_gate(default_conf, mocker): exchange.fetch_stoploss_order("1234", "ETH/BTC") assert exchange.fetch_order.call_count == 2 - assert exchange.fetch_order.call_args_list[0][1]["order_id"] == "1234" + assert exchange.fetch_order.call_args_list[0][0][0] == "1234" assert exchange.fetch_order.call_args_list[1][1]["order_id"] == "222555" From 278bd0e97d762983507eded604e043a963aa46eb Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 16 Dec 2025 21:02:36 +0100 Subject: [PATCH 114/117] chore: improve variable naming --- freqtrade/exchange/exchange.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index e01d341e6..9d6807fa2 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1692,19 +1692,18 @@ class Exchange: params = params or {} params["stop"] = True order = self.fetch_order(order_id, pair, params) - if (val := self.get_option("stoploss_algo_order_info_id")) and order.get( - "status", "open" - ) == "closed": + val = self.get_option("stoploss_algo_order_info_id") + if val and order.get("status", "open") == "closed": if new_orderid := order.get("info", {}).get(val): # Fetch real order, which was placed by the algo order. - order1 = self.fetch_order(order_id=new_orderid, pair=pair, params=None) - order1["id_stop"] = order1["id"] - order1["id"] = order_id - order1["type"] = "stoploss" - order1["stopPrice"] = order.get("stopPrice") - order1["status_stop"] = "triggered" + actual_order = self.fetch_order(order_id=new_orderid, pair=pair, params=None) + actual_order["id_stop"] = actual_order["id"] + actual_order["id"] = order_id + actual_order["type"] = "stoploss" + actual_order["stopPrice"] = order.get("stopPrice") + actual_order["status_stop"] = "triggered" - return order1 + return actual_order return order From 1143aba6718309ab928a0519c222035c194adf86 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 16 Dec 2025 21:02:48 +0100 Subject: [PATCH 115/117] test: simplify test call --- tests/exchange/test_okx.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/exchange/test_okx.py b/tests/exchange/test_okx.py index 5c8983858..ae52bd1ff 100644 --- a/tests/exchange/test_okx.py +++ b/tests/exchange/test_okx.py @@ -665,9 +665,10 @@ def test_stoploss_cancel_okx(mocker, default_conf): exchange.cancel_stoploss_order("1234", "ETH/USDT") assert co_mock.call_count == 1 - assert co_mock.call_args_list[0][0][0] == "1234" - assert co_mock.call_args_list[0][0][1] == "ETH/USDT" - assert co_mock.call_args_list[0][0][2] == {"stop": True} + args, _ = co_mock.call_args + assert args[0] == "1234" + assert args[1] == "ETH/USDT" + assert args[2] == {"stop": True} def test__get_stop_params_okx(mocker, default_conf): From 6905b8059db3b459d5ba0378f4f50d6e383a8a6c Mon Sep 17 00:00:00 2001 From: Freqtrade Bot <154552126+freqtrade-bot@users.noreply.github.com> Date: Thu, 18 Dec 2025 03:28:09 +0000 Subject: [PATCH 116/117] chore: update pre-commit hooks --- .../exchange/binance_leverage_tiers.json | 3520 +++++++++-------- 1 file changed, 1764 insertions(+), 1756 deletions(-) diff --git a/freqtrade/exchange/binance_leverage_tiers.json b/freqtrade/exchange/binance_leverage_tiers.json index e5bf4695d..84ff22362 100644 --- a/freqtrade/exchange/binance_leverage_tiers.json +++ b/freqtrade/exchange/binance_leverage_tiers.json @@ -160,15 +160,15 @@ "symbol": "1000000BOB/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 40.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "40", - "notionalCap": "5000", + "initialLeverage": "10", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -176,106 +176,72 @@ "tier": 2.0, "symbol": "1000000BOB/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 10000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" + "initialLeverage": "5", + "notionalCap": "60000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "1000000BOB/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 60000.0, + "maxNotional": 70000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "25000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" + "initialLeverage": "4", + "notionalCap": "70000", + "notionalFloor": "60000", + "maintMarginRatio": "0.125", + "cum": "2000.0" } }, { "tier": 4.0, "symbol": "1000000BOB/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 70000.0, + "maxNotional": 700000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "25000", - "maintMarginRatio": "0.1", - "cum": "1525.0" + "initialLeverage": "3", + "notionalCap": "700000", + "notionalFloor": "70000", + "maintMarginRatio": "0.1667", + "cum": "4919.0" } }, { "tier": 5.0, "symbol": "1000000BOB/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "5", - "initialLeverage": "4", - "notionalCap": "100000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2775.0" - } - }, - { - "tier": 6.0, - "symbol": "1000000BOB/USDT:USDT", - "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "250000", - "notionalFloor": "100000", - "maintMarginRatio": "0.1667", - "cum": "6945.0" - } - }, - { - "tier": 7.0, - "symbol": "1000000BOB/USDT:USDT", - "currency": "USDT", - "minNotional": 250000.0, + "minNotional": 700000.0, "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", "notionalCap": "2500000", - "notionalFloor": "250000", + "notionalFloor": "700000", "maintMarginRatio": "0.25", - "cum": "27770.0" + "cum": "63229.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "1000000BOB/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, @@ -283,12 +249,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", "notionalCap": "5000000", "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "652770.0" + "cum": "688229.0" } } ], @@ -8225,14 +8191,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.025", "cum": "0.0" } }, @@ -8242,15 +8208,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "maintMarginRatio": "0.05", + "cum": "125.0" } }, { @@ -8258,101 +8224,84 @@ "symbol": "ALPINE/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "20000", + "initialLeverage": "5", + "notionalCap": "60000", "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" + "maintMarginRatio": "0.1", + "cum": "625.0" } }, { "tier": 4.0, "symbol": "ALPINE/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 60000.0, + "maxNotional": 70000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "20000", - "maintMarginRatio": "0.1", - "cum": "1300.0" + "initialLeverage": "4", + "notionalCap": "70000", + "notionalFloor": "60000", + "maintMarginRatio": "0.125", + "cum": "2125.0" } }, { "tier": 5.0, "symbol": "ALPINE/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 70000.0, + "maxNotional": 700000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2550.0" + "initialLeverage": "3", + "notionalCap": "700000", + "notionalFloor": "70000", + "maintMarginRatio": "0.1667", + "cum": "5044.0" } }, { "tier": 6.0, "symbol": "ALPINE/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "minNotional": 700000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "6", - "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "12975.0" + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "700000", + "maintMarginRatio": "0.25", + "cum": "63354.0" } }, { "tier": 7.0, "symbol": "ALPINE/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "54625.0" - } - }, - { - "tier": 8.0, - "symbol": "ALPINE/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "688354.0" } } ], @@ -10774,15 +10723,15 @@ "symbol": "ASR/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "10", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -10790,119 +10739,85 @@ "tier": 2.0, "symbol": "ASR/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 10000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "initialLeverage": "5", + "notionalCap": "60000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "ASR/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 60000.0, + "maxNotional": 70000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" + "initialLeverage": "4", + "notionalCap": "70000", + "notionalFloor": "60000", + "maintMarginRatio": "0.125", + "cum": "2000.0" } }, { "tier": 4.0, "symbol": "ASR/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 70000.0, + "maxNotional": 700000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "20000", - "maintMarginRatio": "0.1", - "cum": "1300.0" + "initialLeverage": "3", + "notionalCap": "700000", + "notionalFloor": "70000", + "maintMarginRatio": "0.1667", + "cum": "4919.0" } }, { "tier": 5.0, "symbol": "ASR/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 700000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2550.0" + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "700000", + "maintMarginRatio": "0.25", + "cum": "63229.0" } }, { "tier": 6.0, "symbol": "ASR/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "12975.0" - } - }, - { - "tier": 7.0, - "symbol": "ASR/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "54625.0" - } - }, - { - "tier": 8.0, - "symbol": "ASR/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "688229.0" } } ], @@ -12170,14 +12085,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -12195,7 +12110,7 @@ "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { @@ -12203,23 +12118,23 @@ "symbol": "AVAAI/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "20000", + "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", - "cum": "300.0" + "cum": "275.0" } }, { "tier": 4.0, "symbol": "AVAAI/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, + "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, @@ -12227,9 +12142,9 @@ "bracket": "4", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "25000", "maintMarginRatio": "0.1", - "cum": "1300.0" + "cum": "1525.0" } }, { @@ -12237,67 +12152,67 @@ "symbol": "AVAAI/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 250000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "250000", + "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2550.0" + "cum": "2775.0" } }, { "tier": 6.0, "symbol": "AVAAI/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { "bracket": "6", "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "12975.0" + "cum": "6945.0" } }, { "tier": 7.0, "symbol": "AVAAI/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", + "notionalCap": "2500000", + "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "54625.0" + "cum": "27770.0" } }, { "tier": 8.0, "symbol": "AVAAI/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "652770.0" } } ], @@ -16356,15 +16271,15 @@ "symbol": "BEL/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "10", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -16372,119 +16287,85 @@ "tier": 2.0, "symbol": "BEL/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 10000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "initialLeverage": "5", + "notionalCap": "60000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "BEL/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 60000.0, + "maxNotional": 70000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" + "initialLeverage": "4", + "notionalCap": "70000", + "notionalFloor": "60000", + "maintMarginRatio": "0.125", + "cum": "2000.0" } }, { "tier": 4.0, "symbol": "BEL/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 70000.0, + "maxNotional": 700000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "20000", - "maintMarginRatio": "0.1", - "cum": "1300.0" + "initialLeverage": "3", + "notionalCap": "700000", + "notionalFloor": "70000", + "maintMarginRatio": "0.1667", + "cum": "4919.0" } }, { "tier": 5.0, "symbol": "BEL/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 700000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2550.0" + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "700000", + "maintMarginRatio": "0.25", + "cum": "63229.0" } }, { "tier": 6.0, "symbol": "BEL/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "12975.0" - } - }, - { - "tier": 7.0, - "symbol": "BEL/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "54625.0" - } - }, - { - "tier": 8.0, - "symbol": "BEL/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "688229.0" } } ], @@ -17613,15 +17494,15 @@ "symbol": "BLUAI/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "10", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -17629,119 +17510,85 @@ "tier": 2.0, "symbol": "BLUAI/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 10000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "initialLeverage": "5", + "notionalCap": "60000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "BLUAI/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 60000.0, + "maxNotional": 70000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" + "initialLeverage": "4", + "notionalCap": "70000", + "notionalFloor": "60000", + "maintMarginRatio": "0.125", + "cum": "2000.0" } }, { "tier": 4.0, "symbol": "BLUAI/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 70000.0, + "maxNotional": 700000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "20000", - "maintMarginRatio": "0.1", - "cum": "1300.0" + "initialLeverage": "3", + "notionalCap": "700000", + "notionalFloor": "70000", + "maintMarginRatio": "0.1667", + "cum": "4919.0" } }, { "tier": 5.0, "symbol": "BLUAI/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 700000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2550.0" + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "700000", + "maintMarginRatio": "0.25", + "cum": "63229.0" } }, { "tier": 6.0, "symbol": "BLUAI/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "12975.0" - } - }, - { - "tier": 7.0, - "symbol": "BLUAI/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "54625.0" - } - }, - { - "tier": 8.0, - "symbol": "BLUAI/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "688229.0" } } ], @@ -18028,14 +17875,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -18053,7 +17900,7 @@ "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { @@ -18061,23 +17908,23 @@ "symbol": "BMT/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "20000", + "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", - "cum": "300.0" + "cum": "275.0" } }, { "tier": 4.0, "symbol": "BMT/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, + "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, @@ -18085,9 +17932,9 @@ "bracket": "4", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "25000", "maintMarginRatio": "0.1", - "cum": "1300.0" + "cum": "1525.0" } }, { @@ -18095,67 +17942,67 @@ "symbol": "BMT/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 250000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "250000", + "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2550.0" + "cum": "2775.0" } }, { "tier": 6.0, "symbol": "BMT/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { "bracket": "6", "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "12975.0" + "cum": "6945.0" } }, { "tier": 7.0, "symbol": "BMT/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", + "notionalCap": "2500000", + "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "54625.0" + "cum": "27770.0" } }, { "tier": 8.0, "symbol": "BMT/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "652770.0" } } ], @@ -19320,15 +19167,15 @@ "symbol": "BR/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 500.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "500", + "initialLeverage": "25", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -19336,38 +19183,21 @@ "tier": 2.0, "symbol": "BR/USDT:USDT", "currency": "USDT", - "minNotional": 500.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 40.0, - "info": { - "bracket": "2", - "initialLeverage": "40", - "notionalCap": "5000", - "notionalFloor": "500", - "maintMarginRatio": "0.02", - "cum": "2.5" - } - }, - { - "tier": 3.0, - "symbol": "BR/USDT:USDT", - "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "2", "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "27.5" + "cum": "25.0" } }, { - "tier": 4.0, + "tier": 3.0, "symbol": "BR/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, @@ -19375,16 +19205,16 @@ "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "10", "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", - "cum": "277.5" + "cum": "275.0" } }, { - "tier": 5.0, + "tier": 4.0, "symbol": "BR/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, @@ -19392,16 +19222,16 @@ "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "5", "notionalCap": "50000", "notionalFloor": "25000", "maintMarginRatio": "0.1", - "cum": "1527.5" + "cum": "1525.0" } }, { - "tier": 6.0, + "tier": 5.0, "symbol": "BR/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, @@ -19409,16 +19239,16 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2777.5" + "cum": "2775.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "BR/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, @@ -19426,46 +19256,46 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "6947.5" + "cum": "6945.0" + } + }, + { + "tier": 7.0, + "symbol": "BR/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.25", + "cum": "27770.0" } }, { "tier": 8.0, "symbol": "BR/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "8", - "initialLeverage": "2", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.25", - "cum": "27772.5" - } - }, - { - "tier": 9.0, - "symbol": "BR/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 800000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "800000", - "notionalFloor": "500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "152772.5" + "cum": "652770.0" } } ], @@ -19648,14 +19478,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -19673,7 +19503,7 @@ "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { @@ -19681,23 +19511,23 @@ "symbol": "BROCCOLI714/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "20000", + "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", - "cum": "300.0" + "cum": "275.0" } }, { "tier": 4.0, "symbol": "BROCCOLI714/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, + "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, @@ -19705,9 +19535,9 @@ "bracket": "4", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "25000", "maintMarginRatio": "0.1", - "cum": "1300.0" + "cum": "1525.0" } }, { @@ -19715,67 +19545,67 @@ "symbol": "BROCCOLI714/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 250000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "250000", + "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2550.0" + "cum": "2775.0" } }, { "tier": 6.0, "symbol": "BROCCOLI714/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { "bracket": "6", "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "12975.0" + "cum": "6945.0" } }, { "tier": 7.0, "symbol": "BROCCOLI714/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", + "notionalCap": "2500000", + "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "54625.0" + "cum": "27770.0" } }, { "tier": 8.0, "symbol": "BROCCOLI714/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "652770.0" } } ], @@ -24199,15 +24029,15 @@ "symbol": "COMMON/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "10", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -24215,119 +24045,85 @@ "tier": 2.0, "symbol": "COMMON/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 10000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "initialLeverage": "5", + "notionalCap": "60000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "COMMON/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 60000.0, + "maxNotional": 70000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" + "initialLeverage": "4", + "notionalCap": "70000", + "notionalFloor": "60000", + "maintMarginRatio": "0.125", + "cum": "2000.0" } }, { "tier": 4.0, "symbol": "COMMON/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 70000.0, + "maxNotional": 700000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "20000", - "maintMarginRatio": "0.1", - "cum": "1300.0" + "initialLeverage": "3", + "notionalCap": "700000", + "notionalFloor": "70000", + "maintMarginRatio": "0.1667", + "cum": "4919.0" } }, { "tier": 5.0, "symbol": "COMMON/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 700000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2550.0" + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "700000", + "maintMarginRatio": "0.25", + "cum": "63229.0" } }, { "tier": 6.0, "symbol": "COMMON/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "12975.0" - } - }, - { - "tier": 7.0, - "symbol": "COMMON/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "54625.0" - } - }, - { - "tier": 8.0, - "symbol": "COMMON/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "688229.0" } } ], @@ -26416,21 +26212,142 @@ } } ], + "CYS/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "CYS/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "1", + "initialLeverage": "20", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.025", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "CYS/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.05", + "cum": "125.0" + } + }, + { + "tier": 3.0, + "symbol": "CYS/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "625.0" + } + }, + { + "tier": 4.0, + "symbol": "CYS/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "4", + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "1875.0" + } + }, + { + "tier": 5.0, + "symbol": "CYS/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "5", + "initialLeverage": "3", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "6045.0" + } + }, + { + "tier": 6.0, + "symbol": "CYS/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.25", + "cum": "26870.0" + } + }, + { + "tier": 7.0, + "symbol": "CYS/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "800000", + "notionalFloor": "500000", + "maintMarginRatio": "0.5", + "cum": "151870.0" + } + } + ], "D/USDT:USDT": [ { "tier": 1.0, "symbol": "D/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "10", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -26438,119 +26355,85 @@ "tier": 2.0, "symbol": "D/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 10000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "initialLeverage": "5", + "notionalCap": "60000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "D/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 60000.0, + "maxNotional": 70000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" + "initialLeverage": "4", + "notionalCap": "70000", + "notionalFloor": "60000", + "maintMarginRatio": "0.125", + "cum": "2000.0" } }, { "tier": 4.0, "symbol": "D/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 70000.0, + "maxNotional": 700000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "20000", - "maintMarginRatio": "0.1", - "cum": "1300.0" + "initialLeverage": "3", + "notionalCap": "700000", + "notionalFloor": "70000", + "maintMarginRatio": "0.1667", + "cum": "4919.0" } }, { "tier": 5.0, "symbol": "D/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 700000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2550.0" + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "700000", + "maintMarginRatio": "0.25", + "cum": "63229.0" } }, { "tier": 6.0, "symbol": "D/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "12975.0" - } - }, - { - "tier": 7.0, - "symbol": "D/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "54625.0" - } - }, - { - "tier": 8.0, - "symbol": "D/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "688229.0" } } ], @@ -27405,15 +27288,15 @@ "symbol": "DEGO/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 40.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "40", - "notionalCap": "5000", + "initialLeverage": "10", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -27421,106 +27304,72 @@ "tier": 2.0, "symbol": "DEGO/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 10000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" + "initialLeverage": "5", + "notionalCap": "60000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "DEGO/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 60000.0, + "maxNotional": 70000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "25000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" + "initialLeverage": "4", + "notionalCap": "70000", + "notionalFloor": "60000", + "maintMarginRatio": "0.125", + "cum": "2000.0" } }, { "tier": 4.0, "symbol": "DEGO/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 70000.0, + "maxNotional": 700000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "25000", - "maintMarginRatio": "0.1", - "cum": "1525.0" + "initialLeverage": "3", + "notionalCap": "700000", + "notionalFloor": "70000", + "maintMarginRatio": "0.1667", + "cum": "4919.0" } }, { "tier": 5.0, "symbol": "DEGO/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "5", - "initialLeverage": "4", - "notionalCap": "100000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2775.0" - } - }, - { - "tier": 6.0, - "symbol": "DEGO/USDT:USDT", - "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "250000", - "notionalFloor": "100000", - "maintMarginRatio": "0.1667", - "cum": "6945.0" - } - }, - { - "tier": 7.0, - "symbol": "DEGO/USDT:USDT", - "currency": "USDT", - "minNotional": 250000.0, + "minNotional": 700000.0, "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", "notionalCap": "2500000", - "notionalFloor": "250000", + "notionalFloor": "700000", "maintMarginRatio": "0.25", - "cum": "27770.0" + "cum": "63229.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "DEGO/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, @@ -27528,12 +27377,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", "notionalCap": "5000000", "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "652770.0" + "cum": "688229.0" } } ], @@ -27854,14 +27703,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -27879,7 +27728,7 @@ "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { @@ -27887,23 +27736,23 @@ "symbol": "DF/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "20000", + "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", - "cum": "300.0" + "cum": "275.0" } }, { "tier": 4.0, "symbol": "DF/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, + "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, @@ -27911,9 +27760,9 @@ "bracket": "4", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "25000", "maintMarginRatio": "0.1", - "cum": "1300.0" + "cum": "1525.0" } }, { @@ -27921,67 +27770,67 @@ "symbol": "DF/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 250000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "250000", + "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2550.0" + "cum": "2775.0" } }, { "tier": 6.0, "symbol": "DF/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { "bracket": "6", "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "12975.0" + "cum": "6945.0" } }, { "tier": 7.0, "symbol": "DF/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", + "notionalCap": "2500000", + "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "54625.0" + "cum": "27770.0" } }, { "tier": 8.0, "symbol": "DF/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "652770.0" } } ], @@ -30060,14 +29909,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.015", "cum": "0.0" } }, @@ -30077,15 +29926,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.015", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -30093,33 +29942,33 @@ "symbol": "EDEN/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.02", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "EDEN/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, + "minNotional": 20000.0, "maxNotional": 50000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "25000", - "maintMarginRatio": "0.025", - "cum": "200.0" + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { @@ -30127,88 +29976,54 @@ "symbol": "EDEN/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "125000", + "initialLeverage": "4", + "notionalCap": "250000", "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1450.0" + "maintMarginRatio": "0.125", + "cum": "2550.0" } }, { "tier": 6.0, "symbol": "EDEN/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "6", - "initialLeverage": "5", - "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.1", - "cum": "7700.0" + "initialLeverage": "3", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1667", + "cum": "12975.0" } }, { "tier": 7.0, "symbol": "EDEN/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "7", - "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "13950.0" - } - }, - { - "tier": 8.0, - "symbol": "EDEN/USDT:USDT", - "currency": "USDT", "minNotional": 500000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "8", - "initialLeverage": "3", - "notionalCap": "1000000", - "notionalFloor": "500000", - "maintMarginRatio": "0.1667", - "cum": "34800.0" - } - }, - { - "tier": 9.0, - "symbol": "EDEN/USDT:USDT", - "currency": "USDT", - "minNotional": 1000000.0, "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", - "notionalFloor": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "118100.0" + "cum": "54625.0" } }, { - "tier": 10.0, + "tier": 8.0, "symbol": "EDEN/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -30216,12 +30031,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "1993100.0" + "cum": "1929625.0" } } ], @@ -31385,14 +31200,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.015", "cum": "0.0" } }, @@ -31402,15 +31217,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.015", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -31418,33 +31233,33 @@ "symbol": "ENSO/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.02", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "ENSO/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, + "minNotional": 20000.0, "maxNotional": 50000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "25000", - "maintMarginRatio": "0.025", - "cum": "200.0" + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { @@ -31452,88 +31267,54 @@ "symbol": "ENSO/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "125000", + "initialLeverage": "4", + "notionalCap": "250000", "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1450.0" + "maintMarginRatio": "0.125", + "cum": "2550.0" } }, { "tier": 6.0, "symbol": "ENSO/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "6", - "initialLeverage": "5", - "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.1", - "cum": "7700.0" + "initialLeverage": "3", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1667", + "cum": "12975.0" } }, { "tier": 7.0, "symbol": "ENSO/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "7", - "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "13950.0" - } - }, - { - "tier": 8.0, - "symbol": "ENSO/USDT:USDT", - "currency": "USDT", "minNotional": 500000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "8", - "initialLeverage": "3", - "notionalCap": "1000000", - "notionalFloor": "500000", - "maintMarginRatio": "0.1667", - "cum": "34800.0" - } - }, - { - "tier": 9.0, - "symbol": "ENSO/USDT:USDT", - "currency": "USDT", - "minNotional": 1000000.0, "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", - "notionalFloor": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "118100.0" + "cum": "54625.0" } }, { - "tier": 10.0, + "tier": 8.0, "symbol": "ENSO/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -31541,12 +31322,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "1993100.0" + "cum": "1929625.0" } } ], @@ -37793,14 +37574,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -37818,7 +37599,7 @@ "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { @@ -37826,23 +37607,23 @@ "symbol": "GHST/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "20000", + "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", - "cum": "300.0" + "cum": "275.0" } }, { "tier": 4.0, "symbol": "GHST/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, + "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, @@ -37850,9 +37631,9 @@ "bracket": "4", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "25000", "maintMarginRatio": "0.1", - "cum": "1300.0" + "cum": "1525.0" } }, { @@ -37860,67 +37641,67 @@ "symbol": "GHST/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 250000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "250000", + "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2550.0" + "cum": "2775.0" } }, { "tier": 6.0, "symbol": "GHST/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { "bracket": "6", "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "12975.0" + "cum": "6945.0" } }, { "tier": 7.0, "symbol": "GHST/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", + "notionalCap": "2500000", + "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "54625.0" + "cum": "27770.0" } }, { "tier": 8.0, "symbol": "GHST/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "652770.0" } } ], @@ -39481,14 +39262,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -39506,7 +39287,7 @@ "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { @@ -39514,23 +39295,23 @@ "symbol": "GTC/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "20000", + "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", - "cum": "300.0" + "cum": "275.0" } }, { "tier": 4.0, "symbol": "GTC/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, + "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, @@ -39538,9 +39319,9 @@ "bracket": "4", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "25000", "maintMarginRatio": "0.1", - "cum": "1300.0" + "cum": "1525.0" } }, { @@ -39548,67 +39329,67 @@ "symbol": "GTC/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 250000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "250000", + "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2550.0" + "cum": "2775.0" } }, { "tier": 6.0, "symbol": "GTC/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { "bracket": "6", "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "12975.0" + "cum": "6945.0" } }, { "tier": 7.0, "symbol": "GTC/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", + "notionalCap": "2500000", + "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "54625.0" + "cum": "27770.0" } }, { "tier": 8.0, "symbol": "GTC/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "652770.0" } } ], @@ -41396,14 +41177,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -41421,7 +41202,7 @@ "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { @@ -41429,23 +41210,23 @@ "symbol": "HMSTR/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "20000", + "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", - "cum": "300.0" + "cum": "275.0" } }, { "tier": 4.0, "symbol": "HMSTR/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, + "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, @@ -41453,9 +41234,9 @@ "bracket": "4", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "25000", "maintMarginRatio": "0.1", - "cum": "1300.0" + "cum": "1525.0" } }, { @@ -41463,67 +41244,67 @@ "symbol": "HMSTR/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 250000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "250000", + "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2550.0" + "cum": "2775.0" } }, { "tier": 6.0, "symbol": "HMSTR/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { "bracket": "6", "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "12975.0" + "cum": "6945.0" } }, { "tier": 7.0, "symbol": "HMSTR/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", + "notionalCap": "2500000", + "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "54625.0" + "cum": "27770.0" } }, { "tier": 8.0, "symbol": "HMSTR/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "652770.0" } } ], @@ -41877,15 +41658,15 @@ "symbol": "HOOK/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "10", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -41893,119 +41674,85 @@ "tier": 2.0, "symbol": "HOOK/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 10000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "initialLeverage": "5", + "notionalCap": "60000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "HOOK/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 60000.0, + "maxNotional": 70000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" + "initialLeverage": "4", + "notionalCap": "70000", + "notionalFloor": "60000", + "maintMarginRatio": "0.125", + "cum": "2000.0" } }, { "tier": 4.0, "symbol": "HOOK/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 70000.0, + "maxNotional": 700000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "20000", - "maintMarginRatio": "0.1", - "cum": "1300.0" + "initialLeverage": "3", + "notionalCap": "700000", + "notionalFloor": "70000", + "maintMarginRatio": "0.1667", + "cum": "4919.0" } }, { "tier": 5.0, "symbol": "HOOK/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 700000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2550.0" + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "700000", + "maintMarginRatio": "0.25", + "cum": "63229.0" } }, { "tier": 6.0, "symbol": "HOOK/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "12975.0" - } - }, - { - "tier": 7.0, - "symbol": "HOOK/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "54625.0" - } - }, - { - "tier": 8.0, - "symbol": "HOOK/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "688229.0" } } ], @@ -58622,14 +58369,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -58647,7 +58394,7 @@ "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { @@ -58655,23 +58402,23 @@ "symbol": "NFP/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "20000", + "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", - "cum": "300.0" + "cum": "275.0" } }, { "tier": 4.0, "symbol": "NFP/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, + "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, @@ -58679,9 +58426,9 @@ "bracket": "4", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "25000", "maintMarginRatio": "0.1", - "cum": "1300.0" + "cum": "1525.0" } }, { @@ -58689,67 +58436,67 @@ "symbol": "NFP/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 250000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "250000", + "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2550.0" + "cum": "2775.0" } }, { "tier": 6.0, "symbol": "NFP/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { "bracket": "6", "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "12975.0" + "cum": "6945.0" } }, { "tier": 7.0, "symbol": "NFP/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", + "notionalCap": "2500000", + "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "54625.0" + "cum": "27770.0" } }, { "tier": 8.0, "symbol": "NFP/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "652770.0" } } ], @@ -59052,15 +58799,15 @@ "symbol": "NKN/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "25", - "notionalCap": "5000", + "initialLeverage": "10", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -59068,119 +58815,85 @@ "tier": 2.0, "symbol": "NKN/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 10000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" + "initialLeverage": "5", + "notionalCap": "60000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "NKN/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 60000.0, + "maxNotional": 70000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "25000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" + "initialLeverage": "4", + "notionalCap": "70000", + "notionalFloor": "60000", + "maintMarginRatio": "0.125", + "cum": "2000.0" } }, { "tier": 4.0, "symbol": "NKN/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 70000.0, + "maxNotional": 700000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "25000", - "maintMarginRatio": "0.1", - "cum": "1525.0" + "initialLeverage": "3", + "notionalCap": "700000", + "notionalFloor": "70000", + "maintMarginRatio": "0.1667", + "cum": "4919.0" } }, { "tier": 5.0, "symbol": "NKN/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 700000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "100000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2775.0" + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "700000", + "maintMarginRatio": "0.25", + "cum": "63229.0" } }, { "tier": 6.0, "symbol": "NKN/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "250000", - "notionalFloor": "100000", - "maintMarginRatio": "0.1667", - "cum": "6945.0" - } - }, - { - "tier": 7.0, - "symbol": "NKN/USDT:USDT", - "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.25", - "cum": "27770.0" - } - }, - { - "tier": 8.0, - "symbol": "NKN/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 800000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "800000", - "notionalFloor": "500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "152770.0" + "cum": "688229.0" } } ], @@ -64908,15 +64621,15 @@ "symbol": "PIPPIN/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 2000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "20", + "notionalCap": "2000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.025", "cum": "0.0" } }, @@ -64924,16 +64637,16 @@ "tier": 2.0, "symbol": "PIPPIN/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, + "minNotional": 2000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", + "notionalFloor": "2000", + "maintMarginRatio": "0.05", "cum": "50.0" } }, @@ -64942,101 +64655,84 @@ "symbol": "PIPPIN/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "20000", + "initialLeverage": "5", + "notionalCap": "60000", "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" + "maintMarginRatio": "0.1", + "cum": "550.0" } }, { "tier": 4.0, "symbol": "PIPPIN/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 60000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "20000", - "maintMarginRatio": "0.1", - "cum": "1300.0" + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "60000", + "maintMarginRatio": "0.125", + "cum": "2050.0" } }, { "tier": 5.0, "symbol": "PIPPIN/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 100000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2550.0" + "initialLeverage": "3", + "notionalCap": "500000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "6220.0" } }, { "tier": 6.0, "symbol": "PIPPIN/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "minNotional": 500000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "6", - "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "12975.0" + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.25", + "cum": "47870.0" } }, { "tier": 7.0, "symbol": "PIPPIN/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "54625.0" - } - }, - { - "tier": 8.0, - "symbol": "PIPPIN/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "672870.0" } } ], @@ -67580,14 +67276,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -67605,7 +67301,7 @@ "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { @@ -67613,23 +67309,23 @@ "symbol": "PUFFER/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "20000", + "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", - "cum": "300.0" + "cum": "275.0" } }, { "tier": 4.0, "symbol": "PUFFER/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, + "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, @@ -67637,9 +67333,9 @@ "bracket": "4", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "25000", "maintMarginRatio": "0.1", - "cum": "1300.0" + "cum": "1525.0" } }, { @@ -67647,67 +67343,67 @@ "symbol": "PUFFER/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 250000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "250000", + "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2550.0" + "cum": "2775.0" } }, { "tier": 6.0, "symbol": "PUFFER/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { "bracket": "6", "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "12975.0" + "cum": "6945.0" } }, { "tier": 7.0, "symbol": "PUFFER/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", + "notionalCap": "2500000", + "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "54625.0" + "cum": "27770.0" } }, { "tier": 8.0, "symbol": "PUFFER/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "652770.0" } } ], @@ -69142,6 +68838,127 @@ } } ], + "RAVE/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "RAVE/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "1", + "initialLeverage": "20", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.025", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "RAVE/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.05", + "cum": "125.0" + } + }, + { + "tier": 3.0, + "symbol": "RAVE/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "625.0" + } + }, + { + "tier": 4.0, + "symbol": "RAVE/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "4", + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "1875.0" + } + }, + { + "tier": 5.0, + "symbol": "RAVE/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "5", + "initialLeverage": "3", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "6045.0" + } + }, + { + "tier": 6.0, + "symbol": "RAVE/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.25", + "cum": "26870.0" + } + }, + { + "tier": 7.0, + "symbol": "RAVE/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "800000", + "notionalFloor": "500000", + "maintMarginRatio": "0.5", + "cum": "151870.0" + } + } + ], "RAY/USDT:USDT": [ { "tier": 1.0, @@ -69425,14 +69242,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -69450,7 +69267,7 @@ "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { @@ -69458,23 +69275,23 @@ "symbol": "RDNT/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "20000", + "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", - "cum": "300.0" + "cum": "275.0" } }, { "tier": 4.0, "symbol": "RDNT/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, + "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, @@ -69482,9 +69299,9 @@ "bracket": "4", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "25000", "maintMarginRatio": "0.1", - "cum": "1300.0" + "cum": "1525.0" } }, { @@ -69492,67 +69309,67 @@ "symbol": "RDNT/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 250000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "250000", + "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2550.0" + "cum": "2775.0" } }, { "tier": 6.0, "symbol": "RDNT/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { "bracket": "6", "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "12975.0" + "cum": "6945.0" } }, { "tier": 7.0, "symbol": "RDNT/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", + "notionalCap": "2500000", + "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "54625.0" + "cum": "27770.0" } }, { "tier": 8.0, "symbol": "RDNT/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "652770.0" } } ], @@ -80262,14 +80079,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -80287,7 +80104,7 @@ "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { @@ -80295,23 +80112,23 @@ "symbol": "SWARMS/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "20000", + "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", - "cum": "300.0" + "cum": "275.0" } }, { "tier": 4.0, "symbol": "SWARMS/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, + "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, @@ -80319,9 +80136,9 @@ "bracket": "4", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "25000", "maintMarginRatio": "0.1", - "cum": "1300.0" + "cum": "1525.0" } }, { @@ -80329,67 +80146,67 @@ "symbol": "SWARMS/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 250000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "250000", + "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2550.0" + "cum": "2775.0" } }, { "tier": 6.0, "symbol": "SWARMS/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { "bracket": "6", "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "12975.0" + "cum": "6945.0" } }, { "tier": 7.0, "symbol": "SWARMS/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", + "notionalCap": "2500000", + "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "54625.0" + "cum": "27770.0" } }, { "tier": 8.0, "symbol": "SWARMS/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "652770.0" } } ], @@ -80762,15 +80579,15 @@ "symbol": "SYN/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "10", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -80778,119 +80595,85 @@ "tier": 2.0, "symbol": "SYN/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 10000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "initialLeverage": "5", + "notionalCap": "60000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "SYN/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 60000.0, + "maxNotional": 70000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" + "initialLeverage": "4", + "notionalCap": "70000", + "notionalFloor": "60000", + "maintMarginRatio": "0.125", + "cum": "2000.0" } }, { "tier": 4.0, "symbol": "SYN/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 70000.0, + "maxNotional": 700000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "20000", - "maintMarginRatio": "0.1", - "cum": "1300.0" + "initialLeverage": "3", + "notionalCap": "700000", + "notionalFloor": "70000", + "maintMarginRatio": "0.1667", + "cum": "4919.0" } }, { "tier": 5.0, "symbol": "SYN/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 700000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2550.0" + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "700000", + "maintMarginRatio": "0.25", + "cum": "63229.0" } }, { "tier": 6.0, "symbol": "SYN/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "12975.0" - } - }, - { - "tier": 7.0, - "symbol": "SYN/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "54625.0" - } - }, - { - "tier": 8.0, - "symbol": "SYN/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "688229.0" } } ], @@ -81452,15 +81235,15 @@ "symbol": "TAC/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "10", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -81468,119 +81251,85 @@ "tier": 2.0, "symbol": "TAC/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 10000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "initialLeverage": "5", + "notionalCap": "60000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "TAC/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 60000.0, + "maxNotional": 70000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" + "initialLeverage": "4", + "notionalCap": "70000", + "notionalFloor": "60000", + "maintMarginRatio": "0.125", + "cum": "2000.0" } }, { "tier": 4.0, "symbol": "TAC/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 70000.0, + "maxNotional": 700000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "20000", - "maintMarginRatio": "0.1", - "cum": "1300.0" + "initialLeverage": "3", + "notionalCap": "700000", + "notionalFloor": "70000", + "maintMarginRatio": "0.1667", + "cum": "4919.0" } }, { "tier": 5.0, "symbol": "TAC/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 700000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2550.0" + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "700000", + "maintMarginRatio": "0.25", + "cum": "63229.0" } }, { "tier": 6.0, "symbol": "TAC/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "12975.0" - } - }, - { - "tier": 7.0, - "symbol": "TAC/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "54625.0" - } - }, - { - "tier": 8.0, - "symbol": "TAC/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "688229.0" } } ], @@ -82884,14 +82633,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -82909,7 +82658,7 @@ "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { @@ -82917,23 +82666,23 @@ "symbol": "TLM/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "20000", + "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", - "cum": "300.0" + "cum": "275.0" } }, { "tier": 4.0, "symbol": "TLM/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, + "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, @@ -82941,9 +82690,9 @@ "bracket": "4", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "25000", "maintMarginRatio": "0.1", - "cum": "1300.0" + "cum": "1525.0" } }, { @@ -82951,67 +82700,67 @@ "symbol": "TLM/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 250000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "250000", + "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2550.0" + "cum": "2775.0" } }, { "tier": 6.0, "symbol": "TLM/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { "bracket": "6", "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "12975.0" + "cum": "6945.0" } }, { "tier": 7.0, "symbol": "TLM/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", + "notionalCap": "2500000", + "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "54625.0" + "cum": "27770.0" } }, { "tier": 8.0, "symbol": "TLM/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "652770.0" } } ], @@ -85296,14 +85045,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -85321,7 +85070,7 @@ "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { @@ -85329,23 +85078,23 @@ "symbol": "TST/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "20000", + "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", - "cum": "300.0" + "cum": "275.0" } }, { "tier": 4.0, "symbol": "TST/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, + "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, @@ -85353,9 +85102,9 @@ "bracket": "4", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "25000", "maintMarginRatio": "0.1", - "cum": "1300.0" + "cum": "1525.0" } }, { @@ -85363,67 +85112,67 @@ "symbol": "TST/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 250000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "250000", + "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2550.0" + "cum": "2775.0" } }, { "tier": 6.0, "symbol": "TST/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { "bracket": "6", "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "12975.0" + "cum": "6945.0" } }, { "tier": 7.0, "symbol": "TST/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", + "notionalCap": "2500000", + "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "54625.0" + "cum": "27770.0" } }, { "tier": 8.0, "symbol": "TST/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "652770.0" } } ], @@ -85761,14 +85510,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -85786,7 +85535,7 @@ "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { @@ -85794,23 +85543,23 @@ "symbol": "TUT/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "20000", + "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", - "cum": "300.0" + "cum": "275.0" } }, { "tier": 4.0, "symbol": "TUT/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, + "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, @@ -85818,9 +85567,9 @@ "bracket": "4", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "25000", "maintMarginRatio": "0.1", - "cum": "1300.0" + "cum": "1525.0" } }, { @@ -85828,67 +85577,67 @@ "symbol": "TUT/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 250000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "250000", + "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2550.0" + "cum": "2775.0" } }, { "tier": 6.0, "symbol": "TUT/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { "bracket": "6", "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "12975.0" + "cum": "6945.0" } }, { "tier": 7.0, "symbol": "TUT/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", + "notionalCap": "2500000", + "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "54625.0" + "cum": "27770.0" } }, { "tier": 8.0, "symbol": "TUT/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "652770.0" } } ], @@ -86960,6 +86709,144 @@ } } ], + "US/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "US/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 40.0, + "info": { + "bracket": "1", + "initialLeverage": "40", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.02", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "US/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "US/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "20000", + "notionalFloor": "10000", + "maintMarginRatio": "0.05", + "cum": "275.0" + } + }, + { + "tier": 4.0, + "symbol": "US/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1275.0" + } + }, + { + "tier": 5.0, + "symbol": "US/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "2525.0" + } + }, + { + "tier": 6.0, + "symbol": "US/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "6", + "initialLeverage": "3", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "6695.0" + } + }, + { + "tier": 7.0, + "symbol": "US/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.25", + "cum": "27520.0" + } + }, + { + "tier": 8.0, + "symbol": "US/USDT:USDT", + "currency": "USDT", + "minNotional": 2500000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "5000000", + "notionalFloor": "2500000", + "maintMarginRatio": "0.5", + "cum": "652520.0" + } + } + ], "USDC/USDT:USDT": [ { "tier": 1.0, @@ -88570,14 +88457,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -88595,7 +88482,7 @@ "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { @@ -88603,23 +88490,23 @@ "symbol": "VIC/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "20000", + "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.05", - "cum": "300.0" + "cum": "275.0" } }, { "tier": 4.0, "symbol": "VIC/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, + "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, @@ -88627,9 +88514,9 @@ "bracket": "4", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "20000", + "notionalFloor": "25000", "maintMarginRatio": "0.1", - "cum": "1300.0" + "cum": "1525.0" } }, { @@ -88637,67 +88524,67 @@ "symbol": "VIC/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 250000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "250000", + "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2550.0" + "cum": "2775.0" } }, { "tier": 6.0, "symbol": "VIC/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { "bracket": "6", "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1667", - "cum": "12975.0" + "cum": "6945.0" } }, { "tier": 7.0, "symbol": "VIC/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, + "minNotional": 250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", + "notionalCap": "2500000", + "notionalFloor": "250000", "maintMarginRatio": "0.25", - "cum": "54625.0" + "cum": "27770.0" } }, { "tier": 8.0, "symbol": "VIC/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "652770.0" } } ], @@ -91837,6 +91724,161 @@ } } ], + "XAU/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "XAU/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.015", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "XAU/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "XAU/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "XAU/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 62500.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "62500", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 5.0, + "symbol": "XAU/USDT:USDT", + "currency": "USDT", + "minNotional": 62500.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "125000", + "notionalFloor": "62500", + "maintMarginRatio": "0.1", + "cum": "3825.0" + } + }, + { + "tier": 6.0, + "symbol": "XAU/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.125", + "cum": "6950.0" + } + }, + { + "tier": 7.0, + "symbol": "XAU/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1667", + "cum": "17375.0" + } + }, + { + "tier": 8.0, + "symbol": "XAU/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.25", + "cum": "59025.0" + } + }, + { + "tier": 9.0, + "symbol": "XAU/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "1934025.0" + } + } + ], "XCN/USDT:USDT": [ { "tier": 1.0, @@ -92412,15 +92454,15 @@ "symbol": "XNY/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "10", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -92428,119 +92470,85 @@ "tier": 2.0, "symbol": "XNY/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 10000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "initialLeverage": "5", + "notionalCap": "60000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "XNY/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 60000.0, + "maxNotional": 70000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" + "initialLeverage": "4", + "notionalCap": "70000", + "notionalFloor": "60000", + "maintMarginRatio": "0.125", + "cum": "2000.0" } }, { "tier": 4.0, "symbol": "XNY/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 70000.0, + "maxNotional": 700000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "20000", - "maintMarginRatio": "0.1", - "cum": "1300.0" + "initialLeverage": "3", + "notionalCap": "700000", + "notionalFloor": "70000", + "maintMarginRatio": "0.1667", + "cum": "4919.0" } }, { "tier": 5.0, "symbol": "XNY/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 700000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2550.0" + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "700000", + "maintMarginRatio": "0.25", + "cum": "63229.0" } }, { "tier": 6.0, "symbol": "XNY/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "12975.0" - } - }, - { - "tier": 7.0, - "symbol": "XNY/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "54625.0" - } - }, - { - "tier": 8.0, - "symbol": "XNY/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1929625.0" + "cum": "688229.0" } } ], From 21d723b35dcab4c0b56a750aa5ba7e6f8f979d41 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 18 Dec 2025 07:06:34 +0100 Subject: [PATCH 117/117] chore(ci): visualize disk sizes for docker build --- .github/workflows/docker-build.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index 500e02614..d0169dc2d 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -37,6 +37,9 @@ jobs: with: persist-credentials: false + - name: Visualize disk usage before build + run: df -h + - name: Set docker tag names id: tags uses: ./.github/actions/docker-tags @@ -142,6 +145,9 @@ jobs: run: | docker images + - name: Visualize disk usage after build + run: df -h + deploy-arm: name: "Deploy Docker ARM64" permissions: