diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 969d1cea241..297c72ed8d4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -46,7 +46,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.cache/pip - key: test-${{ matrix.os }}-${{ matrix.python-version }}-pip + key: pip-${{ matrix.python-version }}-ubuntu - name: TA binary *nix if: steps.cache.outputs.cache-hit != 'true' @@ -167,7 +167,7 @@ jobs: uses: actions/cache@v4 with: path: ~/Library/Caches/pip - key: ${{ matrix.os }}-${{ matrix.python-version }}-pip + key: pip-${{ matrix.os }}-${{ matrix.python-version }} - name: TA binary *nix if: steps.cache.outputs.cache-hit != 'true' @@ -196,7 +196,7 @@ jobs: rm /usr/local/bin/python3.11-config || true rm /usr/local/bin/python3.12-config || true - brew install hdf5 c-blosc libomp + brew install libomp - name: Installation (python) run: | @@ -276,14 +276,23 @@ jobs: with: python-version: ${{ matrix.python-version }} - - name: Pip cache (Windows) - uses: actions/cache@v4 + - name: Install uv + uses: astral-sh/setup-uv@v5 with: - path: ~\AppData\Local\pip\Cache - key: ${{ matrix.os }}-${{ matrix.python-version }}-pip + enable-cache: true + cache-dependency-glob: "requirements**.txt" + cache-suffix: "${{ matrix.python-version }}" + prune-cache: false - name: Installation run: | + uv venv + .venv\Scripts\activate + # persist the venv path for future steps + "$(pwd)/.venv/Scripts" >> $env:GITHUB_PATH + + function uvpipFunction { uv pip $args } + Set-Alias -name pip -value uvpipFunction ./build_helpers/install_windows.ps1 - name: Tests @@ -420,7 +429,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.cache/pip - key: test-${{ matrix.os }}-${{ matrix.python-version }}-pip + key: pip-3.12-ubuntu - name: TA binary *nix if: steps.cache.outputs.cache-hit != 'true' @@ -517,14 +526,14 @@ jobs: ft_client/dist retention-days: 10 - deploy-pypi: - name: "Deploy to PyPI" + deploy-test-pypi: + name: "Publish Python 🐍 distribution 📦 to TestPyPI" needs: [ build ] runs-on: ubuntu-22.04 if: (github.event_name == 'release') environment: - name: release - url: https://pypi.org/p/freqtrade + name: testpypi + url: https://test.pypi.org/p/freqtrade permissions: id-token: write @@ -538,14 +547,35 @@ jobs: path: dist merge-multiple: true - - name: Publish to PyPI (Test) - uses: pypa/gh-action-pypi-publish@v1.10.3 + uses: pypa/gh-action-pypi-publish@v1.12.3 with: repository-url: https://test.pypi.org/legacy/ + + deploy-pypi: + name: "Publish Python 🐍 distribution 📦 to PyPI" + needs: [ build ] + runs-on: ubuntu-22.04 + if: (github.event_name == 'release') + environment: + name: pypi + url: https://pypi.org/p/freqtrade + permissions: + id-token: write + + steps: + - uses: actions/checkout@v4 + + - name: Download artifact 📦 + uses: actions/download-artifact@v4 + with: + pattern: freqtrade*-build + path: dist + merge-multiple: true + - name: Publish to PyPI - uses: pypa/gh-action-pypi-publish@v1.10.3 + uses: pypa/gh-action-pypi-publish@v1.12.3 deploy-docker: diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 67185b19cc4..fdde3a6c6bf 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,7 +9,7 @@ repos: # stages: [push] - repo: https://github.com/pre-commit/mirrors-mypy - rev: "v1.12.1" + rev: "v1.14.0" hooks: - id: mypy exclude: build_helpers @@ -17,8 +17,8 @@ repos: - types-cachetools==5.5.0.20240820 - types-filelock==3.2.7 - types-requests==2.32.0.20241016 - - types-tabulate==0.9.0.20240106 - - types-python-dateutil==2.9.0.20241003 + - types-tabulate==0.9.0.20241207 + - types-python-dateutil==2.9.0.20241206 - SQLAlchemy==2.0.36 # stages: [push] @@ -31,7 +31,7 @@ repos: - repo: https://github.com/charliermarsh/ruff-pre-commit # Ruff version. - rev: 'v0.7.0' + rev: 'v0.8.4' hooks: - id: ruff - id: ruff-format @@ -56,6 +56,11 @@ repos: .*\.md )$ + - repo: https://github.com/stefmolin/exif-stripper + rev: 0.6.1 + hooks: + - id: strip-exif + - repo: https://github.com/codespell-project/codespell rev: v2.3.0 hooks: diff --git a/README.md b/README.md index 9f4fc51fbb9..5a4330bb9ac 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ Please read the [exchange specific notes](docs/exchanges.md) to learn about even - [X] [Bybit](https://bybit.com/) - [X] [Gate.io](https://www.gate.io/ref/6266643) - [X] [HTX](https://www.htx.com/) (Former Huobi) +- [X] [Hyperliquid](https://hyperliquid.xyz/) (A decentralized exchange, or DEX) - [X] [Kraken](https://kraken.com/) - [X] [OKX](https://okx.com/) (Former OKEX) - [ ] [potentially many others](https://github.com/ccxt/ccxt/). _(We cannot guarantee they will work)_ @@ -41,6 +42,7 @@ Please read the [exchange specific notes](docs/exchanges.md) to learn about even - [X] [Binance](https://www.binance.com/) - [X] [Gate.io](https://www.gate.io/ref/6266643) +- [X] [Hyperliquid](https://hyperliquid.xyz/) (A decentralized exchange, or DEX) - [X] [OKX](https://okx.com/) - [X] [Bybit](https://bybit.com/) diff --git a/build_helpers/TA_Lib-0.4.32-cp310-cp310-win_amd64.whl b/build_helpers/TA_Lib-0.4.32-cp310-cp310-win_amd64.whl deleted file mode 100644 index d31d63db867..00000000000 Binary files a/build_helpers/TA_Lib-0.4.32-cp310-cp310-win_amd64.whl and /dev/null differ diff --git a/build_helpers/TA_Lib-0.4.32-cp311-cp311-linux_armv7l.whl b/build_helpers/TA_Lib-0.4.32-cp311-cp311-linux_armv7l.whl deleted file mode 100644 index e69bdd97d27..00000000000 Binary files a/build_helpers/TA_Lib-0.4.32-cp311-cp311-linux_armv7l.whl and /dev/null differ diff --git a/build_helpers/TA_Lib-0.4.32-cp311-cp311-win_amd64.whl b/build_helpers/TA_Lib-0.4.32-cp311-cp311-win_amd64.whl deleted file mode 100644 index e992ece01ca..00000000000 Binary files a/build_helpers/TA_Lib-0.4.32-cp311-cp311-win_amd64.whl and /dev/null differ diff --git a/build_helpers/TA_Lib-0.4.32-cp312-cp312-win_amd64.whl b/build_helpers/TA_Lib-0.4.32-cp312-cp312-win_amd64.whl deleted file mode 100644 index 98845c4092c..00000000000 Binary files a/build_helpers/TA_Lib-0.4.32-cp312-cp312-win_amd64.whl and /dev/null differ diff --git a/build_helpers/install_windows.ps1 b/build_helpers/install_windows.ps1 index 4aa070992c1..919d8b7dac0 100644 --- a/build_helpers/install_windows.ps1 +++ b/build_helpers/install_windows.ps1 @@ -1,11 +1,10 @@ # vendored Wheels compiled via https://github.com/xmatthias/ta-lib-python/tree/ta_bundled_040 -python -m pip install --upgrade pip wheel +python -m pip install --upgrade pip +python -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')" -$pyv = python -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')" - - -pip install --find-links=build_helpers\ --prefer-binary TA-Lib +pip install -U wheel "numpy<2" +pip install --only-binary ta-lib --find-links=build_helpers\ ta-lib pip install -r requirements-dev.txt pip install -e . diff --git a/build_helpers/pyarrow-17.0.0-cp311-cp311-linux_armv7l.whl b/build_helpers/pyarrow-18.1.0-cp311-cp311-linux_armv7l.whl similarity index 62% rename from build_helpers/pyarrow-17.0.0-cp311-cp311-linux_armv7l.whl rename to build_helpers/pyarrow-18.1.0-cp311-cp311-linux_armv7l.whl index 4fe505588c5..d40603a5f1d 100644 Binary files a/build_helpers/pyarrow-17.0.0-cp311-cp311-linux_armv7l.whl and b/build_helpers/pyarrow-18.1.0-cp311-cp311-linux_armv7l.whl differ diff --git a/build_helpers/schema.json b/build_helpers/schema.json index 6a73e75b009..5c9844975dc 100644 --- a/build_helpers/schema.json +++ b/build_helpers/schema.json @@ -102,8 +102,17 @@ }, "dry_run_wallet": { "description": "Initial wallet balance for dry run mode.", - "type": "number", - "default": 1000 + "type": [ + "number", + "object" + ], + "default": 1000, + "patternProperties": { + "^[a-zA-Z0-9]+$": { + "type": "number" + } + }, + "additionalProperties": false }, "cancel_open_orders_on_exit": { "description": "Cancel open orders when exiting.", @@ -592,7 +601,11 @@ "type": "string" }, "chat_id": { - "description": "Telegram chat ID", + "description": "Telegram chat or group ID", + "type": "string" + }, + "topic_id": { + "description": "Telegram topic ID - only applicable for group chats", "type": "string" }, "allow_custom_messages": { @@ -682,12 +695,18 @@ }, "exit_fill": { "description": "Telegram setting for exit fill signals.", - "type": "string", - "enum": [ - "on", - "off", - "silent" + "type": [ + "string", + "object" ], + "additionalProperties": { + "type": "string", + "enum": [ + "on", + "off", + "silent" + ] + }, "default": "on" }, "exit_cancel": { @@ -1383,6 +1402,11 @@ "type": "string", "default": "example" }, + "wait_for_training_iteration_on_reload": { + "description": "Wait for the next training iteration to complete after /reload or ctrl+c.", + "type": "boolean", + "default": true + }, "feature_parameters": { "description": "The parameters used to engineer the feature set", "type": "object", diff --git a/build_helpers/ta_lib-0.4.34-cp310-cp310-win_amd64.whl b/build_helpers/ta_lib-0.4.34-cp310-cp310-win_amd64.whl new file mode 100644 index 00000000000..32bb10e4faf Binary files /dev/null and b/build_helpers/ta_lib-0.4.34-cp310-cp310-win_amd64.whl differ diff --git a/build_helpers/ta_lib-0.4.34-cp311-cp311-linux_armv7l.whl b/build_helpers/ta_lib-0.4.34-cp311-cp311-linux_armv7l.whl new file mode 100644 index 00000000000..58136192584 Binary files /dev/null and b/build_helpers/ta_lib-0.4.34-cp311-cp311-linux_armv7l.whl differ diff --git a/build_helpers/ta_lib-0.4.34-cp311-cp311-win_amd64.whl b/build_helpers/ta_lib-0.4.34-cp311-cp311-win_amd64.whl new file mode 100644 index 00000000000..3513df4ba86 Binary files /dev/null and b/build_helpers/ta_lib-0.4.34-cp311-cp311-win_amd64.whl differ diff --git a/build_helpers/ta_lib-0.4.34-cp312-cp312-win_amd64.whl b/build_helpers/ta_lib-0.4.34-cp312-cp312-win_amd64.whl new file mode 100644 index 00000000000..212668e58ce Binary files /dev/null and b/build_helpers/ta_lib-0.4.34-cp312-cp312-win_amd64.whl differ diff --git a/docs/advanced-hyperopt.md b/docs/advanced-hyperopt.md index e276bed94ec..b12d8f5b662 100644 --- a/docs/advanced-hyperopt.md +++ b/docs/advanced-hyperopt.md @@ -37,8 +37,9 @@ class SuperDuperHyperOptLoss(IHyperOptLoss): min_date: datetime, max_date: datetime, config: Config, - processed: Dict[str, DataFrame], - backtest_stats: Dict[str, Any], + processed: dict[str, DataFrame], + backtest_stats: dict[str, Any], + starting_balance: float, **kwargs, ) -> float: """ @@ -70,6 +71,7 @@ Currently, the arguments are: * `config`: Config object used (Note: Not all strategy-related parameters will be updated here if they are part of a hyperopt space). * `processed`: Dict of Dataframes with the pair as keys containing the data used for backtesting. * `backtest_stats`: Backtesting statistics using the same format as the backtesting file "strategy" substructure. Available fields can be seen in `generate_strategy_stats()` in `optimize_reports.py`. +* `starting_balance`: Starting balance used for backtesting. This function needs to return a floating point number (`float`). Smaller numbers will be interpreted as better results. The parameters and balancing for this is up to you. @@ -103,7 +105,7 @@ class MyAwesomeStrategy(IStrategy): SKDecimal(0.01, 0.20, decimals=3, name='roi_p3'), ] - def generate_roi_table(params: Dict) -> Dict[int, float]: + def generate_roi_table(params: Dict) -> dict[int, float]: roi_table = {} roi_table[0] = params['roi_p1'] + params['roi_p2'] + params['roi_p3'] diff --git a/docs/advanced-orderflow.md b/docs/advanced-orderflow.md index 22a28fe878d..9769b8e922a 100644 --- a/docs/advanced-orderflow.md +++ b/docs/advanced-orderflow.md @@ -4,6 +4,7 @@ This guide walks you through utilizing public trade data for advanced orderflow !!! Warning "Experimental Feature" The orderflow feature is currently in beta and may be subject to changes in future releases. Please report any issues or feedback on the [Freqtrade GitHub repository](https://github.com/freqtrade/freqtrade/issues). + It's also currently not been tested with freqAI - and combining these two features is considered out of scope at this point. !!! Warning "Performance" Orderflow requires raw trades data. This data is rather large, and can cause a slow initial startup, when freqtrade needs to download the trades data for the last X candles. Additionally, enabling this feature will cause increased memory usage. Please ensure to have sufficient resources available. diff --git a/docs/assets/frequi-login-CORS-light.png b/docs/assets/frequi-login-CORS-light.png index 019ae4e8c90..cf6d7a700f7 100644 Binary files a/docs/assets/frequi-login-CORS-light.png and b/docs/assets/frequi-login-CORS-light.png differ diff --git a/docs/assets/telegram_forcebuy.png b/docs/assets/telegram_forcebuy.png index b0592bff357..a75db99b073 100644 Binary files a/docs/assets/telegram_forcebuy.png and b/docs/assets/telegram_forcebuy.png differ diff --git a/docs/backtesting.md b/docs/backtesting.md index 12a6c346ed1..710c4fd0373 100644 --- a/docs/backtesting.md +++ b/docs/backtesting.md @@ -10,12 +10,14 @@ To learn how to get data for the pairs and exchange you're interested in, head o ``` usage: freqtrade backtesting [-h] [-v] [--logfile FILE] [-V] [-c PATH] [-d PATH] [--userdir PATH] [-s NAME] - [--strategy-path PATH] [-i TIMEFRAME] - [--timerange TIMERANGE] - [--data-format-ohlcv {json,jsongz,hdf5}] + [--strategy-path PATH] + [--recursive-strategy-search] + [--freqaimodel NAME] [--freqaimodel-path PATH] + [-i TIMEFRAME] [--timerange TIMERANGE] + [--data-format-ohlcv {json,jsongz,hdf5,feather,parquet}] [--max-open-trades INT] [--stake-amount STAKE_AMOUNT] [--fee FLOAT] - [-p PAIRS [PAIRS ...]] [--eps] [--dmmp] + [-p PAIRS [PAIRS ...]] [--eps] [--enable-protections] [--dry-run-wallet DRY_RUN_WALLET] [--timeframe-detail TIMEFRAME_DETAIL] @@ -24,8 +26,9 @@ usage: freqtrade backtesting [-h] [-v] [--logfile FILE] [-V] [-c PATH] [--export-filename PATH] [--breakdown {day,week,month} [{day,week,month} ...]] [--cache {none,day,week,month}] + [--freqai-backtest-live-models] -optional arguments: +options: -h, --help show this help message and exit -i TIMEFRAME, --timeframe TIMEFRAME Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`). @@ -48,10 +51,6 @@ optional arguments: --eps, --enable-position-stacking Allow buying the same pair multiple times (position stacking). - --dmmp, --disable-max-market-positions - Disable applying `max_open_trades` during backtest - (same as setting `max_open_trades` to a very high - number). --enable-protections, --enableprotections Enable protections for backtesting.Will slow backtesting down by a considerable amount, but will @@ -80,10 +79,13 @@ optional arguments: --cache {none,day,week,month} Load a cached backtest result no older than specified age (default: day). + --freqai-backtest-live-models + Run backtest with ready models. Common arguments: -v, --verbose Verbose mode (-vv for more, -vvv to get all messages). - --logfile FILE Log to the file specified. Special values are: + --logfile FILE, --log-file FILE + Log to the file specified. Special values are: 'syslog', 'journald'. See the documentation for more details. -V, --version show program's version number and exit @@ -92,7 +94,7 @@ Common arguments: `userdir/config.json` or `config.json` whichever exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. - -d PATH, --datadir PATH + -d PATH, --datadir PATH, --data-dir PATH Path to directory with historical backtesting data. --userdir PATH, --user-data-dir PATH Path to userdata directory. @@ -102,6 +104,12 @@ Strategy arguments: Specify strategy class name which will be used by the bot. --strategy-path PATH Specify additional strategy lookup path. + --recursive-strategy-search + Recursively search for a strategy in the strategies + folder. + --freqaimodel NAME Specify a custom freqaimodels. + --freqaimodel-path PATH + Specify additional lookup path for freqaimodels. ``` @@ -558,6 +566,7 @@ Since backtesting lacks some detailed information about what happens within a ca - Stoploss - ROI - Trailing stoploss +- Position reversals (futures only) happen if an entry signal in the other direction than the closing trade triggers at the candle the existing trade closes. Taking these assumptions, backtesting tries to mirror real trading as closely as possible. However, backtesting will **never** replace running a strategy in dry-run mode. Also, keep in mind that past results don't guarantee future success. @@ -572,7 +581,7 @@ These limits are usually listed in the exchange documentation as "trading rules" Backtesting (as well as live and dry-run) does honor these limits, and will ensure that a stoploss can be placed below this value - so the value will be slightly higher than what the exchange specifies. Freqtrade has however no information about historic limits. -This can lead to situations where trading-limits are inflated by using a historic price, resulting in minimum amounts > 50$. +This can lead to situations where trading-limits are inflated by using a historic price, resulting in minimum amounts > 50\$. For example: diff --git a/docs/configuration.md b/docs/configuration.md index 074c9a577f8..fdddf7cdada 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -39,13 +39,19 @@ Please note that Environment variables will overwrite corresponding settings in Common example: -``` +``` bash FREQTRADE__TELEGRAM__CHAT_ID= FREQTRADE__TELEGRAM__TOKEN= FREQTRADE__EXCHANGE__KEY= FREQTRADE__EXCHANGE__SECRET= ``` +Json lists are parsed as json - so you can use the following to set a list of pairs: + +``` bash +export FREQTRADE__EXCHANGE__PAIR_WHITELIST='["BTC/USDT", "ETH/USDT"]' +``` + !!! Note Environment variables detected are logged at startup - so if you can't find why a value is not what you think it should be based on the configuration, make sure it's not loaded from an environment variable. @@ -54,7 +60,7 @@ FREQTRADE__EXCHANGE__SECRET= ??? Warning "Loading sequence" Environment variables are loaded after the initial configuration. As such, you cannot provide the path to the configuration through environment variables. Please use `--config path/to/config.json` for that. - This also applies to user_dir to some degree. while the user directory can be set through environment variables - the configuration will **not** be loaded from that location. + This also applies to `user_dir` to some degree. while the user directory can be set through environment variables - the configuration will **not** be loaded from that location. ### Multiple configuration files @@ -146,10 +152,10 @@ Freqtrade can also load many options via command line (CLI) arguments (check out The prevalence for all Options is as follows: -- CLI arguments override any other option -- [Environment Variables](#environment-variables) -- Configuration files are used in sequence (the last file wins) and override Strategy configurations. -- Strategy configurations are only used if they are not set via configuration or command-line arguments. These options are marked with [Strategy Override](#parameters-in-the-strategy) in the below table. +* CLI arguments override any other option +* [Environment Variables](#environment-variables) +* Configuration files are used in sequence (the last file wins) and override Strategy configurations. +* Strategy configurations are only used if they are not set via configuration or command-line arguments. These options are marked with [Strategy Override](#parameters-in-the-strategy) in the below table. ### Parameters table @@ -168,7 +174,7 @@ Mandatory parameters are marked as **Required**, which means that they are requi | `timeframe` | The timeframe to use (e.g `1m`, `5m`, `15m`, `30m`, `1h` ...). Usually missing in configuration, and specified in the strategy. [Strategy Override](#parameters-in-the-strategy).
**Datatype:** String | `fiat_display_currency` | Fiat currency used to show your profits. [More information below](#what-values-can-be-used-for-fiat_display_currency).
**Datatype:** String | `dry_run` | **Required.** Define if the bot must be in Dry Run or production mode.
*Defaults to `true`.*
**Datatype:** Boolean -| `dry_run_wallet` | Define the starting amount in stake currency for the simulated wallet used by the bot running in Dry Run mode.
*Defaults to `1000`.*
**Datatype:** Float +| `dry_run_wallet` | Define the starting amount in stake currency for the simulated wallet used by the bot running in Dry Run mode. [More information below](#dry-run-wallet)
*Defaults to `1000`.*
**Datatype:** Float or Dict | `cancel_open_orders_on_exit` | Cancel open orders when the `/stop` RPC command is issued, `Ctrl+C` is pressed or the bot dies unexpectedly. When set to `true`, this allows you to use `/stop` to cancel unfilled and partially filled orders in the event of a market crash. It does not impact open positions.
*Defaults to `false`.*
**Datatype:** Boolean | `process_only_new_candles` | Enable processing of indicators only when new candles arrive. If false each loop populates the indicators, this will mean the same candle is processed many times creating system load but can be useful of your strategy depends on tick data not only candle. [Strategy Override](#parameters-in-the-strategy).
*Defaults to `true`.*
**Datatype:** Boolean | `minimal_roi` | **Required.** Set the threshold as ratio the bot will use to exit a trade. [More information below](#understand-minimal_roi). [Strategy Override](#parameters-in-the-strategy).
**Datatype:** Dict @@ -183,7 +189,7 @@ Mandatory parameters are marked as **Required**, which means that they are requi | `margin_mode` | When trading with leverage, this determines if the collateral owned by the trader will be shared or isolated to each trading pair [leverage documentation](leverage.md).
**Datatype:** String | `liquidation_buffer` | A ratio specifying how large of a safety net to place between the liquidation price and the stoploss to prevent a position from reaching the liquidation price [leverage documentation](leverage.md).
*Defaults to `0.05`.*
**Datatype:** Float | | **Unfilled timeout** -| `unfilledtimeout.entry` | **Required.** How long (in minutes or seconds) the bot will wait for an unfilled entry order to complete, after which the order will be cancelled and repeated at current (new) price, as long as there is a signal. [Strategy Override](#parameters-in-the-strategy).
**Datatype:** Integer +| `unfilledtimeout.entry` | **Required.** How long (in minutes or seconds) the bot will wait for an unfilled entry order to complete, after which the order will be cancelled. [Strategy Override](#parameters-in-the-strategy).
**Datatype:** Integer | `unfilledtimeout.exit` | **Required.** How long (in minutes or seconds) the bot will wait for an unfilled exit order to complete, after which the order will be cancelled and repeated at current (new) price, as long as there is a signal. [Strategy Override](#parameters-in-the-strategy).
**Datatype:** Integer | `unfilledtimeout.unit` | Unit to use in unfilledtimeout setting. Note: If you set unfilledtimeout.unit to "seconds", "internals.process_throttle_secs" must be inferior or equal to timeout [Strategy Override](#parameters-in-the-strategy).
*Defaults to `"minutes"`.*
**Datatype:** String | `unfilledtimeout.exit_timeout_count` | How many times can exit orders time out. Once this number of timeouts is reached, an emergency exit is triggered. 0 to disable and allow unlimited order cancels. [Strategy Override](#parameters-in-the-strategy).
*Defaults to `0`.*
**Datatype:** Integer @@ -225,6 +231,7 @@ Mandatory parameters are marked as **Required**, which means that they are requi | `exchange.skip_open_order_update` | Skips open order updates on startup should the exchange cause problems. Only relevant in live conditions.
*Defaults to `false`*
**Datatype:** Boolean | `exchange.unknown_fee_rate` | Fallback value to use when calculating trading fees. This can be useful for exchanges which have fees in non-tradable currencies. The value provided here will be multiplied with the "fee cost".
*Defaults to `None`
**Datatype:** float | `exchange.log_responses` | Log relevant exchange responses. For debug mode only - use with care.
*Defaults to `false`*
**Datatype:** Boolean +| `exchange.only_from_ccxt` | Prevent data-download from data.binance.vision. Leaving this as false can greatly speed up downloads, but may be problematic if the site is not available.
*Defaults to `false`*
**Datatype:** Boolean | `experimental.block_bad_exchanges` | Block exchanges known to not work with freqtrade. Leave on default unless you want to test if that exchange works now.
*Defaults to `true`.*
**Datatype:** Boolean | | **Plugins** | `edge.*` | Please refer to [edge configuration document](edge.md) for detailed explanation of all possible configuration options. @@ -295,10 +302,10 @@ Values set in the configuration file always overwrite values set in the strategy * `order_time_in_force` * `unfilledtimeout` * `disable_dataframe_checks` -- `use_exit_signal` +* `use_exit_signal` * `exit_profit_only` -- `exit_profit_offset` -- `ignore_roi_if_entry_signal` +* `exit_profit_offset` +* `ignore_roi_if_entry_signal` * `ignore_buying_expired_candle_after` * `position_adjustment_enable` * `max_entry_position_adjustment` @@ -311,18 +318,37 @@ There are several methods to configure how much of the stake currency the bot wi The minimum stake amount will depend on exchange and pair and is usually listed in the exchange support pages. -Assuming the minimum tradable amount for XRP/USD is 20 XRP (given by the exchange), and the price is 0.6$, the minimum stake amount to buy this pair is `20 * 0.6 ~= 12`. -This exchange has also a limit on USD - where all orders must be > 10$ - which however does not apply in this case. +Assuming the minimum tradable amount for XRP/USD is 20 XRP (given by the exchange), and the price is 0.6\$, the minimum stake amount to buy this pair is `20 * 0.6 ~= 12`. +This exchange has also a limit on USD - where all orders must be > 10\$ - which however does not apply in this case. -To guarantee safe execution, freqtrade will not allow buying with a stake-amount of 10.1$, instead, it'll make sure that there's enough space to place a stoploss below the pair (+ an offset, defined by `amount_reserve_percent`, which defaults to 5%). +To guarantee safe execution, freqtrade will not allow buying with a stake-amount of 10.1\$, instead, it'll make sure that there's enough space to place a stoploss below the pair (+ an offset, defined by `amount_reserve_percent`, which defaults to 5%). -With a reserve of 5%, the minimum stake amount would be ~12.6$ (`12 * (1 + 0.05)`). If we take into account a stoploss of 10% on top of that - we'd end up with a value of ~14$ (`12.6 / (1 - 0.1)`). +With a reserve of 5%, the minimum stake amount would be ~12.6\$ (`12 * (1 + 0.05)`). If we take into account a stoploss of 10% on top of that - we'd end up with a value of ~14\$ (`12.6 / (1 - 0.1)`). To limit this calculation in case of large stoploss values, the calculated minimum stake-limit will never be more than 50% above the real limit. !!! Warning Since the limits on exchanges are usually stable and are not updated often, some pairs can show pretty high minimum limits, simply because the price increased a lot since the last limit adjustment by the exchange. Freqtrade adjusts the stake-amount to this value, unless it's > 30% more than the calculated/desired stake-amount - in which case the trade is rejected. +#### Dry-run wallet + +When running in dry-run mode, the bot will use a simulated wallet to execute trades. The starting balance of this wallet is defined by `dry_run_wallet` (defaults to 1000). +For more complex scenarios, you can also assign a dictionary to `dry_run_wallet` to define the starting balance for each currency. + +```json +"dry_run_wallet": { + "BTC": 0.01, + "ETH": 2, + "USDT": 1000 +} +``` + +Command line options (`--dry-run-wallet`) can be used to override the configuration value, but only for the float value, not for the dictionary. If you'd like to use the dictionary, please adjust the configuration file. + +!!! Note + Balances not in stake-currency will not be used for trading, but are shown as part of the wallet balance. + On Cross-margin exchanges, the wallet balance may be used to calculate the available collateral for trading. + #### Tradable balance By default, the bot assumes that the `complete amount - 1%` is at it's disposal, and when using [dynamic stake amount](#dynamic-stake-amount), it will split the complete balance into `max_open_trades` buckets per trade. @@ -362,9 +388,9 @@ To overcome this, the option `amend_last_stake_amount` can be set to `True`, whi In the example above this would mean: -- Trade1: 400 USDT -- Trade2: 400 USDT -- Trade3: 200 USDT +* Trade1: 400 USDT +* Trade2: 400 USDT +* Trade3: 200 USDT !!! Note This option only applies with [Static stake amount](#static-stake-amount) - since [Dynamic stake amount](#dynamic-stake-amount) divides the balances evenly. diff --git a/docs/data-download.md b/docs/data-download.md index 59fa23b97be..8b21dc19bf7 100644 --- a/docs/data-download.md +++ b/docs/data-download.md @@ -11,9 +11,8 @@ Without provided configuration, `--exchange` becomes mandatory. You can use a relative timerange (`--days 20`) or an absolute starting point (`--timerange 20200101-`). For incremental downloads, the relative approach should be used. !!! Tip "Tip: Updating existing data" - If you already have backtesting data available in your data-directory and would like to refresh this data up to today, freqtrade will automatically calculate the data missing for the existing pairs and the download will occur from the latest available point until "now", neither --days or --timerange parameters are required. Freqtrade will keep the available data and only download the missing data. - If you are updating existing data after inserting new pairs that you have no data for, use `--new-pairs-days xx` parameter. Specified number of days will be downloaded for new pairs while old pairs will be updated with missing data only. - If you use `--days xx` parameter alone - data for specified number of days will be downloaded for _all_ pairs. Be careful, if specified number of days is smaller than gap between now and last downloaded candle - freqtrade will delete all existing data to avoid gaps in candle data. + If you already have backtesting data available in your data-directory and would like to refresh this data up to today, freqtrade will automatically calculate the missing timerange for the existing pairs and the download will occur from the latest available point until "now", neither `--days` or `--timerange` parameters are required. Freqtrade will keep the available data and only download the missing data. + If you are updating existing data after inserting new pairs that you have no data for, use the `--new-pairs-days xx` parameter. Specified number of days will be downloaded for new pairs while old pairs will be updated with missing data only. ### Usage @@ -90,7 +89,7 @@ Common arguments: !!! Tip "Downloading all data for one quote currency" Often, you'll want to download data for all pairs of a specific quote-currency. In such cases, you can use the following shorthand: - `freqtrade download-data --exchange binance --pairs .*/USDT <...>`. The provided "pairs" string will be expanded to contain all active pairs on the exchange. + `freqtrade download-data --exchange binance --pairs ".*/USDT" <...>`. The provided "pairs" string will be expanded to contain all active pairs on the exchange. To also download data for inactive (delisted) pairs, add `--include-inactive-pairs` to the command. !!! Note "Startup period" @@ -117,16 +116,17 @@ freqtrade download-data --exchange binance --pairs ETH/USDT XRP/USDT BTC/USDT or as regex (in this case, to download all active USDT pairs) ```bash -freqtrade download-data --exchange binance --pairs .*/USDT +freqtrade download-data --exchange binance --pairs ".*/USDT" ``` ### Other Notes * To use a different directory than the exchange specific default, use `--datadir user_data/data/some_directory`. -* To change the exchange used to download the historical data from, please use a different configuration file (you'll probably need to adjust rate limits etc.) +* To change the exchange used to download the historical data from, either use `--exchange ` - or specify a different configuration file. * To use `pairs.json` from some other directory, use `--pairs-file some_other_dir/pairs.json`. * To download historical candle (OHLCV) data for only 10 days, use `--days 10` (defaults to 30 days). * To download historical candle (OHLCV) data from a fixed starting point, use `--timerange 20200101-` - which will download all data from January 1st, 2020. +* 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. @@ -162,7 +162,7 @@ Freqtrade currently supports the following data-formats: * `feather` - a dataformat based on Apache Arrow * `json` - plain "text" json files * `jsongz` - a gzip-zipped version of json files -* `hdf5` - a high performance datastore +* `hdf5` - a high performance datastore (deprecated) * `parquet` - columnar datastore (OHLCV only) By default, both OHLCV data and trades data are stored in the `feather` format. diff --git a/docs/deprecated.md b/docs/deprecated.md index 5357acc623e..744460407e3 100644 --- a/docs/deprecated.md +++ b/docs/deprecated.md @@ -81,4 +81,10 @@ version 2023.3 saw the removal of `populate_any_indicators` in favor of split me ## Removal of `protections` from configuration - Setting protections from the configuration via `"protections": [],` has been removed in 2024.10, after having raised deprecation warnings for over 3 years. +Setting protections from the configuration via `"protections": [],` has been removed in 2024.10, after having raised deprecation warnings for over 3 years. + +## hdf5 data storage + +Using hdf5 as data storage has been deprecated in 2024.12 and will be removed in 2025.1. We recommend switching to the feather data format. + +Please use the [`convert-data` subcommand](data-download.md#sub-command-convert-data) to convert your existing data to one of the supported formats. diff --git a/docs/developer.md b/docs/developer.md index 4e7d4f2f4ab..d66f615fd1a 100644 --- a/docs/developer.md +++ b/docs/developer.md @@ -162,7 +162,7 @@ Hopefully you also want to contribute this back upstream. Whatever your motivations are - This should get you off the ground in trying to develop a new Pairlist Handler. -First of all, have a look at the [VolumePairList](https://github.com/freqtrade/freqtrade/blob/develop/freqtrade/pairlist/VolumePairList.py) Handler, and best copy this file with a name of your new Pairlist Handler. +First of all, have a look at the [VolumePairList](https://github.com/freqtrade/freqtrade/blob/develop/freqtrade/plugins/pairlist/VolumePairList.py) Handler, and best copy this file with a name of your new Pairlist Handler. This is a simple Handler, which however serves as a good example on how to start developing. @@ -226,7 +226,7 @@ In `VolumePairList`, this implements different methods of sorting, does early va ##### sample ``` python - def filter_pairlist(self, pairlist: List[str], tickers: Dict) -> List[str]: + def filter_pairlist(self, pairlist: list[str], tickers: dict) -> List[str]: # Generate dynamic whitelist pairs = self._calculate_pairlist(pairlist, tickers) return pairs diff --git a/docs/exchanges.md b/docs/exchanges.md index f55c45919fa..34a2e4d1425 100644 --- a/docs/exchanges.md +++ b/docs/exchanges.md @@ -252,6 +252,14 @@ OKX requires a passphrase for each api key, you will therefore need to add this Gate.io allows the use of `POINT` to pay for fees. As this is not a tradable currency (no regular market available), automatic fee calculations will fail (and default to a fee of 0). The configuration parameter `exchange.unknown_fee_rate` can be used to specify the exchange rate between Point and the stake currency. Obviously, changing the stake-currency will also require changes to this value. +Gate API keys require the following permissions on top of the market type you want to trade: + +* "Spot Trade" _or_ "Perpetual Futures" (Read and Write) (either select both, or the one matching the market you want to trade) +* "Wallet" (read only) +* "Account" (read only) + +Without these permissions, the bot will not start correctly and show errors like "permission missing". + ## Bybit Futures trading on bybit is currently supported for USDT markets, and will use isolated futures mode. @@ -261,6 +269,7 @@ On startup, freqtrade will set the position mode to "One-way Mode" for the whole As bybit doesn't provide funding rate history, the dry-run calculation is used for live trades as well. API Keys for live futures trading must have the following permissions: + * Read-write * Contract - Orders * Contract - Positions @@ -295,6 +304,41 @@ It's therefore required to pass the UID as well. !!! Warning "Necessary Verification" Bitmart requires Verification Lvl2 to successfully trade on the spot market through the API - even though trading via UI works just fine with just Lvl1 verification. +## Hyperliquid + +!!! Tip "Stoploss on Exchange" + Hyperliquid supports `stoploss_on_exchange` and uses `stop-loss-limit` orders. It provides great advantages, so we recommend to benefit from it. + +Hyperliquid is a Decentralized Exchange (DEX). Decentralized exchanges work a bit different compared to normal exchanges. Instead of authenticating private API calls using an API key, private API calls need to be signed with the private key of your wallet (We recommend using an api Wallet for this, generated either on Hyperliquid or in your wallet of choice). +This needs to be configured like this: + +```json +"exchange": { + "name": "hyperliquid", + "walletAddress": "your_eth_wallet_address", + "privateKey": "your_api_private_key", + // ... +} +``` + +* walletAddress in hex format: `0x<40 hex characters>` - Can be easily copied from your wallet - and should be your wallet address, not your API Wallet Address. +* privateKey in hex format: `0x<64 hex characters>` - Use the key the API Wallet shows on creation. + +Hyperliquid handles deposits and withdrawals on the Arbitrum One chain, a Layer 2 scaling solution built on top of Ethereum. Hyperliquid uses USDC as quote / collateral. The process of depositing USDC on Hyperliquid requires a couple of steps, see [how to start trading](https://hyperliquid.gitbook.io/hyperliquid-docs/onboarding/how-to-start-trading) for details on what steps are needed. + +!!! Note "Hyperliquid general usage Notes" + Hyperliquid does not support market orders, however ccxt will simulate market orders by placing limit orders with a maximum slippage of 5%. + Unfortunately, hyperliquid only offers 5000 historic candles, so backtesting will either need to build candles historically (by waiting and downloading the data incrementally over time) - or will be limited to the last 5000 candles. + +!!! Info "Some general best practices (non exhaustive)" + * Beware of supply chain attacks, like pip package poisoning etcetera. Whenever you use your private key, make sure your environment is safe. + * Don't use your actual wallet private key for trading. Use the Hyperliquid [API generator](https://app.hyperliquid.xyz/API) to create a separate API wallet. + * Don't store your actual wallet private key on the server you use for freqtrade. Use the API wallet private key instead. This key won't allow withdrawals, only trading. + * Always keep your mnemonic phrase and private key private. + * Don't use the same mnemonic as the one you had to backup when initializing a hardware wallet, using the same mnemonic basically deletes the security of your hardware wallet. + * Create a different software wallet, only transfer the funds you want to trade with to that wallet, and use that wallet to trade on Hyperliquid. + * If you have funds you don't want to use for trading (after making a profit for example), transfer them back to your hardware wallet. + ## All exchanges Should you experience constant errors with Nonce (like `InvalidNonce`), it is best to regenerate the API keys. Resetting Nonce is difficult and it's usually easier to regenerate the API keys. @@ -304,7 +348,7 @@ Should you experience constant errors with Nonce (like `InvalidNonce`), it is be * The Ocean (exchange id: `theocean`) exchange uses Web3 functionality and requires `web3` python package to be installed: ```shell -$ pip3 install web3 +pip3 install web3 ``` ### Getting latest price / Incomplete candles diff --git a/docs/faq.md b/docs/faq.md index 13476557949..c3b18937540 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -40,6 +40,10 @@ This could be caused by the following reasons: * The installation did not complete successfully. * Please check the [Installation documentation](installation.md). +### The bot starts, but in STOPPED mode + +Make sure you set the `initial_state` config option to `"running"` in your config.json + ### I have waited 5 minutes, why hasn't the bot made any trades yet? * Depending on the buy strategy, the amount of whitelisted coins, the @@ -100,6 +104,19 @@ You can use the `/stopentry` command in Telegram to prevent future trade entry, Please look at the [advanced setup documentation Page](advanced-setup.md#running-multiple-instances-of-freqtrade). +### I'm getting "Impossible to load Strategy" when starting the bot + +This error message is shown when the bot cannot load the strategy. +Usually, you can use `freqtrade list-strategies` to list all available strategies. +The output of this command will also include a status column, showing if the strategy can be loaded. + +Please check the following: + +* Are you using the correct strategy name? The strategy name is case-sensitive and must correspond to the Strategy class name (not the filename!). +* Is the strategy in the `user_data/strategies` directory, and has the file-ending `.py`? +* Does the bot show other warnings before this error? Maybe you're missing some dependencies for the strategy - which would be highlighted in the log. +* In case of docker - is the strategy directory mounted correctly (check the volumes part of the docker-compose file)? + ### I'm getting "Missing data fillup" messages in the log This message is just a warning that the latest candles had missing candles in them. @@ -116,6 +133,10 @@ This message is a warning that the candles had a price jump of > 30%. This might be a sign that the pair stopped trading, and some token exchange took place (e.g. COCOS in 2021 - where price jumped from 0.0000154 to 0.01621). This message is often accompanied by ["Missing data fillup"](#im-getting-missing-data-fillup-messages-in-the-log) - as trading on such pairs is often stopped for some time. +### I want to reset the bot's database + +To reset the bot's database, you can either delete the database (by default `tradesv3.sqlite` or `tradesv3.dryrun.sqlite`), or use a different database url via `--db-url` (e.g. `sqlite:///mynewdatabase.sqlite`). + ### I'm getting "Outdated history for pair xxx" in the log The bot is trying to tell you that it got an outdated last candle (not the last complete candle). @@ -146,9 +167,9 @@ The same fix should be applied in the configuration file, if order types are def ### I'm trying to start the bot live, but get an API permission error -Errors like `Invalid API-key, IP, or permissions for action` mean exactly what they actually say. -Your API key is either invalid (copy/paste error? check for leading/trailing spaces in the config), expired, or the IP you're running the bot from is not enabled in the Exchange's API console. -Usually, the permission "Spot Trading" (or the equivalent in the exchange you use) will be necessary. +Errors like `Invalid API-key, IP, or permissions for action` mean exactly what they actually say. +Your API key is either invalid (copy/paste error? check for leading/trailing spaces in the config), expired, or the IP you're running the bot from is not enabled in the Exchange's API console. +Usually, the permission "Spot Trading" (or the equivalent in the exchange you use) will be necessary. Futures will usually have to be enabled specifically. ### How do I search the bot logs for something? diff --git a/docs/freqai-configuration.md b/docs/freqai-configuration.md index 5caa89a420f..7ae2535f6e7 100644 --- a/docs/freqai-configuration.md +++ b/docs/freqai-configuration.md @@ -293,10 +293,10 @@ class MyCoolPyTorchClassifier(BasePyTorchClassifier): super().__init__(**kwargs) config = self.freqai_info.get("model_training_parameters", {}) self.learning_rate: float = config.get("learning_rate", 3e-4) - self.model_kwargs: Dict[str, Any] = config.get("model_kwargs", {}) - self.trainer_kwargs: Dict[str, Any] = config.get("trainer_kwargs", {}) + self.model_kwargs: dict[str, Any] = config.get("model_kwargs", {}) + self.trainer_kwargs: dict[str, Any] = config.get("trainer_kwargs", {}) - def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen, **kwargs) -> Any: + def fit(self, data_dictionary: dict, dk: FreqaiDataKitchen, **kwargs) -> Any: """ User sets up the training and test data to fit their desired model here :param data_dictionary: the dictionary holding all data for train, test, @@ -359,10 +359,10 @@ class PyTorchMLPRegressor(BasePyTorchRegressor): super().__init__(**kwargs) config = self.freqai_info.get("model_training_parameters", {}) self.learning_rate: float = config.get("learning_rate", 3e-4) - self.model_kwargs: Dict[str, Any] = config.get("model_kwargs", {}) - self.trainer_kwargs: Dict[str, Any] = config.get("trainer_kwargs", {}) + self.model_kwargs: dict[str, Any] = config.get("model_kwargs", {}) + self.trainer_kwargs: dict[str, Any] = config.get("trainer_kwargs", {}) - def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen, **kwargs) -> Any: + def fit(self, data_dictionary: dict, dk: FreqaiDataKitchen, **kwargs) -> Any: n_features = data_dictionary["train_features"].shape[-1] model = PyTorchMLPModel( input_dim=n_features, @@ -393,7 +393,7 @@ Here we create a `PyTorchMLPRegressor` class that implements the `fit` method. T For example, if you are using a binary classifier to predict price movements as up or down, you can set the class names as follows: ```python - def set_freqai_targets(self, dataframe: DataFrame, metadata: Dict, **kwargs) -> DataFrame: + def set_freqai_targets(self, dataframe: DataFrame, metadata: dict, **kwargs) -> DataFrame: self.freqai.class_names = ["down", "up"] dataframe['&s-up_or_down'] = np.where(dataframe["close"].shift(-100) > dataframe["close"], 'up', 'down') diff --git a/docs/freqai-parameter-table.md b/docs/freqai-parameter-table.md index 8a02faad260..3bb289313d3 100644 --- a/docs/freqai-parameter-table.md +++ b/docs/freqai-parameter-table.md @@ -22,6 +22,7 @@ Mandatory parameters are marked as **Required** and have to be set in one of the | `write_metrics_to_disk` | Collect train timings, inference timings and cpu usage in json file.
**Datatype:** Boolean.
Default: `False` | `data_kitchen_thread_count` |
Designate the number of threads you want to use for data processing (outlier methods, normalization, etc.). This has no impact on the number of threads used for training. If user does not set it (default), FreqAI will use max number of threads - 2 (leaving 1 physical core available for Freqtrade bot and FreqUI)
**Datatype:** Positive integer. | `activate_tensorboard` |
Indicate whether or not to activate tensorboard for the tensorboard enabled modules (currently Reinforcment Learning, XGBoost, Catboost, and PyTorch). Tensorboard needs Torch installed, which means you will need the torch/RL docker image or you need to answer "yes" to the install question about whether or not you wish to install Torch.
**Datatype:** Boolean.
Default: `True`. +| `wait_for_training_iteration_on_reload` |
When using /reload or ctrl-c, wait for the current training iteration to finish before completing graceful shutdown. If set to `False`, FreqAI will break the current training iteration, allowing you to shutdown gracefully more quickly, but you will lose your current training iteration.
**Datatype:** Boolean.
Default: `True`. ### Feature parameters diff --git a/docs/hyperopt.md b/docs/hyperopt.md index 6788f681ad5..f36b1c6b301 100644 --- a/docs/hyperopt.md +++ b/docs/hyperopt.md @@ -42,11 +42,11 @@ usage: freqtrade hyperopt [-h] [-v] [--logfile FILE] [-V] [-c PATH] [-d PATH] [--recursive-strategy-search] [--freqaimodel NAME] [--freqaimodel-path PATH] [-i TIMEFRAME] [--timerange TIMERANGE] - [--data-format-ohlcv {json,jsongz,hdf5}] + [--data-format-ohlcv {json,jsongz,hdf5,feather,parquet}] [--max-open-trades INT] [--stake-amount STAKE_AMOUNT] [--fee FLOAT] [-p PAIRS [PAIRS ...]] [--hyperopt-path PATH] - [--eps] [--dmmp] [--enable-protections] + [--eps] [--enable-protections] [--dry-run-wallet DRY_RUN_WALLET] [--timeframe-detail TIMEFRAME_DETAIL] [-e INT] [--spaces {all,buy,sell,roi,stoploss,trailing,protection,trades,default} [{all,buy,sell,roi,stoploss,trailing,protection,trades,default} ...]] @@ -55,15 +55,15 @@ usage: freqtrade hyperopt [-h] [-v] [--logfile FILE] [-V] [-c PATH] [-d PATH] [--hyperopt-loss NAME] [--disable-param-export] [--ignore-missing-spaces] [--analyze-per-epoch] -optional arguments: +options: -h, --help show this help message and exit -i TIMEFRAME, --timeframe TIMEFRAME Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`). --timerange TIMERANGE Specify what timerange of data to use. - --data-format-ohlcv {json,jsongz,hdf5} + --data-format-ohlcv {json,jsongz,hdf5,feather,parquet} Storage format for downloaded candle (OHLCV) data. - (default: `json`). + (default: `feather`). --max-open-trades INT Override the value of the `max_open_trades` configuration setting. @@ -80,10 +80,6 @@ optional arguments: --eps, --enable-position-stacking Allow buying the same pair multiple times (position stacking). - --dmmp, --disable-max-market-positions - Disable applying `max_open_trades` during backtest - (same as setting `max_open_trades` to a very high - number). --enable-protections, --enableprotections Enable protections for backtesting.Will slow backtesting down by a considerable amount, but will @@ -133,7 +129,8 @@ optional arguments: Common arguments: -v, --verbose Verbose mode (-vv for more, -vvv to get all messages). - --logfile FILE Log to the file specified. Special values are: + --logfile FILE, --log-file FILE + Log to the file specified. Special values are: 'syslog', 'journald'. See the documentation for more details. -V, --version show program's version number and exit @@ -142,7 +139,7 @@ Common arguments: `userdir/config.json` or `config.json` whichever exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. - -d PATH, --datadir PATH + -d PATH, --datadir PATH, --data-dir PATH Path to directory with historical backtesting data. --userdir PATH, --user-data-dir PATH Path to userdata directory. @@ -867,18 +864,15 @@ You can use the `--print-all` command line option if you would like to see all r ## Position stacking and disabling max market positions -In some situations, you may need to run Hyperopt (and Backtesting) with the -`--eps`/`--enable-position-staking` and `--dmmp`/`--disable-max-market-positions` arguments. +In some situations, you may need to run Hyperopt (and Backtesting) with the `--eps`/`--enable-position-staking` argument, or you may need to set `max_open_trades` to a very high number to disable the limit on the number of open trades. By default, hyperopt emulates the behavior of the Freqtrade Live Run/Dry Run, where only one -open trade is allowed for every traded pair. The total number of trades open for all pairs +open trade per pair is allowed. The total number of trades open for all pairs is also limited by the `max_open_trades` setting. During Hyperopt/Backtesting this may lead to -some potential trades to be hidden (or masked) by previously open trades. +potential trades being hidden (or masked) by already open trades. -The `--eps`/`--enable-position-stacking` argument allows emulation of buying the same pair multiple times, -while `--dmmp`/`--disable-max-market-positions` disables applying `max_open_trades` -during Hyperopt/Backtesting (which is equal to setting `max_open_trades` to a very high -number). +The `--eps`/`--enable-position-stacking` argument allows emulation of buying the same pair multiple times. +Using `--max-open-trades` with a very high number will disable the limit on the number of open trades. !!! Note Dry/live runs will **NOT** use position stacking - therefore it does make sense to also validate the strategy without this as it's closer to reality. @@ -919,13 +913,39 @@ Your epochs should therefore be aligned to the possible values - or you should b After you run Hyperopt for the desired amount of epochs, you can later list all results for analysis, select only best or profitable once, and show the details for any of the epochs previously evaluated. This can be done with the `hyperopt-list` and `hyperopt-show` sub-commands. The usage of these sub-commands is described in the [Utils](utils.md#list-hyperopt-results) chapter. +## Output debug messages from your strategy + +If you want to output debug messages from your strategy, you can use the `logging` module. By default, Freqtrade will output all messages with a level of `INFO` or higher. + + +``` python +import logging + + +logger = logging.getLogger(__name__) + + +class MyAwesomeStrategy(IStrategy): + ... + + def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: + logger.info("This is a debug message") + ... + +``` + +!!! Note "using print" + Messages printed via `print()` will not be shown in the hyperopt output unless parallelism is disabled (`-j 1`). + It is recommended to use the `logging` module instead. + ## Validate backtesting results Once the optimized strategy has been implemented into your strategy, you should backtest this strategy to make sure everything is working as expected. -To achieve same the results (number of trades, their durations, profit, etc.) as during Hyperopt, please use the same configuration and parameters (timerange, timeframe, ...) used for hyperopt `--dmmp`/`--disable-max-market-positions` and `--eps`/`--enable-position-stacking` for Backtesting. +To achieve same the results (number of trades, their durations, profit, etc.) as during Hyperopt, please use the same configuration and parameters (timerange, timeframe, ...) used for hyperopt for Backtesting. ### Why do my backtest results not match my hyperopt results? + Should results not match, check the following factors: * You may have added parameters to hyperopt in `populate_indicators()` where they will be calculated only once **for all epochs**. If you are, for example, trying to optimise multiple SMA timeperiod values, the hyperoptable timeperiod parameter should be placed in `populate_entry_trend()` which is calculated every epoch. See [Optimizing an indicator parameter](https://www.freqtrade.io/en/stable/hyperopt/#optimizing-an-indicator-parameter). diff --git a/docs/includes/pairlists.md b/docs/includes/pairlists.md index 8d79a7bc1cb..7e465980723 100644 --- a/docs/includes/pairlists.md +++ b/docs/includes/pairlists.md @@ -352,7 +352,7 @@ The optional `bearer_token` will be included in the requests Authorization Heade #### MarketCapPairList -`MarketCapPairList` employs sorting/filtering of pairs by their marketcap rank based of CoinGecko. It will only recognize coins up to the coin placed at rank 250. The returned pairlist will be sorted based of their marketcap ranks. +`MarketCapPairList` employs sorting/filtering of pairs by their marketcap rank based of CoinGecko. The returned pairlist will be sorted based of their marketcap ranks. ```json "pairlists": [ @@ -366,7 +366,8 @@ The optional `bearer_token` will be included in the requests Authorization Heade ] ``` -`number_assets` defines the maximum number of pairs returned by the pairlist. `max_rank` will determine the maximum rank used in creating/filtering the pairlist. It's expected that some coins within the top `max_rank` marketcap will not be included in the resulting pairlist since not all pairs will have active trading pairs in your preferred market/stake/exchange combination. +`number_assets` defines the maximum number of pairs returned by the pairlist. `max_rank` will determine the maximum rank used in creating/filtering the pairlist. It's expected that some coins within the top `max_rank` marketcap will not be included in the resulting pairlist since not all pairs will have active trading pairs in your preferred market/stake/exchange combination. +While using a `max_rank` bigger than 250 is supported, it's not recommended, as it'll cause multiple API calls to CoinGecko, which can lead to rate limit issues. The `refresh_period` setting defines the interval (in seconds) at which the marketcap rank data will be refreshed. The default is 86,400 seconds (1 day). The pairlist cache (`refresh_period`) applies to both generating pairlists (when in the first position in the list) and filtering instances (when not in the first position in the list). diff --git a/docs/index.md b/docs/index.md index d6dca488029..45871acb9c7 100644 --- a/docs/index.md +++ b/docs/index.md @@ -28,7 +28,7 @@ Freqtrade is a free and open source crypto trading bot written in Python. It is - Develop your Strategy: Write your strategy in python, using [pandas](https://pandas.pydata.org/). Example strategies to inspire you are available in the [strategy repository](https://github.com/freqtrade/freqtrade-strategies). - Download market data: Download historical data of the exchange and the markets your may want to trade with. - Backtest: Test your strategy on downloaded historical data. -- Optimize: Find the best parameters for your strategy using hyperoptimization which employs machining learning methods. You can optimize buy, sell, take profit (ROI), stop-loss and trailing stop-loss parameters for your strategy. +- Optimize: Find the best parameters for your strategy using hyperoptimization which employs machine learning methods. You can optimize buy, sell, take profit (ROI), stop-loss and trailing stop-loss parameters for your strategy. - Select markets: Create your static list or use an automatic one based on top traded volumes and/or prices (not available during backtesting). You can also explicitly blacklist markets you don't want to trade. - Run: Test your strategy with simulated money (Dry-Run mode) or deploy it with real money (Live-Trade mode). - Run using Edge (optional module): The concept is to find the best historical [trade expectancy](edge.md#expectancy) by markets based on variation of the stop-loss and then allow/reject markets to trade. The sizing of the trade is based on a risk of a percentage of your capital. @@ -40,11 +40,12 @@ Freqtrade is a free and open source crypto trading bot written in Python. It is Please read the [exchange specific notes](exchanges.md) to learn about eventual, special configurations needed for each exchange. - [X] [Binance](https://www.binance.com/) -- [X] [Bitmart](https://bitmart.com/) - [X] [BingX](https://bingx.com/invite/0EM9RX) +- [X] [Bitmart](https://bitmart.com/) - [X] [Bybit](https://bybit.com/) - [X] [Gate.io](https://www.gate.io/ref/6266643) - [X] [HTX](https://www.htx.com/) (Former Huobi) +- [X] [Hyperliquid](https://hyperliquid.xyz/) (A decentralized exchange, or DEX) - [X] [Kraken](https://kraken.com/) - [X] [OKX](https://okx.com/) (Former OKEX) - [ ] [potentially many others through ccxt](https://github.com/ccxt/ccxt/). _(We cannot guarantee they will work)_ @@ -52,9 +53,10 @@ Please read the [exchange specific notes](exchanges.md) to learn about eventual, ### Supported Futures Exchanges (experimental) - [X] [Binance](https://www.binance.com/) +- [X] [Bybit](https://bybit.com/) - [X] [Gate.io](https://www.gate.io/ref/6266643) +- [X] [Hyperliquid](https://hyperliquid.xyz/) (A decentralized exchange, or DEX) - [X] [OKX](https://okx.com/) -- [X] [Bybit](https://bybit.com/) Please make sure to read the [exchange specific notes](exchanges.md), as well as the [trading with leverage](leverage.md) documentation before diving in. diff --git a/docs/installation.md b/docs/installation.md index 02cbb7f3ea2..30deb07ba7b 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -67,6 +67,18 @@ OS Specific steps are listed first, the common section below is necessary for al sudo apt install -y python3-pip python3-venv python3-dev python3-pandas git curl ``` +=== "MacOS" + #### Install necessary dependencies + + Install [Homebrew](https://brew.sh/) if you don't have it already. + + ```bash + # install packages + brew install gettext libomp + ``` + !!! Note + The `setup.sh` script will install these dependencies for you - assuming brew is installed on your system. + === "RaspberryPi/Raspbian" The following assumes the latest [Raspbian Buster lite image](https://www.raspberrypi.org/downloads/raspbian/). This image comes with python3.11 preinstalled, making it easy to get freqtrade up and running. @@ -76,7 +88,7 @@ OS Specific steps are listed first, the common section below is necessary for al ```bash sudo apt-get install python3-venv libatlas-base-dev cmake curl - # Use pywheels.org to speed up installation + # Use piwheels.org to speed up installation sudo echo "[global]\nextra-index-url=https://www.piwheels.org/simple" > tee /etc/pip.conf git clone https://github.com/freqtrade/freqtrade.git @@ -150,9 +162,7 @@ Each time you open a new terminal, you must run `source .venv/bin/activate` to a source ./.venv/bin/activate ``` -### Congratulations - -[You are ready](#you-are-ready), and run the bot +[You are now ready](#you-are-ready) to run the bot. ### Other options of /setup.sh script @@ -220,7 +230,7 @@ cd .. rm -rf ./ta-lib* ``` -#### Setup Python virtual environment (virtualenv) +### Setup Python virtual environment (virtualenv) You will run freqtrade in separated `virtual environment` @@ -232,19 +242,18 @@ python3 -m venv .venv source .venv/bin/activate ``` -#### Install python dependencies +### Install python dependencies ```bash python3 -m pip install --upgrade pip python3 -m pip install -r requirements.txt +# install freqtrade python3 -m pip install -e . ``` -### Congratulations +[You are now ready](#you-are-ready) to run the bot. -[You are ready](#you-are-ready), and run the bot - -#### (Optional) Post-installation Tasks +### (Optional) Post-installation Tasks !!! Note If you run the bot on a server, you should consider using [Docker](docker_quickstart.md) or a terminal multiplexer like `screen` or [`tmux`](https://en.wikipedia.org/wiki/Tmux) to avoid that the bot is stopped on logout. @@ -333,9 +342,7 @@ cd build_helpers bash install_ta-lib.sh ${CONDA_PREFIX} nosudo ``` -### Congratulations - -[You are ready](#you-are-ready), and run the bot +[You are now ready](#you-are-ready) to run the bot. ### Important shortcuts diff --git a/docs/requirements-docs.txt b/docs/requirements-docs.txt index c757bf951b2..c71dd7b947d 100644 --- a/docs/requirements-docs.txt +++ b/docs/requirements-docs.txt @@ -1,7 +1,7 @@ markdown==3.7 mkdocs==1.6.1 -mkdocs-material==9.5.42 +mkdocs-material==9.5.49 mdx_truly_sane_lists==1.3 -pymdown-extensions==10.11.2 -jinja2==3.1.4 +pymdown-extensions==10.12 +jinja2==3.1.5 mike==2.1.3 diff --git a/docs/rest-api.md b/docs/rest-api.md index 8c927d5d703..b958c092782 100644 --- a/docs/rest-api.md +++ b/docs/rest-api.md @@ -88,8 +88,9 @@ Make sure that the following 2 lines are available in your docker-compose file: ### Consuming the API -You can consume the API by using `freqtrade-client` (also available as `scripts/rest_client.py`). -This command can be installed independent of the bot by using `pip install freqtrade-client`. +We advise consuming the API by using the supported `freqtrade-client` package (also available as `scripts/rest_client.py`). + +This command can be installed independent of any running freqtrade bot by using `pip install freqtrade-client`. This module is designed to be lightweight, and only depends on the `requests` and `python-rapidjson` modules, skipping all heavy dependencies freqtrade otherwise needs. @@ -144,57 +145,6 @@ This method will work for all arguments - check the "show" command for a list of For a full list of available commands, please refer to the list below. -### Available endpoints - -| Command | Description | -|----------|-------------| -| `ping` | Simple command testing the API Readiness - requires no authentication. -| `start` | Starts the trader. -| `stop` | Stops the trader. -| `stopbuy` | Stops the trader from opening new trades. Gracefully closes open trades according to their rules. -| `reload_config` | Reloads the configuration file. -| `trades` | List last trades. Limited to 500 trades per call. -| `trade/` | Get specific trade. -| `trades/` | DELETE - Remove trade from the database. Tries to close open orders. Requires manual handling of this trade on the exchange. -| `trades//open-order` | DELETE - Cancel open order for this trade. -| `trades//reload` | GET - Reload a trade from the Exchange. Only works in live, and can potentially help recover a trade that was manually sold on the exchange. -| `show_config` | Shows part of the current configuration with relevant settings to operation. -| `logs` | Shows last log messages. -| `status` | Lists all open trades. -| `count` | Displays number of trades used and available. -| `entries [pair]` | Shows profit statistics for each enter tags for given pair (or all pairs if pair isn't given). Pair is optional. -| `exits [pair]` | Shows profit statistics for each exit reasons for given pair (or all pairs if pair isn't given). Pair is optional. -| `mix_tags [pair]` | Shows profit statistics for each combinations of enter tag + exit reasons for given pair (or all pairs if pair isn't given). Pair is optional. -| `locks` | Displays currently locked pairs. -| `delete_lock ` | Deletes (disables) the lock by id. -| `locks add , , [side], [reason]` | Locks a pair until "until". (Until will be rounded up to the nearest timeframe). -| `profit` | Display a summary of your profit/loss from close trades and some stats about your performance. -| `forceexit [order_type] [amount]` | Instantly exits the given trade (ignoring `minimum_roi`), using the given order type ("market" or "limit", uses your config setting if not specified), and the chosen amount (full sell if not specified). -| `forceexit all` | Instantly exits all open trades (Ignoring `minimum_roi`). -| `forceenter [rate]` | Instantly enters the given pair. Rate is optional. (`force_entry_enable` must be set to True) -| `forceenter [rate]` | Instantly longs or shorts the given pair. Rate is optional. (`force_entry_enable` must be set to True) -| `performance` | Show performance of each finished trade grouped by pair. -| `balance` | Show account balance per currency. -| `daily ` | Shows profit or loss per day, over the last n days (n defaults to 7). -| `weekly ` | Shows profit or loss per week, over the last n days (n defaults to 4). -| `monthly ` | Shows profit or loss per month, over the last n days (n defaults to 3). -| `stats` | Display a summary of profit / loss reasons as well as average holding times. -| `whitelist` | Show the current whitelist. -| `blacklist [pair]` | Show the current blacklist, or adds a pair to the blacklist. -| `edge` | Show validated pairs by Edge if it is enabled. -| `pair_candles` | Returns dataframe for a pair / timeframe combination while the bot is running. **Alpha** -| `pair_history` | Returns an analyzed dataframe for a given timerange, analyzed by a given strategy. **Alpha** -| `plot_config` | Get plot config from the strategy (or nothing if not configured). **Alpha** -| `strategies` | List strategies in strategy directory. **Alpha** -| `strategy ` | Get specific Strategy content. **Alpha** -| `available_pairs` | List available backtest data. **Alpha** -| `version` | Show version. -| `sysinfo` | Show information about the system load. -| `health` | Show bot health (last bot loop). - -!!! Warning "Alpha status" - Endpoints labeled with *Alpha status* above may change at any time without notice. - Possible commands can be listed from the rest-client script using the `help` command. ``` bash @@ -266,6 +216,14 @@ forceexit health Provides a quick health check of the running bot. +lock_add + Manually lock a specific pair + + :param pair: Pair to lock + :param until: Lock until this date (format "2024-03-30 16:00:00Z") + :param side: Side to lock (long, short, *) + :param reason: Reason for the lock + locks Return current locks @@ -353,6 +311,62 @@ whitelist ``` +### Available endpoints + +If you wish to call the REST API manually via another route, e.g. directly via `curl`, the table below shows the relevant URL endpoints and parameters. +All endpoints in the below table need to be prefixed with the base URL of the API, e.g. `http://127.0.0.1:8080/api/v1/` - so the command becomes `http://127.0.0.1:8080/api/v1/`. + +| Endpoint | Method | Description / Parameters | +|-----------|--------|--------------------------| +| `/ping` | GET | Simple command testing the API Readiness - requires no authentication. +| `/start` | POST | Starts the trader. +| `/stop` | POST | Stops the trader. +| `/stopbuy` | POST | Stops the trader from opening new trades. Gracefully closes open trades according to their rules. +| `/reload_config` | POST | Reloads the configuration file. +| `/trades` | GET | List last trades. Limited to 500 trades per call. +| `/trade/` | GET | Get specific trade.
*Params:*
- `tradeid` (`int`) +| `/trades/` | DELETE | Remove trade from the database. Tries to close open orders. Requires manual handling of this trade on the exchange.
*Params:*
- `tradeid` (`int`) +| `/trades//open-order` | DELETE | Cancel open order for this trade.
*Params:*
- `tradeid` (`int`) +| `/trades//reload` | POST | Reload a trade from the Exchange. Only works in live, and can potentially help recover a trade that was manually sold on the exchange.
*Params:*
- `tradeid` (`int`) +| `/show_config` | GET | Shows part of the current configuration with relevant settings to operation. +| `/logs` | GET | Shows last log messages. +| `/status` | GET | Lists all open trades. +| `/count` | GET | Displays number of trades used and available. +| `/entries` | GET | Shows profit statistics for each enter tags for given pair (or all pairs if pair isn't given). Pair is optional.
*Params:*
- `pair` (`str`) +| `/exits` | GET | Shows profit statistics for each exit reasons for given pair (or all pairs if pair isn't given). Pair is optional.
*Params:*
- `pair` (`str`) +| `/mix_tags` | GET | Shows profit statistics for each combinations of enter tag + exit reasons for given pair (or all pairs if pair isn't given). Pair is optional.
*Params:*
- `pair` (`str`) +| `/locks` | GET | Displays currently locked pairs. +| `/locks` | POST | Locks a pair until "until". (Until will be rounded up to the nearest timeframe). Side is optional and is either `long` or `short` (default is `long`). Reason is optional.
*Params:*
- `` (`str`)
- `` (`datetime`)
- `[side]` (`str`)
- `[reason]` (`str`) +| `/locks/` | DELETE | Deletes (disables) the lock by id.
*Params:*
- `lockid` (`int`) +| `/profit` | GET | Display a summary of your profit/loss from close trades and some stats about your performance. +| `/forceexit` | POST | Instantly exits the given trade (ignoring `minimum_roi`), using the given order type ("market" or "limit", uses your config setting if not specified), and the chosen amount (full sell if not specified). If `all` is supplied as the `tradeid`, then all currently open trades will be forced to exit.
*Params:*
- `` (`int` or `str`)
- `` (`str`)
- `[amount]` (`float`) +| `/forceenter` | POST | Instantly enters the given pair. Side is optional and is either `long` or `short` (default is `long`). Rate is optional. (`force_entry_enable` must be set to True)
*Params:*
- `` (`str`)
- `` (`str`)
- `[rate]` (`float`) +| `/performance` | GET | Show performance of each finished trade grouped by pair. +| `/balance` | GET | Show account balance per currency. +| `/daily` | GET | Shows profit or loss per day, over the last n days (n defaults to 7).
*Params:*
- `` (`int`) +| `/weekly` | GET | Shows profit or loss per week, over the last n days (n defaults to 4).
*Params:*
- `` (`int`) +| `/monthly` | GET | Shows profit or loss per month, over the last n days (n defaults to 3).
*Params:*
- `` (`int`) +| `/stats` | GET | Display a summary of profit / loss reasons as well as average holding times. +| `/whitelist` | GET | Show the current whitelist. +| `/blacklist` | GET | Show the current blacklist. +| `/blacklist` | POST | Adds the specified pair to the blacklist.
*Params:*
- `pair` (`str`) +| `/blacklist` | DELETE | Deletes the specified list of pairs from the blacklist.
*Params:*
- `[pair,pair]` (`list[str]`) +| `/edge` | GET | Show validated pairs by Edge if it is enabled. +| `/pair_candles` | GET | Returns dataframe for a pair / timeframe combination while the bot is running. **Alpha** +| `/pair_candles` | POST | Returns dataframe for a pair / timeframe combination while the bot is running, filtered by a provided list of columns to return. **Alpha**
*Params:*
- `` (`list[str]`) +| `/pair_history` | GET | Returns an analyzed dataframe for a given timerange, analyzed by a given strategy. **Alpha** +| `/pair_history` | POST | Returns an analyzed dataframe for a given timerange, analyzed by a given strategy, filtered by a provided list of columns to return. **Alpha**
*Params:*
- `` (`list[str]`) +| `/plot_config` | GET | Get plot config from the strategy (or nothing if not configured). **Alpha** +| `/strategies` | GET | List strategies in strategy directory. **Alpha** +| `/strategy/` | GET | Get specific Strategy content by strategy class name. **Alpha**
*Params:*
- `` (`str`) +| `/available_pairs` | GET | List available backtest data. **Alpha** +| `/version` | GET | Show version. +| `/sysinfo` | GET | Show information about the system load. +| `/health` | GET | Show bot health (last bot loop). + +!!! Warning "Alpha status" + Endpoints labeled with *Alpha status* above may change at any time without notice. + ### Message WebSocket The API Server includes a websocket endpoint for subscribing to RPC messages from the freqtrade Bot. diff --git a/docs/stoploss.md b/docs/stoploss.md index e0353d4da4b..7442484dea2 100644 --- a/docs/stoploss.md +++ b/docs/stoploss.md @@ -36,6 +36,7 @@ The Order-type will be ignored if only one mode is available. | Gate | limit | | Okx | limit | | Kucoin | stop-limit, stop-market| +| Hyperliquid (futures only) | limit | !!! Note "Tight stoploss" Do not set too low/tight stoploss value when using stop loss on exchange! diff --git a/docs/strategy-advanced.md b/docs/strategy-advanced.md index 3cd0259f475..8bb23c5da28 100644 --- a/docs/strategy-advanced.md +++ b/docs/strategy-advanced.md @@ -38,9 +38,9 @@ class AwesomeStrategy(IStrategy): trade.set_custom_data(key='entry_type', value=trade_entry_type) return super().bot_loop_start(**kwargs) - def adjust_entry_price(self, trade: Trade, order: Optional[Order], pair: str, + def adjust_entry_price(self, trade: Trade, order: Order | None, pair: str, current_time: datetime, proposed_rate: float, current_order_rate: float, - entry_tag: Optional[str], side: str, **kwargs) -> float: + entry_tag: str | None, side: str, **kwargs) -> float: # Limit orders to use and follow SMA200 as price target for the first 10 minutes since entry trigger for BTC/USDT pair. if ( pair == 'BTC/USDT' diff --git a/docs/strategy-callbacks.md b/docs/strategy-callbacks.md index ce1b9907c76..14e39a4477f 100644 --- a/docs/strategy-callbacks.md +++ b/docs/strategy-callbacks.md @@ -90,8 +90,8 @@ Called before entering a trade, makes it possible to manage your position size w class AwesomeStrategy(IStrategy): def custom_stake_amount(self, pair: str, current_time: datetime, current_rate: float, - proposed_stake: float, min_stake: Optional[float], max_stake: float, - leverage: float, entry_tag: Optional[str], side: str, + proposed_stake: float, min_stake: float | None, max_stake: float, + leverage: float, entry_tag: str | None, side: str, **kwargs) -> float: dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) @@ -165,7 +165,8 @@ Called for open trade every iteration (roughly every 5 seconds) until a trade is The usage of the custom stoploss method must be enabled by setting `use_custom_stoploss=True` on the strategy object. -The stoploss price can only ever move upwards - if the stoploss value returned from `custom_stoploss` would result in a lower stoploss price than was previously set, it will be ignored. The traditional `stoploss` value serves as an absolute lower level and will be instated as the initial stoploss (before this method is called for the first time for a trade), and is still mandatory. +The stoploss price can only ever move upwards - if the stoploss value returned from `custom_stoploss` would result in a lower stoploss price than was previously set, it will be ignored. The traditional `stoploss` value serves as an absolute lower level and will be instated as the initial stoploss (before this method is called for the first time for a trade), and is still mandatory. +As custom stoploss acts as regular, changing stoploss, it will behave similar to `trailing_stop` - and trades exiting due to this will have the exit_reason of `"trailing_stop_loss"`. The method must return a stoploss value (float / number) as a percentage of the current price. E.g. If the `current_rate` is 200 USD, then returning `0.02` will set the stoploss price 2% lower, at 196 USD. @@ -212,7 +213,7 @@ class AwesomeStrategy(IStrategy): def custom_stoploss(self, pair: str, trade: Trade, current_time: datetime, current_rate: float, current_profit: float, after_fill: bool, - **kwargs) -> Optional[float]: + **kwargs) -> float | None: """ Custom stoploss logic, returning the new distance relative to current_rate (as ratio). e.g. returning -0.05 would create a stoploss 5% below current_rate. @@ -250,7 +251,7 @@ class AwesomeStrategy(IStrategy): def custom_stoploss(self, pair: str, trade: Trade, current_time: datetime, current_rate: float, current_profit: float, after_fill: bool, - **kwargs) -> Optional[float]: + **kwargs) -> float | None: # Make sure you have the longest interval first - these conditions are evaluated from top to bottom. if current_time - timedelta(minutes=120) > trade.open_date_utc: @@ -276,7 +277,7 @@ class AwesomeStrategy(IStrategy): def custom_stoploss(self, pair: str, trade: Trade, current_time: datetime, current_rate: float, current_profit: float, after_fill: bool, - **kwargs) -> Optional[float]: + **kwargs) -> float | None: if after_fill: # After an additional order, start with a stoploss of 10% below the new open rate @@ -305,7 +306,7 @@ class AwesomeStrategy(IStrategy): def custom_stoploss(self, pair: str, trade: Trade, current_time: datetime, current_rate: float, current_profit: float, after_fill: bool, - **kwargs) -> Optional[float]: + **kwargs) -> float | None: if pair in ("ETH/BTC", "XRP/BTC"): return -0.10 @@ -331,7 +332,7 @@ class AwesomeStrategy(IStrategy): def custom_stoploss(self, pair: str, trade: Trade, current_time: datetime, current_rate: float, current_profit: float, after_fill: bool, - **kwargs) -> Optional[float]: + **kwargs) -> float | None: if current_profit < 0.04: return None # return None to keep using the initial stoploss @@ -363,7 +364,7 @@ class AwesomeStrategy(IStrategy): def custom_stoploss(self, pair: str, trade: Trade, current_time: datetime, current_rate: float, current_profit: float, after_fill: bool, - **kwargs) -> Optional[float]: + **kwargs) -> float | None: # evaluate highest to lowest, so that highest possible stop is used if current_profit > 0.40: @@ -394,7 +395,7 @@ class AwesomeStrategy(IStrategy): def custom_stoploss(self, pair: str, trade: Trade, current_time: datetime, current_rate: float, current_profit: float, after_fill: bool, - **kwargs) -> Optional[float]: + **kwargs) -> float | None: dataframe, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe) last_candle = dataframe.iloc[-1].squeeze() @@ -439,7 +440,7 @@ Stoploss values returned from `custom_stoploss()` must specify a percentage rela def custom_stoploss(self, pair: str, trade: Trade, current_time: datetime, current_rate: float, current_profit: float, after_fill: bool, - **kwargs) -> Optional[float]: + **kwargs) -> float | None: # once the profit has risen above 10%, keep the stoploss at 7% above the open price if current_profit > 0.10: @@ -482,7 +483,7 @@ The helper function `stoploss_from_absolute()` can be used to convert from an ab def custom_stoploss(self, pair: str, trade: Trade, current_time: datetime, current_rate: float, current_profit: float, after_fill: bool, - **kwargs) -> Optional[float]: + **kwargs) -> float | None: dataframe, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe) trade_date = timeframe_to_prev_date(self.timeframe, trade.open_date_utc) candle = dataframe.iloc[-1].squeeze() @@ -519,8 +520,8 @@ class AwesomeStrategy(IStrategy): # ... populate_* methods - def custom_entry_price(self, pair: str, trade: Optional[Trade], current_time: datetime, proposed_rate: float, - entry_tag: Optional[str], side: str, **kwargs) -> float: + def custom_entry_price(self, pair: str, trade: Trade | None, current_time: datetime, proposed_rate: float, + entry_tag: str | None, side: str, **kwargs) -> float: dataframe, last_updated = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) @@ -530,7 +531,7 @@ class AwesomeStrategy(IStrategy): def custom_exit_price(self, pair: str, trade: Trade, current_time: datetime, proposed_rate: float, - current_profit: float, exit_tag: Optional[str], **kwargs) -> float: + current_profit: float, exit_tag: str | None, **kwargs) -> float: dataframe, last_updated = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) @@ -662,7 +663,7 @@ class AwesomeStrategy(IStrategy): # ... populate_* methods def confirm_trade_entry(self, pair: str, order_type: str, amount: float, rate: float, - time_in_force: str, current_time: datetime, entry_tag: Optional[str], + time_in_force: str, current_time: datetime, entry_tag: str | None, side: str, **kwargs) -> bool: """ Called right before placing a entry order. @@ -766,6 +767,15 @@ Adjustment orders can be assigned with a tag by returning a 2 element Tuple, wit Modifications to leverage are not possible, and the stake-amount returned is assumed to be before applying leverage. +!!! Danger "Loose Logic" + On dry and live run, this function will be called every `throttle_process_secs` (default to 5s). If you have a loose logic, for example your logic for extra entry is only to check RSI of last candle is below 30, then when such condition fulfilled, your bot will do extra re-entry every 5 secs until either it run out of money, it hit the `max_position_adjustment` limit, or a new candle with RSI more than 30 arrived. + + Same thing also can happen with partial exit. So be sure to have a strict logic and/or check for the last filled order. + +!!! Warning "Backtesting" + During backtesting this callback is called for each candle in `timeframe` or `timeframe_detail`, so run-time performance will be affected. + This can also cause deviating results between live and backtesting, since backtesting can adjust the trade only once per candle, whereas live could adjust the trade multiple times per candle. + ### Increase position The strategy is expected to return a positive **stake_amount** (in stake currency) between `min_stake` and `max_stake` if and when an additional entry order should be made (position is increased -> buy order for long trades, sell order for short trades). @@ -775,16 +785,22 @@ If there are not enough funds in the wallet (the return value is above `max_stak Additional entries are ignored once you have reached the maximum amount of extra entries that you have set on `max_entry_position_adjustment`, but the callback is called anyway looking for partial exits. +!!! Note "About stake size" + Using fixed stake size means it will be the amount used for the first order, just like without position adjustment. + If you wish to buy additional orders with DCA, then make sure to leave enough funds in the wallet for that. + Using `"unlimited"` stake amount with DCA orders requires you to also implement the `custom_stake_amount()` callback to avoid allocating all funds to the initial order. + ### Decrease position The strategy is expected to return a negative stake_amount (in stake currency) for a partial exit. Returning the full owned stake at that point (`-trade.stake_amount`) results in a full exit. Returning a value more than the above (so remaining stake_amount would become negative) will result in the bot ignoring the signal. -!!! Note "About stake size" - Using fixed stake size means it will be the amount used for the first order, just like without position adjustment. - If you wish to buy additional orders with DCA, then make sure to leave enough funds in the wallet for that. - Using `"unlimited"` stake amount with DCA orders requires you to also implement the `custom_stake_amount()` callback to avoid allocating all funds to the initial order. +For a partial exit, it's important to know that the formula used to calculate the amount of the coin for the partial exit order is `amount to be exited partially = negative_stake_amount * trade.amount / trade.stake_amount`, where `negative_stake_amount` is the value returned from the `adjust_trade_position` function. As seen in the formula, the formula doesn't care about current profit/loss of the position. It only cares about `trade.amount` and `trade.stake_amount` which aren't affected by the price movement at all. + +For example, let's say you buy 2 SHITCOIN/USDT at open rate of 50, which means the trade's stake amount is 100 USDT. Now the price raises to 200 and you want to sell half of it. In that case, you have to return -50% of `trade.stake_amount` (0.5 * 100 USDT) which equals to -50. The bot will calculate the amount it needed to sell, which is `50 * 2 / 100` which equals 1 SHITCOIN/USDT. If you return -200 (50% of 2 * 200), the bot will ignore it since `trade.stake_amount` is only 100 USDT but you asked to sell 200 USDT which means you are asking to sell 4 SHITCOIN/USDT. + +Back to the example above, since current rate is 200, the current USDT value of your trade is now 400 USDT. Let's say you want to partially sell 100 USDT to take out the initial investment and leave the profit in the trade hoping that the price keeps rising. In that case, you have to do a different approach. First, you need to calculate the exact amount you needed to sell. In this case, since you want to sell 100 USDT worth based of current rate, the exact amount you need to partially sell is `100 * 2 / 400` which equals 0.5 SHITCOIN/USDT. Since we know now the exact amount we want to sell (0.5), the value you need to return in the `adjust_trade_position` function is `-amount to be exited partially * trade.stake_amount / trade.amount`, which equals -25. The bot will sell 0.5 SHITCOIN/USDT, keeping 1.5 in trade. You will receive 100 USDT from the partial exit. !!! Warning "Stoploss calculation" Stoploss is still calculated from the initial opening price, not averaged price. @@ -792,10 +808,6 @@ Returning a value more than the above (so remaining stake_amount would become ne While `/stopentry` command stops the bot from entering new trades, the position adjustment feature will continue buying new orders on existing trades. -!!! Warning "Backtesting" - During backtesting this callback is called for each candle in `timeframe` or `timeframe_detail`, so run-time performance will be affected. - This can also cause deviating results between live and backtesting, since backtesting can adjust the trade only once per candle, whereas live could adjust the trade multiple times per candle. - !!! Warning "Performance with many position adjustments" Position adjustments can be a good approach to increase a strategy's output - but it can also have drawbacks if using this feature extensively. Each of the orders will be attached to the trade object for the duration of the trade - hence increasing memory usage. @@ -820,8 +832,8 @@ class DigDeeperStrategy(IStrategy): # This is called when placing the initial order (opening trade) def custom_stake_amount(self, pair: str, current_time: datetime, current_rate: float, - proposed_stake: float, min_stake: Optional[float], max_stake: float, - leverage: float, entry_tag: Optional[str], side: str, + proposed_stake: float, min_stake: float | None, max_stake: float, + leverage: float, entry_tag: str | None, side: str, **kwargs) -> float: # We need to leave most of the funds for possible further DCA orders @@ -830,11 +842,11 @@ class DigDeeperStrategy(IStrategy): def adjust_trade_position(self, trade: Trade, current_time: datetime, current_rate: float, current_profit: float, - min_stake: Optional[float], max_stake: float, + min_stake: float | None, max_stake: float, current_entry_rate: float, current_exit_rate: float, current_entry_profit: float, current_exit_profit: float, **kwargs - ) -> Union[Optional[float], Tuple[Optional[float], Optional[str]]]: + ) -> float | None | tuple[float | None, str | None]: """ Custom trade adjustment logic, returning the stake amount that a trade should be increased or decreased. @@ -890,7 +902,7 @@ class DigDeeperStrategy(IStrategy): # Hope you have a deep wallet! try: # This returns first order stake size - stake_amount = filled_entries[0].stake_amount + stake_amount = filled_entries[0].stake_amount_filled # This then calculates current safety order size stake_amount = stake_amount * (1 + (count_of_entries * 0.25)) return stake_amount, "1/3rd_increase" @@ -946,9 +958,9 @@ class AwesomeStrategy(IStrategy): # ... populate_* methods - def adjust_entry_price(self, trade: Trade, order: Optional[Order], pair: str, + def adjust_entry_price(self, trade: Trade, order: Order | None, pair: str, current_time: datetime, proposed_rate: float, current_order_rate: float, - entry_tag: Optional[str], side: str, **kwargs) -> float: + entry_tag: str | None, side: str, **kwargs) -> float: """ Entry price re-adjustment logic, returning the user desired limit price. This only executes when a order was already placed, still open (unfilled fully or partially) @@ -975,7 +987,7 @@ class AwesomeStrategy(IStrategy): pair == "BTC/USDT" and entry_tag == "long_sma200" and side == "long" - and (current_time - timedelta(minutes=10)) > trade.open_date_utc + and (current_time - timedelta(minutes=10)) <= trade.open_date_utc ): # just cancel the order if it has been filled more than half of the amount if order.filled > order.remaining: @@ -1003,7 +1015,7 @@ For markets / exchanges that don't support leverage, this method is ignored. class AwesomeStrategy(IStrategy): def leverage(self, pair: str, current_time: datetime, current_rate: float, - proposed_leverage: float, max_leverage: float, entry_tag: Optional[str], side: str, + proposed_leverage: float, max_leverage: float, entry_tag: str | None, side: str, **kwargs) -> float: """ Customize leverage for each new trade. This method is only called in futures mode. diff --git a/docs/strategy-customization.md b/docs/strategy-customization.md index 5e3c65759ef..f360c411d9c 100644 --- a/docs/strategy-customization.md +++ b/docs/strategy-customization.md @@ -4,7 +4,7 @@ This page explains how to customize your strategies, add new indicators and set If you haven't already, please familiarize yourself with: -- the [Freqtrade strategy 101](freqtrade-101.md), which provides a quick start to strategy development +- the [Freqtrade strategy 101](strategy-101.md), which provides a quick start to strategy development - the [Freqtrade bot basics](bot-basics.md), which provides overall info on how the bot operates ## Develop your own strategy @@ -582,11 +582,14 @@ When hyperopting, use of the hyperoptable parameter `.value` attribute is not su ??? info "Full documentation" ``` python - def informative(timeframe: str, asset: str = '', - fmt: Optional[Union[str, Callable[[KwArg(str)], str]]] = None, - *, - candle_type: Optional[CandleType] = None, - ffill: bool = True) -> Callable[[PopulateIndicators], PopulateIndicators]: + def informative( + timeframe: str, + asset: str = "", + fmt: str | Callable[[Any], str] | None = None, + *, + candle_type: CandleType | str | None = None, + ffill: bool = True, + ) -> Callable[[PopulateIndicators], PopulateIndicators]: """ A decorator for populate_indicators_Nn(self, dataframe, metadata), allowing these functions to define informative indicators. diff --git a/docs/strategy_analysis_example.md b/docs/strategy_analysis_example.md index 9f37b29752e..814531c2d78 100644 --- a/docs/strategy_analysis_example.md +++ b/docs/strategy_analysis_example.md @@ -152,7 +152,7 @@ print(stats["strategy"][strategy]["pairlist"]) # Get market change (average change of all pairs from start to end of the backtest period) print(stats["strategy"][strategy]["market_change"]) # Maximum drawdown () -print(stats["strategy"][strategy]["max_drawdown"]) +print(stats["strategy"][strategy]["max_drawdown_abs"]) # Maximum drawdown start and end print(stats["strategy"][strategy]["drawdown_start"]) print(stats["strategy"][strategy]["drawdown_end"]) @@ -215,7 +215,7 @@ trades.groupby("pair")["exit_reason"].value_counts() ``` ## Analyze the loaded trades for trade parallelism -This can be useful to find the best `max_open_trades` parameter, when used with backtesting in conjunction with `--disable-max-market-positions`. +This can be useful to find the best `max_open_trades` parameter, when used with backtesting in conjunction with a very high `max_open_trades` setting. `analyze_trade_parallelism()` returns a timeseries dataframe with an "open_trades" column, specifying the number of open trades for each candle. diff --git a/docs/strategy_migration.md b/docs/strategy_migration.md index b423eca6e73..07744af58ae 100644 --- a/docs/strategy_migration.md +++ b/docs/strategy_migration.md @@ -214,8 +214,8 @@ class AwesomeStrategy(IStrategy): ``` python hl_lines="4" class AwesomeStrategy(IStrategy): def custom_stake_amount(self, pair: str, current_time: datetime, current_rate: float, - proposed_stake: float, min_stake: Optional[float], max_stake: float, - entry_tag: Optional[str], side: str, **kwargs) -> float: + proposed_stake: float, min_stake: float | None, max_stake: float, + entry_tag: str | None, side: str, **kwargs) -> float: # ... return proposed_stake ``` @@ -237,7 +237,7 @@ After: ``` python hl_lines="4" class AwesomeStrategy(IStrategy): def confirm_trade_entry(self, pair: str, order_type: str, amount: float, rate: float, - time_in_force: str, current_time: datetime, entry_tag: Optional[str], + time_in_force: str, current_time: datetime, entry_tag: str | None, side: str, **kwargs) -> bool: return True ``` @@ -280,8 +280,8 @@ After: ``` python hl_lines="3" class AwesomeStrategy(IStrategy): - def custom_entry_price(self, pair: str, trade: Optional[Trade], current_time: datetime, proposed_rate: float, - entry_tag: Optional[str], side: str, **kwargs) -> float: + def custom_entry_price(self, pair: str, trade: Trade | None, current_time: datetime, proposed_rate: float, + entry_tag: str | None, side: str, **kwargs) -> float: return proposed_rate ``` @@ -312,7 +312,7 @@ After: ``` python hl_lines="5 7" def custom_stoploss(self, pair: str, trade: 'Trade', current_time: datetime, current_rate: float, current_profit: float, after_fill: bool, - **kwargs) -> Optional[float]: + **kwargs) -> float | None: # once the profit has risen above 10%, keep the stoploss at 7% above the open price if current_profit > 0.10: return stoploss_from_open(0.07, current_profit, is_short=trade.is_short) @@ -329,7 +329,7 @@ After: `order_time_in_force` attributes changed from `"buy"` to `"entry"` and `"sell"` to `"exit"`. ``` python - order_time_in_force: Dict = { + order_time_in_force: dict = { "buy": "gtc", "sell": "gtc", } @@ -338,7 +338,7 @@ After: After: ``` python hl_lines="2 3" - order_time_in_force: Dict = { + order_time_in_force: dict = { "entry": "GTC", "exit": "GTC", } @@ -780,7 +780,7 @@ class MyCoolFreqaiModel(BaseRegressionModel): def predict( self, unfiltered_df: DataFrame, dk: FreqaiDataKitchen, **kwargs - ) -> Tuple[DataFrame, npt.NDArray[np.int_]]: + ) -> tuple[DataFrame, npt.NDArray[np.int_]]: # ... your custom stuff diff --git a/docs/stylesheets/ft.extra.css b/docs/stylesheets/ft.extra.css index 18985baf09a..930463ca800 100644 --- a/docs/stylesheets/ft.extra.css +++ b/docs/stylesheets/ft.extra.css @@ -15,3 +15,7 @@ .md-version__list { font-weight: 500 !important; } + +#available-endpoints ~ .md-typeset__scrollwrap .md-typeset__table th:first-of-type { + width: 35% !important; +} diff --git a/docs/telegram-usage.md b/docs/telegram-usage.md index 8fc8b0cfaa2..43ab66cbf01 100644 --- a/docs/telegram-usage.md +++ b/docs/telegram-usage.md @@ -45,22 +45,42 @@ Get your "Id", you will use it for the config parameter `chat_id`. #### Use Group id -You can use bots in telegram groups by just adding them to the group. You can find the group id by first adding a [RawDataBot](https://telegram.me/rawdatabot) to your group. The Group id is shown as id in the `"chat"` section, which the RawDataBot will send to you: +To get the group ID, you can add the bot to the group, start freqtrade, and issue a `/tg_info` command. +This will return the group id to you, without having to use some random bot. +While "chat_id" is still required, it doesn't need to be set to this particular group id for this command. + +The response will also contain the "topic_id" if necessary - both in a format ready to copy/paste into your configuration. ``` json -"chat":{ - "id":-1001332619709 + { + "enabled": true, + "token": "********", + "chat_id": "-1001332619709", + "topic_id": "122" } ``` -For the Freqtrade configuration, you can then use the full value (including `-` if it's there) as string: +For the Freqtrade configuration, you can then use the full value (including `-` ) as string: ```json "chat_id": "-1001332619709" ``` + !!! Warning "Using telegram groups" When using telegram groups, you're giving every member of the telegram group access to your freqtrade bot and to all commands possible via telegram. Please make sure that you can trust everyone in the telegram group to avoid unpleasant surprises. +##### Group Topic ID + +To use a specific topic in a group, you can use the `topic_id` parameter in the configuration. This will allow you to use the bot in a specific topic in a group. +Without this, the bot will always respond to the general channel in the group if topics are enabled for a group chat. + +```json + "chat_id": "-1001332619709", + "topic_id": "3" +``` + +Similar to the group-id - you can use `/tg_info` from the topic/thread to get the correct topic-id. + ## Control telegram noise Freqtrade provides means to control the verbosity of your telegram bot. @@ -93,9 +113,12 @@ Example configuration showing the different settings: "trailing_stop_loss": "on", "stop_loss": "on", "stoploss_on_exchange": "on", - "custom_exit": "silent", - "partial_exit": "on" + "custom_exit": "silent", // custom_exit without specifying an exit reason + "partial_exit": "on", + // "custom_exit_message": "silent", // Disable individual custom exit reasons + "*": "off" // Disable all other exit reasons }, + // "exit": "off", // Simplistic configuration to disable all exit messages "exit_cancel": "on", "exit_fill": "off", "protection_trigger": "off", @@ -108,16 +131,16 @@ Example configuration showing the different settings: }, ``` -`entry` notifications are sent when the order is placed, while `entry_fill` notifications are sent when the order is filled on the exchange. -`exit` notifications are sent when the order is placed, while `exit_fill` notifications are sent when the order is filled on the exchange. -`*_fill` notifications are off by default and must be explicitly enabled. -`protection_trigger` notifications are sent when a protection triggers and `protection_trigger_global` notifications trigger when global protections are triggered. -`strategy_msg` - Receive notifications from the strategy, sent via `self.dp.send_msg()` from the strategy [more details](strategy-customization.md#send-notification). -`show_candle` - show candle values as part of entry/exit messages. Only possible values are `"ohlc"` or `"off"`. - -`balance_dust_level` will define what the `/balance` command takes as "dust" - Currencies with a balance below this will be shown. -`allow_custom_messages` completely disable strategy messages. -`reload` allows you to disable reload-buttons on selected messages. +* `entry` notifications are sent when the order is placed, while `entry_fill` notifications are sent when the order is filled on the exchange. +* `exit` notifications are sent when the order is placed, while `exit_fill` notifications are sent when the order is filled on the exchange. + Exit messages (`exit` and `exit_fill`) can be further controlled at individual exit reasons level, with the specific exit reason as the key. the default for all exit reasons is `on` - but can be configured via special `*` key - which will act as a wildcard for all exit reasons that are not explicitly defined. +* `*_fill` notifications are off by default and must be explicitly enabled. +* `protection_trigger` notifications are sent when a protection triggers and `protection_trigger_global` notifications trigger when global protections are triggered. +* `strategy_msg` - Receive notifications from the strategy, sent via `self.dp.send_msg()` from the strategy [more details](strategy-customization.md#send-notification). +* `show_candle` - show candle values as part of entry/exit messages. Only possible values are `"ohlc"` or `"off"`. +* `balance_dust_level` will define what the `/balance` command takes as "dust" - Currencies with a balance below this will be shown. +* `allow_custom_messages` completely disable strategy messages. +* `reload` allows you to disable reload-buttons on selected messages. ## Create a custom keyboard (command shortcut buttons) @@ -238,16 +261,16 @@ Once all positions are sold, run `/stop` to completely stop the bot. For each open trade, the bot will send you the following message. Enter Tag is configurable via Strategy. -> **Trade ID:** `123` `(since 1 days ago)` -> **Current Pair:** CVC/BTC -> **Direction:** Long -> **Leverage:** 1.0 -> **Amount:** `26.64180098` -> **Enter Tag:** Awesome Long Signal -> **Open Rate:** `0.00007489` -> **Current Rate:** `0.00007489` -> **Unrealized Profit:** `12.95%` -> **Stoploss:** `0.00007389 (-0.02%)` +> **Trade ID:** `123` `(since 1 days ago)` +> **Current Pair:** CVC/BTC +> **Direction:** Long +> **Leverage:** 1.0 +> **Amount:** `26.64180098` +> **Enter Tag:** Awesome Long Signal +> **Open Rate:** `0.00007489` +> **Current Rate:** `0.00007489` +> **Unrealized Profit:** `12.95%` +> **Stoploss:** `0.00007389 (-0.02%)` ### /status table @@ -274,34 +297,34 @@ current max Return a summary of your profit/loss and performance. -> **ROI:** Close trades -> ∙ `0.00485701 BTC (2.2%) (15.2 Σ%)` -> ∙ `62.968 USD` -> **ROI:** All trades -> ∙ `0.00255280 BTC (1.5%) (6.43 Σ%)` -> ∙ `33.095 EUR` -> -> **Total Trade Count:** `138` -> **Bot started:** `2022-07-11 18:40:44` -> **First Trade opened:** `3 days ago` -> **Latest Trade opened:** `2 minutes ago` -> **Avg. Duration:** `2:33:45` -> **Best Performing:** `PAY/BTC: 50.23%` -> **Trading volume:** `0.5 BTC` -> **Profit factor:** `1.04` -> **Win / Loss:** `102 / 36` -> **Winrate:** `73.91%` -> **Expectancy (Ratio):** `4.87 (1.66)` -> **Max Drawdown:** `9.23% (0.01255 BTC)` - -The relative profit of `1.2%` is the average profit per trade. -The relative profit of `15.2 Σ%` is be based on the starting capital - so in this case, the starting capital was `0.00485701 * 1.152 = 0.00738 BTC`. -Starting capital is either taken from the `available_capital` setting, or calculated by using current wallet size - profits. -Profit Factor is calculated as gross profits / gross losses - and should serve as an overall metric for the strategy. -Expectancy corresponds to the average return per currency unit at risk, i.e. the winrate and the risk-reward ratio (the average gain of winning trades compared to the average loss of losing trades). -Expectancy Ratio is expected profit or loss of a subsequent trade based on the performance of all past trades. -Max drawdown corresponds to the backtesting metric `Absolute Drawdown (Account)` - calculated as `(Absolute Drawdown) / (DrawdownHigh + startingBalance)`. -Bot started date will refer to the date the bot was first started. For older bots, this will default to the first trade's open date. +> **ROI:** Close trades +> ∙ `0.00485701 BTC (2.2%) (15.2 Σ%)` +> ∙ `62.968 USD` +> **ROI:** All trades +> ∙ `0.00255280 BTC (1.5%) (6.43 Σ%)` +> ∙ `33.095 EUR` +> +> **Total Trade Count:** `138` +> **Bot started:** `2022-07-11 18:40:44` +> **First Trade opened:** `3 days ago` +> **Latest Trade opened:** `2 minutes ago` +> **Avg. Duration:** `2:33:45` +> **Best Performing:** `PAY/BTC: 50.23%` +> **Trading volume:** `0.5 BTC` +> **Profit factor:** `1.04` +> **Win / Loss:** `102 / 36` +> **Winrate:** `73.91%` +> **Expectancy (Ratio):** `4.87 (1.66)` +> **Max Drawdown:** `9.23% (0.01255 BTC)` + +The relative profit of `1.2%` is the average profit per trade. +The relative profit of `15.2 Σ%` is be based on the starting capital - so in this case, the starting capital was `0.00485701 * 1.152 = 0.00738 BTC`. +**Starting capital(**) is either taken from the `available_capital` setting, or calculated by using current wallet size - profits. +**Profit Factor** is calculated as gross profits / gross losses - and should serve as an overall metric for the strategy. +**Expectancy** corresponds to the average return per currency unit at risk, i.e. the winrate and the risk-reward ratio (the average gain of winning trades compared to the average loss of losing trades). +**Expectancy Ratio** is expected profit or loss of a subsequent trade based on the performance of all past trades. +**Max drawdown** corresponds to the backtesting metric `Absolute Drawdown (Account)` - calculated as `(Absolute Drawdown) / (DrawdownHigh + startingBalance)`. +**Bot started date** will refer to the date the bot was first started. For older bots, this will default to the first trade's open date. ### /forceexit @@ -329,33 +352,34 @@ Note that for this to work, `force_entry_enable` needs to be set to true. ### /performance Return the performance of each crypto-currency the bot has sold. -> Performance: -> 1. `RCN/BTC 0.003 BTC (57.77%) (1)` -> 2. `PAY/BTC 0.0012 BTC (56.91%) (1)` -> 3. `VIB/BTC 0.0011 BTC (47.07%) (1)` -> 4. `SALT/BTC 0.0010 BTC (30.24%) (1)` -> 5. `STORJ/BTC 0.0009 BTC (27.24%) (1)` -> ... +> Performance: +> 1. `RCN/BTC 0.003 BTC (57.77%) (1)` +> 2. `PAY/BTC 0.0012 BTC (56.91%) (1)` +> 3. `VIB/BTC 0.0011 BTC (47.07%) (1)` +> 4. `SALT/BTC 0.0010 BTC (30.24%) (1)` +> 5. `STORJ/BTC 0.0009 BTC (27.24%) (1)` +> ... ### /balance Return the balance of all crypto-currency your have on the exchange. -> **Currency:** BTC -> **Available:** 3.05890234 -> **Balance:** 3.05890234 -> **Pending:** 0.0 - -> **Currency:** CVC -> **Available:** 86.64180098 -> **Balance:** 86.64180098 -> **Pending:** 0.0 +> **Currency:** BTC +> **Available:** 3.05890234 +> **Balance:** 3.05890234 +> **Pending:** 0.0 +> +> **Currency:** CVC +> **Available:** 86.64180098 +> **Balance:** 86.64180098 +> **Pending:** 0.0 ### /daily Per default `/daily` will return the 7 last days. The example below if for `/daily 3`: > **Daily Profit over the last 3 days:** + ``` Day (count) USDT USD Profit % -------------- ------------ ---------- ---------- @@ -370,6 +394,7 @@ Per default `/weekly` will return the 8 last weeks, including the current week. from Monday. The example below if for `/weekly 3`: > **Weekly Profit over the last 3 weeks (starting from Monday):** + ``` Monday (count) Profit BTC Profit USD Profit % ------------- -------------- ------------ ---------- @@ -396,18 +421,18 @@ Month (count) Profit BTC Profit USD Profit % Shows the current whitelist -> Using whitelist `StaticPairList` with 22 pairs +> Using whitelist `StaticPairList` with 22 pairs > `IOTA/BTC, NEO/BTC, TRX/BTC, VET/BTC, ADA/BTC, ETC/BTC, NCASH/BTC, DASH/BTC, XRP/BTC, XVG/BTC, EOS/BTC, LTC/BTC, OMG/BTC, BTG/BTC, LSK/BTC, ZEC/BTC, HOT/BTC, IOTX/BTC, XMR/BTC, AST/BTC, XLM/BTC, NANO/BTC` ### /blacklist [pair] Shows the current blacklist. If Pair is set, then this pair will be added to the pairlist. -Also supports multiple pairs, separated by a space. +Also supports multiple pairs, separated by a space. Use `/reload_config` to reset the blacklist. -> Using blacklist `StaticPairList` with 2 pairs ->`DODGE/BTC`, `HOT/BTC`. +> Using blacklist `StaticPairList` with 2 pairs +>`DODGE/BTC`, `HOT/BTC`. ### /edge diff --git a/docs/trade-object.md b/docs/trade-object.md index 7434b826da1..8a6e3b1a73f 100644 --- a/docs/trade-object.md +++ b/docs/trade-object.md @@ -143,6 +143,7 @@ Most properties here can be None as they are dependent on the exchange response. | `remaining` | float | Remaining amount | | `cost` | float | Cost of the order - usually average * filled (*Exchange dependent on futures, may contain the cost with or without leverage and may be in contracts.*) | | `stake_amount` | float | Stake amount used for this order. *Added in 2023.7.* | +| `stake_amount_filled` | float | Filled Stake amount used for this order. *Added in 2024.11.* | | `order_date` | datetime | Order creation date **use `order_date_utc` instead** | | `order_date_utc` | datetime | Order creation date (in UTC) | | `order_fill_date` | datetime | Order fill date **use `order_fill_utc` instead** | diff --git a/freqtrade/__init__.py b/freqtrade/__init__.py index 08667e82757..8688aa917f2 100644 --- a/freqtrade/__init__.py +++ b/freqtrade/__init__.py @@ -1,6 +1,6 @@ """Freqtrade bot""" -__version__ = "2024.10-dev" +__version__ = "2024.12-dev" if "dev" in __version__: from pathlib import Path diff --git a/freqtrade/commands/arguments.py b/freqtrade/commands/arguments.py index 0bb572ebca2..a561854718b 100755 --- a/freqtrade/commands/arguments.py +++ b/freqtrade/commands/arguments.py @@ -5,7 +5,7 @@ from argparse import ArgumentParser, Namespace, _ArgumentGroup from functools import partial from pathlib import Path -from typing import Any, Optional, Union +from typing import Any from freqtrade.commands.cli_options import AVAILABLE_CLI_OPTIONS from freqtrade.constants import DEFAULT_CONFIG @@ -37,7 +37,6 @@ ARGS_BACKTEST = ARGS_COMMON_OPTIMIZE + [ "position_stacking", - "use_max_market_positions", "enable_protections", "dry_run_wallet", "timeframe_detail", @@ -53,7 +52,6 @@ "hyperopt", "hyperopt_path", "position_stacking", - "use_max_market_positions", "enable_protections", "dry_run_wallet", "timeframe_detail", @@ -117,7 +115,7 @@ ARGS_BUILD_CONFIG = ["config"] ARGS_SHOW_CONFIG = ["user_data_dir", "config", "show_sensitive"] -ARGS_BUILD_STRATEGY = ["user_data_dir", "strategy", "template"] +ARGS_BUILD_STRATEGY = ["user_data_dir", "strategy", "strategy_path", "template"] ARGS_CONVERT_DATA_TRADES = ["pairs", "format_from_trades", "format_to", "erase", "exchange"] ARGS_CONVERT_DATA = ["pairs", "format_from", "format_to", "erase", "exchange"] @@ -242,8 +240,7 @@ ARGS_LOOKAHEAD_ANALYSIS = [ a for a in ARGS_BACKTEST - if a - not in ("position_stacking", "use_max_market_positions", "backtest_cache", "backtest_breakdown") + if a not in ("position_stacking", "backtest_cache", "backtest_breakdown") ] + ["minimum_trade_amount", "targeted_trade_amount", "lookahead_analysis_exportfilename"] ARGS_RECURSIVE_ANALYSIS = ["timeframe", "timerange", "dataformat_ohlcv", "pairs", "startup_candle"] @@ -278,9 +275,9 @@ class Arguments: Arguments Class. Manage the arguments received by the cli """ - def __init__(self, args: Optional[list[str]]) -> None: + def __init__(self, args: list[str] | None) -> None: self.args = args - self._parsed_arg: Optional[Namespace] = None + self._parsed_arg: Namespace | None = None def get_parsed_arg(self) -> dict[str, Any]: """ @@ -322,9 +319,7 @@ def _parse_args(self) -> Namespace: return parsed_arg - def _build_args( - self, optionlist: list[str], parser: Union[ArgumentParser, _ArgumentGroup] - ) -> None: + 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) diff --git a/freqtrade/commands/cli_options.py b/freqtrade/commands/cli_options.py index d279569c506..6e90a521f66 100755 --- a/freqtrade/commands/cli_options.py +++ b/freqtrade/commands/cli_options.py @@ -168,14 +168,6 @@ def __init__(self, *args, **kwargs): action="store_true", default=False, ), - "use_max_market_positions": Arg( - "--dmmp", - "--disable-max-market-positions", - help="Disable applying `max_open_trades` during backtest " - "(same as setting `max_open_trades` to a very high number).", - action="store_false", - default=True, - ), "backtest_show_pair_list": Arg( "--show-pair-list", help="Show backtesting pairlist sorted by profit.", diff --git a/freqtrade/commands/deploy_commands.py b/freqtrade/commands/deploy_commands.py index 0d188e514d5..acd975b9bcd 100644 --- a/freqtrade/commands/deploy_commands.py +++ b/freqtrade/commands/deploy_commands.py @@ -86,7 +86,14 @@ def start_new_strategy(args: dict[str, Any]) -> None: config = setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE) if "strategy" in args and args["strategy"]: - new_path = config["user_data_dir"] / USERPATH_STRATEGIES / (args["strategy"] + ".py") + if "strategy_path" in args and args["strategy_path"]: + strategy_dir = Path(args["strategy_path"]) + else: + strategy_dir = config["user_data_dir"] / USERPATH_STRATEGIES + if not strategy_dir.is_dir(): + logger.info(f"Creating strategy directory {strategy_dir}") + strategy_dir.mkdir(parents=True) + new_path = strategy_dir / (args["strategy"] + ".py") if new_path.exists(): raise OperationalException( diff --git a/freqtrade/commands/deploy_ui.py b/freqtrade/commands/deploy_ui.py index 283834b1220..a02315bfcbb 100644 --- a/freqtrade/commands/deploy_ui.py +++ b/freqtrade/commands/deploy_ui.py @@ -1,6 +1,5 @@ import logging from pathlib import Path -from typing import Optional import requests @@ -24,7 +23,7 @@ def clean_ui_subdir(directory: Path): p.rmdir() -def read_ui_version(dest_folder: Path) -> Optional[str]: +def read_ui_version(dest_folder: Path) -> str | None: file = dest_folder / ".uiversion" if not file.is_file(): return None @@ -52,7 +51,7 @@ def download_and_install_ui(dest_folder: Path, dl_url: str, version: str): f.write(version) -def get_ui_download_url(version: Optional[str] = None) -> tuple[str, str]: +def get_ui_download_url(version: str | None = None) -> tuple[str, str]: base_url = "https://api.github.com/repos/freqtrade/frequi/" # Get base UI Repo path diff --git a/freqtrade/commands/hyperopt_commands.py b/freqtrade/commands/hyperopt_commands.py index 4bb33c36205..9dfab02c045 100644 --- a/freqtrade/commands/hyperopt_commands.py +++ b/freqtrade/commands/hyperopt_commands.py @@ -15,7 +15,7 @@ def start_hyperopt_list(args: dict[str, Any]) -> None: """ from freqtrade.configuration import setup_utils_configuration from freqtrade.data.btanalysis import get_latest_hyperopt_file - from freqtrade.optimize.hyperopt_output import HyperoptOutput + from freqtrade.optimize.hyperopt.hyperopt_output import HyperoptOutput from freqtrade.optimize.hyperopt_tools import HyperoptTools config = setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE) diff --git a/freqtrade/commands/list_commands.py b/freqtrade/commands/list_commands.py index 0279f82eec4..c8d476717fb 100644 --- a/freqtrade/commands/list_commands.py +++ b/freqtrade/commands/list_commands.py @@ -1,7 +1,7 @@ import csv import logging import sys -from typing import Any, Union +from typing import Any from freqtrade.enums import RunMode from freqtrade.exceptions import ConfigurationError, OperationalException @@ -87,7 +87,7 @@ def _print_objs_tabular(objs: list, print_colorized: bool) -> None: from rich.text import Text names = [s["name"] for s in objs] - objs_to_print: list[dict[str, Union[Text, str]]] = [ + objs_to_print: list[dict[str, Text | str]] = [ { "name": Text(s["name"] if s["name"] else "--"), "location": s["location_rel"], diff --git a/freqtrade/commands/optimize_commands.py b/freqtrade/commands/optimize_commands.py index ea75f3bd173..9695a313b9c 100644 --- a/freqtrade/commands/optimize_commands.py +++ b/freqtrade/commands/optimize_commands.py @@ -17,7 +17,7 @@ def setup_optimize_configuration(args: dict[str, Any], method: RunMode) -> dict[ :return: Configuration """ from freqtrade.configuration import setup_utils_configuration - from freqtrade.util import fmt_coin + from freqtrade.util import fmt_coin, get_dry_run_wallet config = setup_utils_configuration(args, method) @@ -26,7 +26,7 @@ def setup_optimize_configuration(args: dict[str, Any], method: RunMode) -> dict[ RunMode.HYPEROPT: "hyperoptimization", } if method in no_unlimited_runmodes.keys(): - wallet_size = config["dry_run_wallet"] * config["tradable_balance_ratio"] + wallet_size = get_dry_run_wallet(config) * config["tradable_balance_ratio"] # tradable_balance_ratio if ( config["stake_amount"] != constants.UNLIMITED_STAKE_AMOUNT diff --git a/freqtrade/configuration/config_schema.py b/freqtrade/configuration/config_schema.py index 9eb9c047776..9af3f0950d7 100644 --- a/freqtrade/configuration/config_schema.py +++ b/freqtrade/configuration/config_schema.py @@ -85,8 +85,10 @@ }, "dry_run_wallet": { "description": "Initial wallet balance for dry run mode.", - "type": "number", + "type": ["number", "object"], "default": DRY_RUN_WALLET, + "patternProperties": {r"^[a-zA-Z0-9]+$": {"type": "number"}}, + "additionalProperties": False, }, "cancel_open_orders_on_exit": { "description": "Cancel open orders when exiting.", @@ -458,7 +460,11 @@ }, "token": {"description": "Telegram bot token.", "type": "string"}, "chat_id": { - "description": "Telegram chat ID", + "description": "Telegram chat or group ID", + "type": "string", + }, + "topic_id": { + "description": "Telegram topic ID - only applicable for group chats", "type": "string", }, "allow_custom_messages": { @@ -517,8 +523,11 @@ }, "exit_fill": { "description": "Telegram setting for exit fill signals.", - "type": "string", - "enum": TELEGRAM_SETTING_OPTIONS, + "type": ["string", "object"], + "additionalProperties": { + "type": "string", + "enum": TELEGRAM_SETTING_OPTIONS, + }, "default": "on", }, "exit_cancel": { @@ -995,6 +1004,13 @@ "type": "string", "default": "example", }, + "wait_for_training_iteration_on_reload": { + "description": ( + "Wait for the next training iteration to complete after /reload or ctrl+c." + ), + "type": "boolean", + "default": True, + }, "feature_parameters": { "description": "The parameters used to engineer the feature set", "type": "object", diff --git a/freqtrade/configuration/configuration.py b/freqtrade/configuration/configuration.py index c9ab86737d9..796296a7b3e 100644 --- a/freqtrade/configuration/configuration.py +++ b/freqtrade/configuration/configuration.py @@ -5,9 +5,10 @@ import ast import logging import warnings +from collections.abc import Callable from copy import deepcopy from pathlib import Path -from typing import Any, Callable, Optional +from typing import Any from freqtrade import constants from freqtrade.configuration.deprecated_settings import process_temporary_deprecated_settings @@ -37,9 +38,9 @@ class Configuration: Reuse this class for the bot, backtesting, hyperopt and every script that required configuration """ - def __init__(self, args: dict[str, Any], runmode: Optional[RunMode] = None) -> None: + def __init__(self, args: dict[str, Any], runmode: RunMode | None = None) -> None: self.args = args - self.config: Optional[Config] = None + self.config: Config | None = None self.runmode = runmode def get_config(self) -> Config: @@ -241,11 +242,7 @@ def _process_optimize_options(self, config: Config) -> None: logstring="Parameter --enable-protections detected, enabling Protections. ...", ) - if "use_max_market_positions" in self.args and not self.args["use_max_market_positions"]: - config.update({"use_max_market_positions": False}) - logger.info("Parameter --disable-max-market-positions detected ...") - logger.info("max_open_trades set to unlimited ...") - elif "max_open_trades" in self.args and self.args["max_open_trades"]: + if "max_open_trades" in self.args and self.args["max_open_trades"]: config.update({"max_open_trades": self.args["max_open_trades"]}) logger.info( "Parameter --max-open-trades detected, overriding max_open_trades to: %s ...", @@ -455,8 +452,8 @@ def _args_to_config( config: Config, argname: str, logstring: str, - logfun: Optional[Callable] = None, - deprecated_msg: Optional[str] = None, + logfun: Callable | None = None, + deprecated_msg: str | None = None, ) -> None: """ :param config: Configuration dictionary diff --git a/freqtrade/configuration/deprecated_settings.py b/freqtrade/configuration/deprecated_settings.py index c4d78e5889c..202c317decb 100644 --- a/freqtrade/configuration/deprecated_settings.py +++ b/freqtrade/configuration/deprecated_settings.py @@ -3,7 +3,6 @@ """ import logging -from typing import Optional from freqtrade.constants import Config from freqtrade.exceptions import ConfigurationError, OperationalException @@ -14,9 +13,9 @@ def check_conflicting_settings( config: Config, - section_old: Optional[str], + section_old: str | None, name_old: str, - section_new: Optional[str], + section_new: str | None, name_new: str, ) -> None: section_new_config = config.get(section_new, {}) if section_new else config @@ -34,7 +33,7 @@ def check_conflicting_settings( def process_removed_setting( - config: Config, section1: str, name1: str, section2: Optional[str], name2: str + config: Config, section1: str, name1: str, section2: str | None, name2: str ) -> None: """ :param section1: Removed section @@ -54,9 +53,9 @@ def process_removed_setting( def process_deprecated_setting( config: Config, - section_old: Optional[str], + section_old: str | None, name_old: str, - section_new: Optional[str], + section_new: str | None, name_new: str, ) -> None: check_conflicting_settings(config, section_old, name_old, section_new, name_new) diff --git a/freqtrade/configuration/directory_operations.py b/freqtrade/configuration/directory_operations.py index 448cf1acdc3..4cbd444a372 100644 --- a/freqtrade/configuration/directory_operations.py +++ b/freqtrade/configuration/directory_operations.py @@ -1,7 +1,6 @@ import logging import shutil from pathlib import Path -from typing import Optional from freqtrade.configuration.detect_environment import running_in_docker from freqtrade.constants import ( @@ -18,7 +17,7 @@ logger = logging.getLogger(__name__) -def create_datadir(config: Config, datadir: Optional[str] = None) -> Path: +def create_datadir(config: Config, datadir: str | None = None) -> Path: folder = Path(datadir) if datadir else Path(f"{config['user_data_dir']}/data") if not datadir: # set datadir diff --git a/freqtrade/configuration/environment_vars.py b/freqtrade/configuration/environment_vars.py index 37445538deb..8a825f59ba5 100644 --- a/freqtrade/configuration/environment_vars.py +++ b/freqtrade/configuration/environment_vars.py @@ -2,6 +2,8 @@ import os from typing import Any +import rapidjson + from freqtrade.constants import ENV_VAR_PREFIX from freqtrade.misc import deep_merge_dicts @@ -20,6 +22,14 @@ def _get_var_typed(val): return True elif val.lower() in ("f", "false"): return False + # try to convert from json + try: + value = rapidjson.loads(val) + # Limited to lists for now + if isinstance(value, list): + return value + except rapidjson.JSONDecodeError: + pass # keep as string return val diff --git a/freqtrade/configuration/load_config.py b/freqtrade/configuration/load_config.py index 6ff45124671..e18707a9938 100644 --- a/freqtrade/configuration/load_config.py +++ b/freqtrade/configuration/load_config.py @@ -7,7 +7,7 @@ import sys from copy import deepcopy from pathlib import Path -from typing import Any, Optional +from typing import Any import rapidjson @@ -78,7 +78,7 @@ def load_config_file(path: str) -> dict[str, Any]: def load_from_files( - files: list[str], base_path: Optional[Path] = None, level: int = 0 + files: list[str], base_path: Path | None = None, level: int = 0 ) -> dict[str, Any]: """ Recursively load configuration files if specified. diff --git a/freqtrade/configuration/timerange.py b/freqtrade/configuration/timerange.py index 6449086fab0..8afee82d141 100644 --- a/freqtrade/configuration/timerange.py +++ b/freqtrade/configuration/timerange.py @@ -5,7 +5,6 @@ import logging import re from datetime import datetime, timezone -from typing import Optional from typing_extensions import Self @@ -25,24 +24,24 @@ class TimeRange: def __init__( self, - starttype: Optional[str] = None, - stoptype: Optional[str] = None, + starttype: str | None = None, + stoptype: str | None = None, startts: int = 0, stopts: int = 0, ): - self.starttype: Optional[str] = starttype - self.stoptype: Optional[str] = stoptype + self.starttype: str | None = starttype + self.stoptype: str | None = stoptype self.startts: int = startts self.stopts: int = stopts @property - def startdt(self) -> Optional[datetime]: + def startdt(self) -> datetime | None: if self.startts: return datetime.fromtimestamp(self.startts, tz=timezone.utc) return None @property - def stopdt(self) -> Optional[datetime]: + def stopdt(self) -> datetime | None: if self.stopts: return datetime.fromtimestamp(self.stopts, tz=timezone.utc) return None @@ -120,7 +119,7 @@ def adjust_start_if_necessary( self.starttype = "date" @classmethod - def parse_timerange(cls, text: Optional[str]) -> Self: + def parse_timerange(cls, text: str | None) -> Self: """ Parse the value of the argument --timerange to determine what is the range desired :param text: value from --timerange diff --git a/freqtrade/constants.py b/freqtrade/constants.py index 9acb3bdc03f..266db9ae54b 100644 --- a/freqtrade/constants.py +++ b/freqtrade/constants.py @@ -4,7 +4,7 @@ bot constants """ -from typing import Any, Literal, Optional +from typing import Any, Literal from freqtrade.enums import CandleType, PriceType @@ -38,6 +38,7 @@ "MaxDrawDownHyperOptLoss", "MaxDrawDownRelativeHyperOptLoss", "ProfitDrawDownHyperOptLoss", + "MultiMetricHyperOptLoss", ] AVAILABLE_PAIRLISTS = [ "StaticPairList", @@ -97,7 +98,7 @@ ENV_VAR_PREFIX = "FREQTRADE__" -CANCELED_EXCHANGE_STATES = ("cancelled", "canceled", "expired") +CANCELED_EXCHANGE_STATES = ("cancelled", "canceled", "expired", "rejected") NON_OPEN_EXCHANGE_STATES = CANCELED_EXCHANGE_STATES + ("closed",) # Define decimals per coin for outputs @@ -193,7 +194,7 @@ # Type for trades list TradeList = list[list] # ticks, pair, timeframe, CandleType -TickWithTimeframe = tuple[str, str, CandleType, Optional[int], Optional[int]] +TickWithTimeframe = tuple[str, str, CandleType, int | None, int | None] ListTicksWithTimeframes = list[TickWithTimeframe] LongShort = Literal["long", "short"] diff --git a/freqtrade/data/btanalysis.py b/freqtrade/data/btanalysis.py index 7e4d02f753b..a9d8648d2ce 100644 --- a/freqtrade/data/btanalysis.py +++ b/freqtrade/data/btanalysis.py @@ -6,7 +6,7 @@ from copy import copy from datetime import datetime, timezone from pathlib import Path -from typing import Any, Literal, Optional, Union +from typing import Any, Literal import numpy as np import pandas as pd @@ -53,7 +53,7 @@ ] -def get_latest_optimize_filename(directory: Union[Path, str], variant: str) -> str: +def get_latest_optimize_filename(directory: Path | str, variant: str) -> str: """ Get latest backtest export based on '.last_result.json'. :param directory: Directory to search for last result @@ -84,7 +84,7 @@ def get_latest_optimize_filename(directory: Union[Path, str], variant: str) -> s return data[f"latest_{variant}"] -def get_latest_backtest_filename(directory: Union[Path, str]) -> str: +def get_latest_backtest_filename(directory: Path | str) -> str: """ Get latest backtest export based on '.last_result.json'. :param directory: Directory to search for last result @@ -97,7 +97,7 @@ def get_latest_backtest_filename(directory: Union[Path, str]) -> str: return get_latest_optimize_filename(directory, "backtest") -def get_latest_hyperopt_filename(directory: Union[Path, str]) -> str: +def get_latest_hyperopt_filename(directory: Path | str) -> str: """ Get latest hyperopt export based on '.last_result.json'. :param directory: Directory to search for last result @@ -114,9 +114,7 @@ def get_latest_hyperopt_filename(directory: Union[Path, str]) -> str: return "hyperopt_results.pickle" -def get_latest_hyperopt_file( - directory: Union[Path, str], predef_filename: Optional[str] = None -) -> Path: +def get_latest_hyperopt_file(directory: Path | str, predef_filename: str | None = None) -> Path: """ Get latest hyperopt export based on '.last_result.json'. :param directory: Directory to search for last result @@ -137,7 +135,7 @@ def get_latest_hyperopt_file( return directory / get_latest_hyperopt_filename(directory) -def load_backtest_metadata(filename: Union[Path, str]) -> dict[str, Any]: +def load_backtest_metadata(filename: Path | str) -> dict[str, Any]: """ Read metadata dictionary from backtest results file without reading and deserializing entire file. @@ -154,7 +152,7 @@ def load_backtest_metadata(filename: Union[Path, str]) -> dict[str, Any]: raise OperationalException("Unexpected error while loading backtest metadata.") from e -def load_backtest_stats(filename: Union[Path, str]) -> BacktestResultType: +def load_backtest_stats(filename: Path | str) -> BacktestResultType: """ Load backtest statistics file. :param filename: pathlib.Path object, or string pointing to the file. @@ -276,7 +274,7 @@ def get_backtest_market_change(filename: Path, include_ts: bool = True) -> pd.Da def find_existing_backtest_stats( - dirname: Union[Path, str], run_ids: dict[str, str], min_backtest_date: Optional[datetime] = None + dirname: Path | str, run_ids: dict[str, str], min_backtest_date: datetime | None = None ) -> dict[str, Any]: """ Find existing backtest stats that match specified run IDs and load them. @@ -345,7 +343,7 @@ def _load_backtest_data_df_compatibility(df: pd.DataFrame) -> pd.DataFrame: return df -def load_backtest_data(filename: Union[Path, str], strategy: Optional[str] = None) -> pd.DataFrame: +def load_backtest_data(filename: Path | str, strategy: str | None = None) -> pd.DataFrame: """ Load backtest data file. :param filename: pathlib.Path object, or string pointing to a file or directory @@ -439,7 +437,7 @@ def evaluate_result_multi( return df_final[df_final["open_trades"] > max_open_trades] -def trade_list_to_dataframe(trades: Union[list[Trade], list[LocalTrade]]) -> pd.DataFrame: +def trade_list_to_dataframe(trades: list[Trade] | list[LocalTrade]) -> pd.DataFrame: """ Convert list of Trade objects to pandas Dataframe :param trades: List of trade objects @@ -453,7 +451,7 @@ def trade_list_to_dataframe(trades: Union[list[Trade], list[LocalTrade]]) -> pd. return df -def load_trades_from_db(db_url: str, strategy: Optional[str] = None) -> pd.DataFrame: +def load_trades_from_db(db_url: str, strategy: str | None = None) -> pd.DataFrame: """ Load trades from a DB (using dburl) :param db_url: Sqlite url (default format sqlite:///tradesv3.dry-run.sqlite) @@ -476,7 +474,7 @@ def load_trades( db_url: str, exportfilename: Path, no_trades: bool = False, - strategy: Optional[str] = None, + strategy: str | None = None, ) -> pd.DataFrame: """ Based on configuration option 'trade_source': diff --git a/freqtrade/data/converter/orderflow.py b/freqtrade/data/converter/orderflow.py index e64caa88b99..a51394ce9d9 100644 --- a/freqtrade/data/converter/orderflow.py +++ b/freqtrade/data/converter/orderflow.py @@ -4,20 +4,31 @@ import logging import time -import typing -from collections import OrderedDict from datetime import datetime import numpy as np import pandas as pd from freqtrade.constants import DEFAULT_ORDERFLOW_COLUMNS, Config -from freqtrade.enums import RunMode from freqtrade.exceptions import DependencyException logger = logging.getLogger(__name__) +ORDERFLOW_ADDED_COLUMNS = [ + "trades", + "orderflow", + "imbalances", + "stacked_imbalances_bid", + "stacked_imbalances_ask", + "max_delta", + "min_delta", + "bid", + "ask", + "delta", + "total_trades", +] + def _init_dataframe_with_trades_columns(dataframe: pd.DataFrame): """ @@ -25,53 +36,73 @@ def _init_dataframe_with_trades_columns(dataframe: pd.DataFrame): :param dataframe: Dataframe to populate """ # Initialize columns with appropriate dtypes - dataframe["trades"] = np.nan - dataframe["orderflow"] = np.nan - dataframe["imbalances"] = np.nan - dataframe["stacked_imbalances_bid"] = np.nan - dataframe["stacked_imbalances_ask"] = np.nan - dataframe["max_delta"] = np.nan - dataframe["min_delta"] = np.nan - dataframe["bid"] = np.nan - dataframe["ask"] = np.nan - dataframe["delta"] = np.nan - dataframe["total_trades"] = np.nan - - # Ensure the 'trades' column is of object type - dataframe["trades"] = dataframe["trades"].astype(object) - dataframe["orderflow"] = dataframe["orderflow"].astype(object) - dataframe["imbalances"] = dataframe["imbalances"].astype(object) - dataframe["stacked_imbalances_bid"] = dataframe["stacked_imbalances_bid"].astype(object) - dataframe["stacked_imbalances_ask"] = dataframe["stacked_imbalances_ask"].astype(object) + for column in ORDERFLOW_ADDED_COLUMNS: + dataframe[column] = np.nan + + # Set columns to object type + for column in ( + "trades", + "orderflow", + "imbalances", + "stacked_imbalances_bid", + "stacked_imbalances_ask", + ): + dataframe[column] = dataframe[column].astype(object) + + +def timeframe_to_DateOffset(timeframe: str) -> pd.DateOffset: + """ + Translates the timeframe interval value written in the human readable + form ('1m', '5m', '1h', '1d', '1w', etc.) to the number + of seconds for one timeframe interval. + """ + from freqtrade.exchange import timeframe_to_seconds + + timeframe_seconds = timeframe_to_seconds(timeframe) + timeframe_minutes = timeframe_seconds // 60 + if timeframe_minutes < 1: + return pd.DateOffset(seconds=timeframe_seconds) + elif 59 < timeframe_minutes < 1440: + return pd.DateOffset(hours=timeframe_minutes // 60) + elif 1440 <= timeframe_minutes < 10080: + return pd.DateOffset(days=timeframe_minutes // 1440) + elif 10000 < timeframe_minutes < 43200: + return pd.DateOffset(weeks=1) + elif timeframe_minutes >= 43200 and timeframe_minutes < 525600: + return pd.DateOffset(months=1) + elif timeframe == "1y": + return pd.DateOffset(years=1) + else: + return pd.DateOffset(minutes=timeframe_minutes) def _calculate_ohlcv_candle_start_and_end(df: pd.DataFrame, timeframe: str): - from freqtrade.exchange import timeframe_to_next_date, timeframe_to_resample_freq + from freqtrade.exchange import timeframe_to_resample_freq - timeframe_frequency = timeframe_to_resample_freq(timeframe) - # calculate ohlcv candle start and end if df is not None and not df.empty: + timeframe_frequency = timeframe_to_resample_freq(timeframe) + dofs = timeframe_to_DateOffset(timeframe) + # calculate ohlcv candle start and end df["datetime"] = pd.to_datetime(df["date"], unit="ms") df["candle_start"] = df["datetime"].dt.floor(timeframe_frequency) # used in _now_is_time_to_refresh_trades - df["candle_end"] = df["candle_start"].apply( - lambda candle_start: timeframe_to_next_date(timeframe, candle_start) - ) + df["candle_end"] = df["candle_start"] + dofs df.drop(columns=["datetime"], inplace=True) def populate_dataframe_with_trades( - cached_grouped_trades: OrderedDict[tuple[datetime, datetime], pd.DataFrame], + cached_grouped_trades: pd.DataFrame | None, config: Config, dataframe: pd.DataFrame, trades: pd.DataFrame, -) -> tuple[pd.DataFrame, OrderedDict[tuple[datetime, datetime], pd.DataFrame]]: +) -> tuple[pd.DataFrame, pd.DataFrame]: """ Populates a dataframe with trades :param dataframe: Dataframe to populate :param trades: Trades to populate with :return: Dataframe with trades populated """ + timeframe = config["timeframe"] config_orderflow = config["orderflow"] @@ -94,71 +125,52 @@ def populate_dataframe_with_trades( # group trades by candle start trades_grouped_by_candle_start = trades.groupby("candle_start", group_keys=False) - # Create Series to hold complex data - trades_series = pd.Series(index=dataframe.index, dtype=object) - orderflow_series = pd.Series(index=dataframe.index, dtype=object) - imbalances_series = pd.Series(index=dataframe.index, dtype=object) - stacked_imbalances_bid_series = pd.Series(index=dataframe.index, dtype=object) - stacked_imbalances_ask_series = pd.Series(index=dataframe.index, dtype=object) - trades_grouped_by_candle_start = trades.groupby("candle_start", group_keys=False) + candle_start: datetime for candle_start, trades_grouped_df in trades_grouped_by_candle_start: is_between = candle_start == dataframe["date"] if is_between.any(): - from freqtrade.exchange import timeframe_to_next_date - - candle_next = timeframe_to_next_date(timeframe, typing.cast(datetime, candle_start)) - if candle_next not in trades_grouped_by_candle_start.groups: - logger.warning( - f"candle at {candle_start} with {len(trades_grouped_df)} trades " - f"might be unfinished, because no finished trades at {candle_next}" - ) - - indices = dataframe.index[is_between].tolist() - # Add trades to each candle - trades_series.loc[indices] = [ - trades_grouped_df.drop(columns=["candle_start", "candle_end"]).to_dict( - orient="records" - ) - ] - # Use caching mechanism - if (candle_start, candle_next) in cached_grouped_trades: - cache_entry = cached_grouped_trades[ - (typing.cast(datetime, candle_start), candle_next) - ] - # dataframe.loc[is_between] = cache_entry # doesn't take, so we need workaround: - # Create a dictionary of the column values to be assigned - update_dict = {c: cache_entry[c].iat[0] for c in cache_entry.columns} - # Assign the values using the update_dict - dataframe.loc[is_between, update_dict.keys()] = pd.DataFrame( - [update_dict], index=dataframe.loc[is_between].index - ) + # there can only be one row with the same date + index = dataframe.index[is_between][0] + + if ( + cached_grouped_trades is not None + and (candle_start == cached_grouped_trades["date"]).any() + ): + # Check if the trades are already in the cache + cache_idx = cached_grouped_trades.index[ + cached_grouped_trades["date"] == candle_start + ][0] + for col in ORDERFLOW_ADDED_COLUMNS: + dataframe.at[index, col] = cached_grouped_trades.at[cache_idx, col] continue + dataframe.at[index, "trades"] = trades_grouped_df.drop( + columns=["candle_start", "candle_end"] + ).to_dict(orient="records") + # Calculate orderflow for each candle orderflow = trades_to_volumeprofile_with_total_delta_bid_ask( trades_grouped_df, scale=config_orderflow["scale"] ) - orderflow_series.loc[indices] = [orderflow.to_dict(orient="index")] + dataframe.at[index, "orderflow"] = orderflow.to_dict(orient="index") + # orderflow_series.loc[[index]] = [orderflow.to_dict(orient="index")] # Calculate imbalances for each candle's orderflow imbalances = trades_orderflow_to_imbalances( orderflow, imbalance_ratio=config_orderflow["imbalance_ratio"], imbalance_volume=config_orderflow["imbalance_volume"], ) - imbalances_series.loc[indices] = [imbalances.to_dict(orient="index")] + dataframe.at[index, "imbalances"] = imbalances.to_dict(orient="index") stacked_imbalance_range = config_orderflow["stacked_imbalance_range"] - stacked_imbalances_bid_series.loc[indices] = [ - stacked_imbalance_bid( - imbalances, stacked_imbalance_range=stacked_imbalance_range - ) - ] - stacked_imbalances_ask_series.loc[indices] = [ - stacked_imbalance_ask( - imbalances, stacked_imbalance_range=stacked_imbalance_range - ) - ] + dataframe.at[index, "stacked_imbalances_bid"] = stacked_imbalance_bid( + imbalances, stacked_imbalance_range=stacked_imbalance_range + ) + + dataframe.at[index, "stacked_imbalances_ask"] = stacked_imbalance_ask( + imbalances, stacked_imbalance_range=stacked_imbalance_range + ) bid = np.where( trades_grouped_df["side"].str.contains("sell"), trades_grouped_df["amount"], 0 @@ -168,39 +180,20 @@ def populate_dataframe_with_trades( trades_grouped_df["side"].str.contains("buy"), trades_grouped_df["amount"], 0 ) deltas_per_trade = ask - bid - min_delta = deltas_per_trade.cumsum().min() - max_delta = deltas_per_trade.cumsum().max() - dataframe.loc[indices, "max_delta"] = max_delta - dataframe.loc[indices, "min_delta"] = min_delta - - dataframe.loc[indices, "bid"] = bid.sum() - dataframe.loc[indices, "ask"] = ask.sum() - dataframe.loc[indices, "delta"] = ( - dataframe.loc[indices, "ask"] - dataframe.loc[indices, "bid"] - ) - dataframe.loc[indices, "total_trades"] = len(trades_grouped_df) + dataframe.at[index, "max_delta"] = deltas_per_trade.cumsum().max() + dataframe.at[index, "min_delta"] = deltas_per_trade.cumsum().min() - # Cache the result - cached_grouped_trades[(typing.cast(datetime, candle_start), candle_next)] = ( - dataframe.loc[is_between].copy() + dataframe.at[index, "bid"] = bid.sum() + dataframe.at[index, "ask"] = ask.sum() + dataframe.at[index, "delta"] = ( + dataframe.at[index, "ask"] - dataframe.at[index, "bid"] ) + dataframe.at[index, "total_trades"] = len(trades_grouped_df) - # Maintain cache size - if ( - config.get("runmode") in (RunMode.DRY_RUN, RunMode.LIVE) - and len(cached_grouped_trades) > config_orderflow["cache_size"] - ): - cached_grouped_trades.popitem(last=False) - else: - logger.debug(f"Found NO candles for trades starting with {candle_start}") logger.debug(f"trades.groups_keys in {time.time() - start_time} seconds") - # Merge the complex data Series back into the DataFrame - dataframe["trades"] = trades_series - dataframe["orderflow"] = orderflow_series - dataframe["imbalances"] = imbalances_series - dataframe["stacked_imbalances_bid"] = stacked_imbalances_bid_series - dataframe["stacked_imbalances_ask"] = stacked_imbalances_ask_series + # Cache the entire dataframe + cached_grouped_trades = dataframe.tail(config_orderflow["cache_size"]).copy() except Exception as e: logger.exception("Error populating dataframe with trades") diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 491728695fc..7e4fc36d48a 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -8,7 +8,7 @@ import logging from collections import deque from datetime import datetime, timezone -from typing import Any, Optional +from typing import Any from pandas import DataFrame, Timedelta, Timestamp, to_timedelta @@ -40,17 +40,17 @@ class DataProvider: def __init__( self, config: Config, - exchange: Optional[Exchange], + exchange: Exchange | None, pairlists=None, - rpc: Optional[RPCManager] = None, + rpc: RPCManager | None = None, ) -> None: self._config = config self._exchange = exchange self._pairlists = pairlists self.__rpc = rpc self.__cached_pairs: dict[PairWithTimeframe, tuple[DataFrame, datetime]] = {} - self.__slice_index: Optional[int] = None - self.__slice_date: Optional[datetime] = None + self.__slice_index: int | None = None + self.__slice_date: datetime | None = None self.__cached_pairs_backtesting: dict[PairWithTimeframe, DataFrame] = {} self.__producer_pairs_df: dict[ @@ -255,8 +255,8 @@ def _add_external_df( def get_producer_df( self, pair: str, - timeframe: Optional[str] = None, - candle_type: Optional[CandleType] = None, + timeframe: str | None = None, + candle_type: CandleType | None = None, producer_name: str = "default", ) -> tuple[DataFrame, datetime]: """ @@ -349,7 +349,7 @@ def get_required_startup(self, timeframe: str) -> int: return total_candles def get_pair_dataframe( - self, pair: str, timeframe: Optional[str] = None, candle_type: str = "" + self, pair: str, timeframe: str | None = None, candle_type: str = "" ) -> DataFrame: """ Return pair candle (OHLCV) data, either live or cached historical -- depending @@ -437,7 +437,7 @@ def clear_cache(self): def refresh( self, pairlist: ListPairsWithTimeframes, - helping_pairs: Optional[ListPairsWithTimeframes] = None, + helping_pairs: ListPairsWithTimeframes | None = None, ) -> None: """ Refresh data, called with each cycle @@ -471,7 +471,7 @@ def available_pairs(self) -> ListPairsWithTimeframes: return list(self._exchange._klines.keys()) def ohlcv( - self, pair: str, timeframe: Optional[str] = None, copy: bool = True, candle_type: str = "" + self, pair: str, timeframe: str | None = None, copy: bool = True, candle_type: str = "" ) -> DataFrame: """ Get candle (OHLCV) data for the given pair as DataFrame @@ -497,7 +497,7 @@ def ohlcv( return DataFrame() def trades( - self, pair: str, timeframe: Optional[str] = None, copy: bool = True, candle_type: str = "" + self, pair: str, timeframe: str | None = None, copy: bool = True, candle_type: str = "" ) -> DataFrame: """ Get candle (TRADES) data for the given pair as DataFrame @@ -529,7 +529,7 @@ def trades( ) return trades_df - def market(self, pair: str) -> Optional[dict[str, Any]]: + def market(self, pair: str) -> dict[str, Any] | None: """ Return market data for the pair :param pair: Pair to get the data for diff --git a/freqtrade/data/history/datahandlers/featherdatahandler.py b/freqtrade/data/history/datahandlers/featherdatahandler.py index 8b1acb09c21..46fd7e3ae2c 100644 --- a/freqtrade/data/history/datahandlers/featherdatahandler.py +++ b/freqtrade/data/history/datahandlers/featherdatahandler.py @@ -1,5 +1,4 @@ import logging -from typing import Optional from pandas import DataFrame, read_feather, to_datetime @@ -37,7 +36,7 @@ def ohlcv_store( ) def _ohlcv_load( - self, pair: str, timeframe: str, timerange: Optional[TimeRange], candle_type: CandleType + self, pair: str, timeframe: str, timerange: TimeRange | None, candle_type: CandleType ) -> DataFrame: """ Internal method used to load data for one pair from disk. @@ -59,20 +58,25 @@ def _ohlcv_load( ) if not filename.exists(): return DataFrame(columns=self._columns) - - pairdata = read_feather(filename) - pairdata.columns = self._columns - pairdata = pairdata.astype( - dtype={ - "open": "float", - "high": "float", - "low": "float", - "close": "float", - "volume": "float", - } - ) - pairdata["date"] = to_datetime(pairdata["date"], unit="ms", utc=True) - return pairdata + try: + pairdata = read_feather(filename) + pairdata.columns = self._columns + pairdata = pairdata.astype( + dtype={ + "open": "float", + "high": "float", + "low": "float", + "close": "float", + "volume": "float", + } + ) + pairdata["date"] = to_datetime(pairdata["date"], unit="ms", utc=True) + return pairdata + except Exception as e: + logger.exception( + f"Error loading data from {filename}. Exception: {e}. Returning empty dataframe." + ) + return DataFrame(columns=self._columns) def ohlcv_append( self, pair: str, timeframe: str, data: DataFrame, candle_type: CandleType @@ -108,7 +112,7 @@ def trades_append(self, pair: str, data: DataFrame): raise NotImplementedError() def _trades_load( - self, pair: str, trading_mode: TradingMode, timerange: Optional[TimeRange] = None + self, pair: str, trading_mode: TradingMode, timerange: TimeRange | None = None ) -> DataFrame: """ Load a pair from file, either .json.gz or .json diff --git a/freqtrade/data/history/datahandlers/hdf5datahandler.py b/freqtrade/data/history/datahandlers/hdf5datahandler.py index 99d0a98a636..58ae658495d 100644 --- a/freqtrade/data/history/datahandlers/hdf5datahandler.py +++ b/freqtrade/data/history/datahandlers/hdf5datahandler.py @@ -1,5 +1,4 @@ import logging -from typing import Optional import numpy as np import pandas as pd @@ -45,7 +44,7 @@ def ohlcv_store( ) def _ohlcv_load( - self, pair: str, timeframe: str, timerange: Optional[TimeRange], candle_type: CandleType + self, pair: str, timeframe: str, timerange: TimeRange | None, candle_type: CandleType ) -> pd.DataFrame: """ Internal method used to load data for one pair from disk. @@ -69,28 +68,36 @@ def _ohlcv_load( ) if not filename.exists(): return pd.DataFrame(columns=self._columns) - where = [] - if timerange: - if timerange.starttype == "date": - where.append(f"date >= Timestamp({timerange.startts * 1e9})") - if timerange.stoptype == "date": - where.append(f"date <= Timestamp({timerange.stopts * 1e9})") - - pairdata = pd.read_hdf(filename, key=key, mode="r", where=where) - - if list(pairdata.columns) != self._columns: - raise ValueError("Wrong dataframe format") - pairdata = pairdata.astype( - dtype={ - "open": "float", - "high": "float", - "low": "float", - "close": "float", - "volume": "float", - } - ) - pairdata = pairdata.reset_index(drop=True) - return pairdata + try: + where = [] + if timerange: + if timerange.starttype == "date": + where.append(f"date >= Timestamp({timerange.startts * 1e9})") + if timerange.stoptype == "date": + where.append(f"date <= Timestamp({timerange.stopts * 1e9})") + + pairdata = pd.read_hdf(filename, key=key, mode="r", where=where) + + if list(pairdata.columns) != self._columns: + raise ValueError("Wrong dataframe format") + pairdata = pairdata.astype( + dtype={ + "open": "float", + "high": "float", + "low": "float", + "close": "float", + "volume": "float", + } + ) + pairdata = pairdata.reset_index(drop=True) + return pairdata + except ValueError: + raise + except Exception as e: + logger.exception( + f"Error loading data from {filename}. Exception: {e}. Returning empty dataframe." + ) + return pd.DataFrame(columns=self._columns) def ohlcv_append( self, pair: str, timeframe: str, data: pd.DataFrame, candle_type: CandleType @@ -134,7 +141,7 @@ def trades_append(self, pair: str, data: pd.DataFrame): raise NotImplementedError() def _trades_load( - self, pair: str, trading_mode: TradingMode, timerange: Optional[TimeRange] = None + self, pair: str, trading_mode: TradingMode, timerange: TimeRange | None = None ) -> pd.DataFrame: """ Load a pair from h5 file. diff --git a/freqtrade/data/history/datahandlers/idatahandler.py b/freqtrade/data/history/datahandlers/idatahandler.py index 940c4d71ef8..71afe61061a 100644 --- a/freqtrade/data/history/datahandlers/idatahandler.py +++ b/freqtrade/data/history/datahandlers/idatahandler.py @@ -10,7 +10,6 @@ from copy import deepcopy from datetime import datetime, timezone from pathlib import Path -from typing import Optional from pandas import DataFrame, to_datetime @@ -126,7 +125,7 @@ def ohlcv_data_min_max( @abstractmethod def _ohlcv_load( - self, pair: str, timeframe: str, timerange: Optional[TimeRange], candle_type: CandleType + self, pair: str, timeframe: str, timerange: TimeRange | None, candle_type: CandleType ) -> DataFrame: """ Internal method used to load data for one pair from disk. @@ -247,7 +246,7 @@ def trades_append(self, pair: str, data: DataFrame): @abstractmethod def _trades_load( - self, pair: str, trading_mode: TradingMode, timerange: Optional[TimeRange] = None + self, pair: str, trading_mode: TradingMode, timerange: TimeRange | None = None ) -> DataFrame: """ Load a pair from file, either .json.gz or .json @@ -282,7 +281,7 @@ def trades_purge(self, pair: str, trading_mode: TradingMode) -> bool: return False def trades_load( - self, pair: str, trading_mode: TradingMode, timerange: Optional[TimeRange] = None + self, pair: str, trading_mode: TradingMode, timerange: TimeRange | None = None ) -> DataFrame: """ Load a pair from file, either .json.gz or .json @@ -370,7 +369,7 @@ def ohlcv_load( timeframe: str, candle_type: CandleType, *, - timerange: Optional[TimeRange] = None, + timerange: TimeRange | None = None, fill_missing: bool = True, drop_incomplete: bool = False, startup_candles: int = 0, @@ -552,6 +551,13 @@ def get_datahandlerclass(datatype: str) -> type[IDataHandler]: elif datatype == "hdf5": from .hdf5datahandler import HDF5DataHandler + logger.warning( + "DEPRECATED: The hdf5 dataformat is deprecated and will be removed in the " + "next release. " + "Please use the convert-data command to convert your data to a supported format." + "We recommend using the feather format, as it is faster and is more space-efficient." + ) + return HDF5DataHandler elif datatype == "feather": from .featherdatahandler import FeatherDataHandler @@ -566,7 +572,7 @@ def get_datahandlerclass(datatype: str) -> type[IDataHandler]: def get_datahandler( - datadir: Path, data_format: Optional[str] = None, data_handler: Optional[IDataHandler] = None + datadir: Path, data_format: str | None = None, data_handler: IDataHandler | None = None ) -> IDataHandler: """ :param datadir: Folder to save data diff --git a/freqtrade/data/history/datahandlers/jsondatahandler.py b/freqtrade/data/history/datahandlers/jsondatahandler.py index b97b4b8672c..1a33b3e2f59 100644 --- a/freqtrade/data/history/datahandlers/jsondatahandler.py +++ b/freqtrade/data/history/datahandlers/jsondatahandler.py @@ -1,5 +1,4 @@ import logging -from typing import Optional import numpy as np from pandas import DataFrame, read_json, to_datetime @@ -45,7 +44,7 @@ def ohlcv_store( ) def _ohlcv_load( - self, pair: str, timeframe: str, timerange: Optional[TimeRange], candle_type: CandleType + self, pair: str, timeframe: str, timerange: TimeRange | None, candle_type: CandleType ) -> DataFrame: """ Internal method used to load data for one pair from disk. @@ -119,7 +118,7 @@ def trades_append(self, pair: str, data: DataFrame): raise NotImplementedError() def _trades_load( - self, pair: str, trading_mode: TradingMode, timerange: Optional[TimeRange] = None + self, pair: str, trading_mode: TradingMode, timerange: TimeRange | None = None ) -> DataFrame: """ Load a pair from file, either .json.gz or .json diff --git a/freqtrade/data/history/datahandlers/parquetdatahandler.py b/freqtrade/data/history/datahandlers/parquetdatahandler.py index e226d47498e..1813f9991c4 100644 --- a/freqtrade/data/history/datahandlers/parquetdatahandler.py +++ b/freqtrade/data/history/datahandlers/parquetdatahandler.py @@ -1,5 +1,4 @@ import logging -from typing import Optional from pandas import DataFrame, read_parquet, to_datetime @@ -35,7 +34,7 @@ def ohlcv_store( data.reset_index(drop=True).loc[:, self._columns].to_parquet(filename) def _ohlcv_load( - self, pair: str, timeframe: str, timerange: Optional[TimeRange], candle_type: CandleType + self, pair: str, timeframe: str, timerange: TimeRange | None, candle_type: CandleType ) -> DataFrame: """ Internal method used to load data for one pair from disk. @@ -57,20 +56,25 @@ def _ohlcv_load( ) if not filename.exists(): return DataFrame(columns=self._columns) - - pairdata = read_parquet(filename) - pairdata.columns = self._columns - pairdata = pairdata.astype( - dtype={ - "open": "float", - "high": "float", - "low": "float", - "close": "float", - "volume": "float", - } - ) - pairdata["date"] = to_datetime(pairdata["date"], unit="ms", utc=True) - return pairdata + try: + pairdata = read_parquet(filename) + pairdata.columns = self._columns + pairdata = pairdata.astype( + dtype={ + "open": "float", + "high": "float", + "low": "float", + "close": "float", + "volume": "float", + } + ) + pairdata["date"] = to_datetime(pairdata["date"], unit="ms", utc=True) + return pairdata + except Exception as e: + logger.exception( + f"Error loading data from {filename}. Exception: {e}. Returning empty dataframe." + ) + return DataFrame(columns=self._columns) def ohlcv_append( self, pair: str, timeframe: str, data: DataFrame, candle_type: CandleType @@ -106,7 +110,7 @@ def trades_append(self, pair: str, data: DataFrame): raise NotImplementedError() def _trades_load( - self, pair: str, trading_mode: TradingMode, timerange: Optional[TimeRange] = None + self, pair: str, trading_mode: TradingMode, timerange: TimeRange | None = None ) -> DataFrame: """ Load a pair from file, either .json.gz or .json diff --git a/freqtrade/data/history/history_utils.py b/freqtrade/data/history/history_utils.py index 092faa19a64..eb93f3ad5d8 100644 --- a/freqtrade/data/history/history_utils.py +++ b/freqtrade/data/history/history_utils.py @@ -2,18 +2,11 @@ import operator from datetime import datetime, timedelta from pathlib import Path -from typing import Optional from pandas import DataFrame, concat from freqtrade.configuration import TimeRange -from freqtrade.constants import ( - DATETIME_PRINT_FORMAT, - DEFAULT_DATAFRAME_COLUMNS, - DL_DATA_TIMEFRAMES, - DOCS_LINK, - Config, -) +from freqtrade.constants import DATETIME_PRINT_FORMAT, DL_DATA_TIMEFRAMES, DOCS_LINK, Config from freqtrade.data.converter import ( clean_ohlcv_dataframe, convert_trades_to_ohlcv, @@ -25,8 +18,9 @@ from freqtrade.exceptions import OperationalException from freqtrade.exchange import Exchange from freqtrade.plugins.pairlist.pairlist_helpers import dynamic_expand_pairlist -from freqtrade.util import dt_now, dt_ts, format_ms_time, get_progress_tracker +from freqtrade.util import dt_now, dt_ts, format_ms_time from freqtrade.util.migrations import migrate_data +from freqtrade.util.progress_tracker import CustomProgress, retrieve_progress_tracker logger = logging.getLogger(__name__) @@ -37,12 +31,12 @@ def load_pair_history( timeframe: str, datadir: Path, *, - timerange: Optional[TimeRange] = None, + timerange: TimeRange | None = None, fill_up_missing: bool = True, drop_incomplete: bool = False, startup_candles: int = 0, - data_format: Optional[str] = None, - data_handler: Optional[IDataHandler] = None, + data_format: str | None = None, + data_handler: IDataHandler | None = None, candle_type: CandleType = CandleType.SPOT, ) -> DataFrame: """ @@ -79,13 +73,13 @@ def load_data( timeframe: str, pairs: list[str], *, - timerange: Optional[TimeRange] = None, + timerange: TimeRange | None = None, fill_up_missing: bool = True, startup_candles: int = 0, fail_without_data: bool = False, data_format: str = "feather", candle_type: CandleType = CandleType.SPOT, - user_futures_funding_rate: Optional[int] = None, + user_futures_funding_rate: int | None = None, ) -> dict[str, DataFrame]: """ Load ohlcv history data for a list of pairs. @@ -137,8 +131,8 @@ def refresh_data( timeframe: str, pairs: list[str], exchange: Exchange, - data_format: Optional[str] = None, - timerange: Optional[TimeRange] = None, + data_format: str | None = None, + timerange: TimeRange | None = None, candle_type: CandleType, ) -> None: """ @@ -168,11 +162,11 @@ def refresh_data( def _load_cached_data_for_updating( pair: str, timeframe: str, - timerange: Optional[TimeRange], + timerange: TimeRange | None, data_handler: IDataHandler, candle_type: CandleType, prepend: bool = False, -) -> tuple[DataFrame, Optional[int], Optional[int]]: +) -> tuple[DataFrame, int | None, int | None]: """ Load cached data to download more data. If timerange is passed in, checks whether data from an before the stored data will be @@ -200,14 +194,21 @@ def _load_cached_data_for_updating( candle_type=candle_type, ) if not data.empty: - if not prepend and start and start < data.iloc[0]["date"]: - # Earlier data than existing data requested, redownload all - data = DataFrame(columns=DEFAULT_DATAFRAME_COLUMNS) + if prepend: + end = data.iloc[0]["date"] else: - if prepend: - end = data.iloc[0]["date"] - else: - start = data.iloc[-1]["date"] + if start and start < data.iloc[0]["date"]: + # Earlier data than existing data requested, Update start date + logger.info( + f"{pair}, {timeframe}, {candle_type}: " + f"Requested start date {start:{DATETIME_PRINT_FORMAT}} earlier than local " + f"data start date {data.iloc[0]['date']:{DATETIME_PRINT_FORMAT}}. " + f"Use `--prepend` to download data prior " + f"to {data.iloc[0]['date']:{DATETIME_PRINT_FORMAT}}, or " + "`--erase` to redownload all data." + ) + start = data.iloc[-1]["date"] + start_ms = int(start.timestamp() * 1000) if start else None end_ms = int(end.timestamp() * 1000) if end else None return data, start_ms, end_ms @@ -220,8 +221,8 @@ def _download_pair_history( exchange: Exchange, timeframe: str = "5m", new_pairs_days: int = 30, - data_handler: Optional[IDataHandler] = None, - timerange: Optional[TimeRange] = None, + data_handler: IDataHandler | None = None, + timerange: TimeRange | None = None, candle_type: CandleType, erase: bool = False, prepend: bool = False, @@ -284,6 +285,7 @@ def _download_pair_history( candle_type=candle_type, until_ms=until_ms if until_ms else None, ) + logger.info(f"Downloaded data for {pair} with length {len(new_dataframe)}.") if data.empty: data = new_dataframe else: @@ -322,21 +324,24 @@ def refresh_backtest_ohlcv_data( timeframes: list[str], datadir: Path, trading_mode: str, - timerange: Optional[TimeRange] = None, + timerange: TimeRange | None = None, new_pairs_days: int = 30, erase: bool = False, - data_format: Optional[str] = None, + data_format: str | None = None, prepend: bool = False, + progress_tracker: CustomProgress | None = None, ) -> list[str]: """ Refresh stored ohlcv data for backtesting and hyperopt operations. Used by freqtrade download-data subcommand. :return: List of pairs that are not available. """ + progress_tracker = retrieve_progress_tracker(progress_tracker) + pairs_not_available = [] data_handler = get_datahandler(datadir, data_format) candle_type = CandleType.get_default(trading_mode) - with get_progress_tracker() as progress: + 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) pair_task = progress.add_task("Downloading data...", total=len(pairs)) @@ -346,7 +351,7 @@ def refresh_backtest_ohlcv_data( progress.update(timeframe_task, completed=0) if pair not in exchange.markets: - pairs_not_available.append(pair) + pairs_not_available.append(f"{pair}: Pair not available on exchange.") logger.info(f"Skipping pair {pair}...") continue for timeframe in timeframes: @@ -404,7 +409,7 @@ def _download_trades_history( pair: str, *, new_pairs_days: int = 30, - timerange: Optional[TimeRange] = None, + timerange: TimeRange | None = None, data_handler: IDataHandler, trading_mode: TradingMode, ) -> bool: @@ -412,79 +417,74 @@ def _download_trades_history( Download trade history from the exchange. Appends to previously downloaded trades data. """ - try: - until = None - since = 0 - if timerange: - if timerange.starttype == "date": - since = timerange.startts * 1000 - if timerange.stoptype == "date": - until = timerange.stopts * 1000 - - trades = data_handler.trades_load(pair, trading_mode) - - # TradesList columns are defined in constants.DEFAULT_TRADES_COLUMNS - # DEFAULT_TRADES_COLUMNS: 0 -> timestamp - # DEFAULT_TRADES_COLUMNS: 1 -> id - - if not trades.empty and since > 0 and since < trades.iloc[0]["timestamp"]: - # since is before the first trade - logger.info( - f"Start ({trades.iloc[0]['date']:{DATETIME_PRINT_FORMAT}}) earlier than " - f"available data. Redownloading trades for {pair}..." - ) - trades = trades_list_to_df([]) - - from_id = trades.iloc[-1]["id"] if not trades.empty else None - if not trades.empty and since < trades.iloc[-1]["timestamp"]: - # Reset since to the last available point - # - 5 seconds (to ensure we're getting all trades) - since = trades.iloc[-1]["timestamp"] - (5 * 1000) - logger.info( - f"Using last trade date -5s - Downloading trades for {pair} " - f"since: {format_ms_time(since)}." - ) + until = None + since = 0 + if timerange: + if timerange.starttype == "date": + since = timerange.startts * 1000 + if timerange.stoptype == "date": + until = timerange.stopts * 1000 - if not since: - since = dt_ts(dt_now() - timedelta(days=new_pairs_days)) + trades = data_handler.trades_load(pair, trading_mode) - logger.debug( - "Current Start: %s", - "None" if trades.empty else f"{trades.iloc[0]['date']:{DATETIME_PRINT_FORMAT}}", - ) - logger.debug( - "Current End: %s", - "None" if trades.empty else f"{trades.iloc[-1]['date']:{DATETIME_PRINT_FORMAT}}", - ) - logger.info(f"Current Amount of trades: {len(trades)}") + # TradesList columns are defined in constants.DEFAULT_TRADES_COLUMNS + # DEFAULT_TRADES_COLUMNS: 0 -> timestamp + # DEFAULT_TRADES_COLUMNS: 1 -> id - # Default since_ms to 30 days if nothing is given - new_trades = exchange.get_historic_trades( - pair=pair, - since=since, - until=until, - from_id=from_id, + if not trades.empty and since > 0 and since < trades.iloc[0]["timestamp"]: + # since is before the first trade + raise ValueError( + f"Start {format_ms_time(since)} earlier than " + f"available data ({trades.iloc[0]['date']:{DATETIME_PRINT_FORMAT}}). " + f"Please use `--erase` if you'd like to redownload {pair}." ) - new_trades_df = trades_list_to_df(new_trades[1]) - trades = concat([trades, new_trades_df], axis=0) - # Remove duplicates to make sure we're not storing data we don't need - trades = trades_df_remove_duplicates(trades) - data_handler.trades_store(pair, trades, trading_mode) - logger.debug( - "New Start: %s", - "None" if trades.empty else f"{trades.iloc[0]['date']:{DATETIME_PRINT_FORMAT}}", - ) - logger.debug( - "New End: %s", - "None" if trades.empty else f"{trades.iloc[-1]['date']:{DATETIME_PRINT_FORMAT}}", + from_id = trades.iloc[-1]["id"] if not trades.empty else None + if not trades.empty and since < trades.iloc[-1]["timestamp"]: + # Reset since to the last available point + # - 5 seconds (to ensure we're getting all trades) + since = trades.iloc[-1]["timestamp"] - (5 * 1000) + logger.info( + f"Using last trade date -5s - Downloading trades for {pair} " + f"since: {format_ms_time(since)}." ) - logger.info(f"New Amount of trades: {len(trades)}") - return True - except Exception: - logger.exception(f'Failed to download and store historic trades for pair: "{pair}". ') - return False + if not since: + since = dt_ts(dt_now() - timedelta(days=new_pairs_days)) + + logger.debug( + "Current Start: %s", + "None" if trades.empty else f"{trades.iloc[0]['date']:{DATETIME_PRINT_FORMAT}}", + ) + logger.debug( + "Current End: %s", + "None" if trades.empty else f"{trades.iloc[-1]['date']:{DATETIME_PRINT_FORMAT}}", + ) + logger.info(f"Current Amount of trades: {len(trades)}") + + # Default since_ms to 30 days if nothing is given + new_trades = exchange.get_historic_trades( + pair=pair, + since=since, + until=until, + from_id=from_id, + ) + new_trades_df = trades_list_to_df(new_trades[1]) + trades = concat([trades, new_trades_df], axis=0) + # Remove duplicates to make sure we're not storing data we don't need + trades = trades_df_remove_duplicates(trades) + data_handler.trades_store(pair, trades, trading_mode) + + logger.debug( + "New Start: %s", + "None" if trades.empty else f"{trades.iloc[0]['date']:{DATETIME_PRINT_FORMAT}}", + ) + logger.debug( + "New End: %s", + "None" if trades.empty else f"{trades.iloc[-1]['date']:{DATETIME_PRINT_FORMAT}}", + ) + logger.info(f"New Amount of trades: {len(trades)}") + return True def refresh_backtest_trades_data( @@ -496,20 +496,22 @@ def refresh_backtest_trades_data( new_pairs_days: int = 30, erase: bool = False, data_format: str = "feather", + progress_tracker: CustomProgress | None = None, ) -> list[str]: """ Refresh stored trades data for backtesting and hyperopt operations. Used by freqtrade download-data subcommand. :return: List of pairs that are not available. """ + progress_tracker = retrieve_progress_tracker(progress_tracker) pairs_not_available = [] data_handler = get_datahandler(datadir, data_format=data_format) - with get_progress_tracker() as progress: + with progress_tracker as progress: pair_task = progress.add_task("Downloading data...", total=len(pairs)) for pair in pairs: progress.update(pair_task, description=f"Downloading trades [{pair}]") if pair not in exchange.markets: - pairs_not_available.append(pair) + pairs_not_available.append(f"{pair}: Pair not available on exchange.") logger.info(f"Skipping pair {pair}...") continue @@ -518,14 +520,22 @@ def refresh_backtest_trades_data( logger.info(f"Deleting existing data for pair {pair}.") logger.info(f"Downloading trades for pair {pair}.") - _download_trades_history( - exchange=exchange, - pair=pair, - new_pairs_days=new_pairs_days, - timerange=timerange, - data_handler=data_handler, - trading_mode=trading_mode, - ) + try: + _download_trades_history( + exchange=exchange, + pair=pair, + new_pairs_days=new_pairs_days, + timerange=timerange, + data_handler=data_handler, + trading_mode=trading_mode, + ) + except ValueError as e: + pairs_not_available.append(f"{pair}: {str(e)}") + except Exception: + logger.exception( + f'Failed to download and store historic trades for pair: "{pair}". ' + ) + progress.update(pair_task, advance=1) return pairs_not_available @@ -577,8 +587,24 @@ def validate_backtest_data( def download_data_main(config: Config) -> None: + from freqtrade.resolvers.exchange_resolver import ExchangeResolver + + exchange = ExchangeResolver.load_exchange(config, validate=False) + + download_data(config, exchange) + + +def download_data( + config: Config, + exchange: Exchange, + *, + progress_tracker: CustomProgress | None = None, +) -> None: + """ + Download data function. Used from both cli and API. + """ timerange = TimeRange() - if "days" in config: + if "days" in config and config["days"] is not None: time_since = (datetime.now() - timedelta(days=config["days"])).strftime("%Y%m%d") timerange = TimeRange.parse_timerange(f"{time_since}-") @@ -590,10 +616,6 @@ def download_data_main(config: Config) -> None: pairs_not_available: list[str] = [] - # Init exchange - from freqtrade.resolvers.exchange_resolver import ExchangeResolver - - exchange = ExchangeResolver.load_exchange(config, validate=False) available_pairs = [ p for p in exchange.get_markets( @@ -605,17 +627,18 @@ def download_data_main(config: Config) -> None: if "timeframes" not in config: config["timeframes"] = DL_DATA_TIMEFRAMES - logger.info( - f"About to download pairs: {expanded_pairs}, " - f"intervals: {config['timeframes']} to {config['datadir']}" - ) - if len(expanded_pairs) == 0: logger.warning( "No pairs available for download. " "Please make sure you're using the correct Pair naming for your selected trade mode. \n" f"More info: {DOCS_LINK}/bot-basics/#pair-naming" ) + return + + logger.info( + f"About to download pairs: {expanded_pairs}, " + f"intervals: {config['timeframes']} to {config['datadir']}" + ) for timeframe in config["timeframes"]: exchange.validate_timeframes(timeframe) @@ -637,6 +660,7 @@ def download_data_main(config: Config) -> None: erase=bool(config.get("erase")), data_format=config["dataformat_trades"], trading_mode=config.get("trading_mode", TradingMode.SPOT), + progress_tracker=progress_tracker, ) if config.get("convert_trades") or not exchange.get_option("ohlcv_has_history", True): @@ -672,10 +696,12 @@ def download_data_main(config: Config) -> None: data_format=config["dataformat_ohlcv"], trading_mode=config.get("trading_mode", "spot"), prepend=config.get("prepend_data", False), + progress_tracker=progress_tracker, ) finally: if pairs_not_available: - logger.info( - f"Pairs [{','.join(pairs_not_available)}] not available " - f"on exchange {exchange.name}." + errors = "\n" + ("\n".join(pairs_not_available)) + logger.warning( + f"Encountered a problem downloading the following pairs from {exchange.name}: " + f"{errors}" ) diff --git a/freqtrade/exchange/binance.py b/freqtrade/exchange/binance.py index c0e46c32a8b..74a37b4f6ad 100644 --- a/freqtrade/exchange/binance.py +++ b/freqtrade/exchange/binance.py @@ -3,16 +3,20 @@ import logging from datetime import datetime, timezone from pathlib import Path -from typing import Optional import ccxt +from pandas import DataFrame +from freqtrade.constants import DEFAULT_DATAFRAME_COLUMNS from freqtrade.enums import CandleType, MarginMode, PriceType, TradingMode from freqtrade.exceptions import DDosProtection, OperationalException, TemporaryError from freqtrade.exchange import Exchange +from freqtrade.exchange.binance_public_data import concat_safe, download_archive_ohlcv from freqtrade.exchange.common import retrier -from freqtrade.exchange.exchange_types import FtHas, OHLCVResponse, 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.datetime_helpers import dt_from_ts, dt_ts logger = logging.getLogger(__name__) @@ -53,12 +57,18 @@ class Binance(Exchange): (TradingMode.FUTURES, MarginMode.ISOLATED) ] - def get_tickers(self, symbols: Optional[list[str]] = None, cached: bool = False) -> Tickers: - tickers = super().get_tickers(symbols=symbols, cached=cached) + def get_tickers( + self, + symbols: list[str] | None = None, + *, + cached: bool = False, + market_type: TradingMode | None = None, + ) -> Tickers: + tickers = super().get_tickers(symbols=symbols, cached=cached, market_type=market_type) if self.trading_mode == TradingMode.FUTURES: # Binance's future result has no bid/ask values. # Therefore we must fetch that from fetch_bids_asks and combine the two results. - bidsasks = self.fetch_bids_asks(symbols, cached) + bidsasks = self.fetch_bids_asks(symbols, cached=cached) tickers = deep_merge_dicts(bidsasks, tickers, allow_null_overrides=False) return tickers @@ -81,7 +91,10 @@ def additional_exchange_init(self) -> None: "\nHedge Mode is not supported by freqtrade. " "Please change 'Position Mode' on your binance futures account." ) - if assets_margin.get("multiAssetsMargin") is True: + if ( + assets_margin.get("multiAssetsMargin") is True + and self.margin_mode != MarginMode.CROSS + ): msg += ( "\nMulti-Asset Mode is not supported by freqtrade. " "Please change 'Asset Mode' on your binance futures account." @@ -98,23 +111,24 @@ def additional_exchange_init(self) -> None: except ccxt.BaseError as e: raise OperationalException(e) from e - async def _async_get_historic_ohlcv( + def get_historic_ohlcv( self, pair: str, timeframe: str, since_ms: int, candle_type: CandleType, is_new_pair: bool = False, - raise_: bool = False, - until_ms: Optional[int] = None, - ) -> OHLCVResponse: + until_ms: int | None = None, + ) -> DataFrame: """ Overwrite to introduce "fast new pair" functionality by detecting the pair's listing date Does not work for other exchanges, which don't return the earliest data when called with "0" :param candle_type: Any of the enum CandleType (must match trading mode!) """ if is_new_pair: - x = await self._async_get_candle_history(pair, timeframe, candle_type, 0) + x = self.loop.run_until_complete( + self._async_get_candle_history(pair, timeframe, candle_type, 0) + ) if x and x[3] and x[3][0] and x[3][0][0] > since_ms: # Set starting date to first available candle. since_ms = x[3][0][0] @@ -122,17 +136,89 @@ async def _async_get_historic_ohlcv( f"Candle-data for {pair} available starting with " f"{datetime.fromtimestamp(since_ms // 1000, tz=timezone.utc).isoformat()}." ) + if until_ms and since_ms >= until_ms: + logger.warning( + f"No available candle-data for {pair} before " + f"{dt_from_ts(until_ms).isoformat()}" + ) + return DataFrame(columns=DEFAULT_DATAFRAME_COLUMNS) + + if ( + self._config["exchange"].get("only_from_ccxt", False) + or + # only download timeframes with significant improvements, + # otherwise fall back to rest API + not ( + (candle_type == CandleType.SPOT and timeframe in ["1s", "1m", "3m", "5m"]) + or ( + candle_type == CandleType.FUTURES + and timeframe in ["1m", "3m", "5m", "15m", "30m"] + ) + ) + ): + return super().get_historic_ohlcv( + pair=pair, + timeframe=timeframe, + since_ms=since_ms, + candle_type=candle_type, + is_new_pair=is_new_pair, + until_ms=until_ms, + ) + else: + # Download from data.binance.vision + return self.get_historic_ohlcv_fast( + pair=pair, + timeframe=timeframe, + since_ms=since_ms, + candle_type=candle_type, + is_new_pair=is_new_pair, + until_ms=until_ms, + ) - return await super()._async_get_historic_ohlcv( - pair=pair, - timeframe=timeframe, - since_ms=since_ms, - is_new_pair=is_new_pair, - raise_=raise_, - candle_type=candle_type, - until_ms=until_ms, + def get_historic_ohlcv_fast( + self, + pair: str, + timeframe: str, + since_ms: int, + candle_type: CandleType, + is_new_pair: bool = False, + until_ms: int | None = None, + ) -> DataFrame: + """ + Fastly fetch OHLCV data by leveraging https://data.binance.vision. + """ + df = self.loop.run_until_complete( + download_archive_ohlcv( + candle_type=candle_type, + pair=pair, + timeframe=timeframe, + since_ms=since_ms, + until_ms=until_ms, + markets=self.markets, + ) ) + # download the remaining data from rest API + if df.empty: + rest_since_ms = since_ms + else: + rest_since_ms = dt_ts(df.iloc[-1].date) + timeframe_to_msecs(timeframe) + + # make sure since <= until + if until_ms and rest_since_ms > until_ms: + rest_df = DataFrame() + else: + rest_df = super().get_historic_ohlcv( + pair=pair, + timeframe=timeframe, + since_ms=rest_since_ms, + candle_type=candle_type, + is_new_pair=is_new_pair, + until_ms=until_ms, + ) + all_df = concat_safe([df, rest_df]) + return all_df + def funding_fee_cutoff(self, open_date: datetime): """ Funding fees are only charged at full hours (usually every 4-8h). @@ -144,9 +230,7 @@ def funding_fee_cutoff(self, open_date: datetime): """ return open_date.minute == 0 and open_date.second < 15 - def fetch_funding_rates( - self, symbols: Optional[list[str]] = None - ) -> dict[str, dict[str, float]]: + def fetch_funding_rates(self, symbols: list[str] | None = None) -> dict[str, dict[str, float]]: """ Fetch funding rates for the given symbols. :param symbols: List of symbols to fetch funding rates for @@ -177,7 +261,7 @@ def dry_run_liquidation_price( leverage: float, wallet_balance: float, # Or margin balance open_trades: list, - ) -> Optional[float]: + ) -> float | None: """ Important: Must be fetching data from cached values as this is used by backtesting! MARGIN: https://www.binance.com/en/support/faq/f6b010588e55413aa58b7d63ee0125ed @@ -263,3 +347,19 @@ def load_leverage_tiers(self) -> dict[str, list[dict]]: return self.get_leverage_tiers() else: return {} + + async def _async_get_trade_history_id_startup( + self, pair: str, since: int | None + ) -> tuple[list[list], str]: + """ + override for initial call + + Binance only provides a limited set of historic trades data. + Using from_id=0, we can get the earliest available trades. + So if we don't get any data with the provided "since", we can assume to + download all available data. + """ + t, from_id = await self._async_fetch_trades(pair, since=since) + if not t: + return [], "0" + return t, from_id diff --git a/freqtrade/exchange/binance_leverage_tiers.json b/freqtrade/exchange/binance_leverage_tiers.json index e8ad69cc69b..f23341d1d5d 100644 --- a/freqtrade/exchange/binance_leverage_tiers.json +++ b/freqtrade/exchange/binance_leverage_tiers.json @@ -1,7 +1,163 @@ { + "1000000MOG/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "1000000MOG/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "1000000MOG/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "1000000MOG/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "1000000MOG/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "1000000MOG/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "1000000MOG/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "16725.0" + } + }, + { + "tier": 7.0, + "symbol": "1000000MOG/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "1000000MOG/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "125475.0" + } + }, + { + "tier": 9.0, + "symbol": "1000000MOG/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "500475.0" + } + } + ], "1000BONK/USDC:USDC": [ { "tier": 1.0, + "symbol": "1000BONK/USDC:USDC", "currency": "USDC", "minNotional": 0.0, "maxNotional": 5000.0, @@ -18,6 +174,7 @@ }, { "tier": 2.0, + "symbol": "1000BONK/USDC:USDC", "currency": "USDC", "minNotional": 5000.0, "maxNotional": 50000.0, @@ -34,6 +191,7 @@ }, { "tier": 3.0, + "symbol": "1000BONK/USDC:USDC", "currency": "USDC", "minNotional": 50000.0, "maxNotional": 600000.0, @@ -50,6 +208,7 @@ }, { "tier": 4.0, + "symbol": "1000BONK/USDC:USDC", "currency": "USDC", "minNotional": 600000.0, "maxNotional": 1200000.0, @@ -66,6 +225,7 @@ }, { "tier": 5.0, + "symbol": "1000BONK/USDC:USDC", "currency": "USDC", "minNotional": 1200000.0, "maxNotional": 3000000.0, @@ -82,6 +242,7 @@ }, { "tier": 6.0, + "symbol": "1000BONK/USDC:USDC", "currency": "USDC", "minNotional": 3000000.0, "maxNotional": 4000000.0, @@ -98,6 +259,7 @@ }, { "tier": 7.0, + "symbol": "1000BONK/USDC:USDC", "currency": "USDC", "minNotional": 4000000.0, "maxNotional": 6000000.0, @@ -114,6 +276,7 @@ }, { "tier": 8.0, + "symbol": "1000BONK/USDC:USDC", "currency": "USDC", "minNotional": 6000000.0, "maxNotional": 10000000.0, @@ -132,6 +295,7 @@ "1000BONK/USDT:USDT": [ { "tier": 1.0, + "symbol": "1000BONK/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -148,15 +312,16 @@ }, { "tier": 2.0, + "symbol": "1000BONK/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 30000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "30000", + "notionalCap": "100000", "notionalFloor": "10000", "maintMarginRatio": "0.015", "cum": "50.0" @@ -164,120 +329,283 @@ }, { "tier": 3.0, + "symbol": "1000BONK/USDT:USDT", "currency": "USDT", - "minNotional": 30000.0, - "maxNotional": 150000.0, + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "150000", - "notionalFloor": "30000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.02", - "cum": "200.0" + "cum": "550.0" } }, { "tier": 4.0, + "symbol": "1000BONK/USDT:USDT", "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 300000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "300000", - "notionalFloor": "150000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.025", - "cum": "950.0" + "cum": "3050.0" } }, { "tier": 5.0, + "symbol": "1000BONK/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 1500000.0, + "minNotional": 1000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "1500000", - "notionalFloor": "300000", + "notionalCap": "5000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.05", - "cum": "8450.0" + "cum": "28050.0" } }, { "tier": 6.0, + "symbol": "1000BONK/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.1", - "cum": "83450.0" + "cum": "278050.0" } }, { "tier": 7.0, + "symbol": "1000BONK/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3750000.0, + "minNotional": 10000000.0, + "maxNotional": 12500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "3750000", - "notionalFloor": "3000000", + "notionalCap": "12500000", + "notionalFloor": "10000000", "maintMarginRatio": "0.125", - "cum": "158450.0" + "cum": "528050.0" } }, { "tier": 8.0, + "symbol": "1000BONK/USDT:USDT", "currency": "USDT", - "minNotional": 3750000.0, - "maxNotional": 7500000.0, + "minNotional": 12500000.0, + "maxNotional": 25000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "3750000", + "notionalCap": "25000000", + "notionalFloor": "12500000", "maintMarginRatio": "0.25", - "cum": "627200.0" + "cum": "2090550.0" } }, { "tier": 9.0, + "symbol": "1000BONK/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 25000000.0, + "maxNotional": 50000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "50000000", + "notionalFloor": "25000000", "maintMarginRatio": "0.5", - "cum": "2502200.0" + "cum": "8340550.0" } } ], "1000CAT/USDT:USDT": [ { "tier": 1.0, + "symbol": "1000CAT/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "1000CAT/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "20000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "1000CAT/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "100000", + "notionalFloor": "20000", + "maintMarginRatio": "0.02", + "cum": "150.0" + } + }, + { + "tier": 4.0, + "symbol": "1000CAT/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "200000", + "notionalFloor": "100000", + "maintMarginRatio": "0.025", + "cum": "650.0" + } + }, + { + "tier": 5.0, + "symbol": "1000CAT/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "200000", + "maintMarginRatio": "0.05", + "cum": "5650.0" + } + }, + { + "tier": 6.0, + "symbol": "1000CAT/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "55650.0" + } + }, + { + "tier": 7.0, + "symbol": "1000CAT/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "2500000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "105650.0" + } + }, + { + "tier": 8.0, + "symbol": "1000CAT/USDT:USDT", + "currency": "USDT", + "minNotional": 2500000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "2500000", + "maintMarginRatio": "0.25", + "cum": "418150.0" + } + }, + { + "tier": 9.0, + "symbol": "1000CAT/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.5", + "cum": "1668150.0" + } + } + ], + "1000CHEEMS/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "1000CHEEMS/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -294,6 +622,7 @@ }, { "tier": 2.0, + "symbol": "1000CHEEMS/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -310,6 +639,7 @@ }, { "tier": 3.0, + "symbol": "1000CHEEMS/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 30000.0, @@ -326,6 +656,7 @@ }, { "tier": 4.0, + "symbol": "1000CHEEMS/USDT:USDT", "currency": "USDT", "minNotional": 30000.0, "maxNotional": 60000.0, @@ -342,6 +673,7 @@ }, { "tier": 5.0, + "symbol": "1000CHEEMS/USDT:USDT", "currency": "USDT", "minNotional": 60000.0, "maxNotional": 300000.0, @@ -358,6 +690,7 @@ }, { "tier": 6.0, + "symbol": "1000CHEEMS/USDT:USDT", "currency": "USDT", "minNotional": 300000.0, "maxNotional": 600000.0, @@ -374,6 +707,7 @@ }, { "tier": 7.0, + "symbol": "1000CHEEMS/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, "maxNotional": 750000.0, @@ -390,6 +724,7 @@ }, { "tier": 8.0, + "symbol": "1000CHEEMS/USDT:USDT", "currency": "USDT", "minNotional": 750000.0, "maxNotional": 1500000.0, @@ -406,6 +741,7 @@ }, { "tier": 9.0, + "symbol": "1000CHEEMS/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, "maxNotional": 3000000.0, @@ -424,6 +760,7 @@ "1000FLOKI/USDT:USDT": [ { "tier": 1.0, + "symbol": "1000FLOKI/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -440,15 +777,16 @@ }, { "tier": 2.0, + "symbol": "1000FLOKI/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 30000.0, + "maxNotional": 60000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "30000", + "notionalCap": "60000", "notionalFloor": "10000", "maintMarginRatio": "0.015", "cum": "50.0" @@ -456,120 +794,128 @@ }, { "tier": 3.0, + "symbol": "1000FLOKI/USDT:USDT", "currency": "USDT", - "minNotional": 30000.0, - "maxNotional": 150000.0, + "minNotional": 60000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "150000", - "notionalFloor": "30000", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.02", - "cum": "200.0" + "cum": "350.0" } }, { "tier": 4.0, + "symbol": "1000FLOKI/USDT:USDT", "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 300000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "300000", - "notionalFloor": "150000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.025", - "cum": "950.0" + "cum": "1850.0" } }, { "tier": 5.0, + "symbol": "1000FLOKI/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 1500000.0, + "minNotional": 600000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "1500000", - "notionalFloor": "300000", + "notionalCap": "3000000", + "notionalFloor": "600000", "maintMarginRatio": "0.05", - "cum": "8450.0" + "cum": "16850.0" } }, { "tier": 6.0, + "symbol": "1000FLOKI/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 3000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "6000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.1", - "cum": "83450.0" + "cum": "166850.0" } }, { "tier": 7.0, + "symbol": "1000FLOKI/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3750000.0, + "minNotional": 6000000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "3750000", - "notionalFloor": "3000000", + "notionalCap": "7500000", + "notionalFloor": "6000000", "maintMarginRatio": "0.125", - "cum": "158450.0" + "cum": "316850.0" } }, { "tier": 8.0, + "symbol": "1000FLOKI/USDT:USDT", "currency": "USDT", - "minNotional": 3750000.0, - "maxNotional": 7500000.0, + "minNotional": 7500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "3750000", + "notionalCap": "15000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.25", - "cum": "627200.0" + "cum": "1254350.0" } }, { "tier": 9.0, + "symbol": "1000FLOKI/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 15000000.0, + "maxNotional": 30000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "30000000", + "notionalFloor": "15000000", "maintMarginRatio": "0.5", - "cum": "2502200.0" + "cum": "5004350.0" } } ], "1000LUNC/USDT:USDT": [ { "tier": 1.0, + "symbol": "1000LUNC/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -586,6 +932,7 @@ }, { "tier": 2.0, + "symbol": "1000LUNC/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -602,6 +949,7 @@ }, { "tier": 3.0, + "symbol": "1000LUNC/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 400000.0, @@ -618,6 +966,7 @@ }, { "tier": 4.0, + "symbol": "1000LUNC/USDT:USDT", "currency": "USDT", "minNotional": 400000.0, "maxNotional": 1000000.0, @@ -634,6 +983,7 @@ }, { "tier": 5.0, + "symbol": "1000LUNC/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -650,6 +1000,7 @@ }, { "tier": 6.0, + "symbol": "1000LUNC/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 6000000.0, @@ -666,6 +1017,7 @@ }, { "tier": 7.0, + "symbol": "1000LUNC/USDT:USDT", "currency": "USDT", "minNotional": 6000000.0, "maxNotional": 10000000.0, @@ -684,6 +1036,7 @@ "1000PEPE/USDC:USDC": [ { "tier": 1.0, + "symbol": "1000PEPE/USDC:USDC", "currency": "USDC", "minNotional": 0.0, "maxNotional": 5000.0, @@ -700,6 +1053,7 @@ }, { "tier": 2.0, + "symbol": "1000PEPE/USDC:USDC", "currency": "USDC", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -716,6 +1070,7 @@ }, { "tier": 3.0, + "symbol": "1000PEPE/USDC:USDC", "currency": "USDC", "minNotional": 10000.0, "maxNotional": 50000.0, @@ -732,6 +1087,7 @@ }, { "tier": 4.0, + "symbol": "1000PEPE/USDC:USDC", "currency": "USDC", "minNotional": 50000.0, "maxNotional": 1200000.0, @@ -748,6 +1104,7 @@ }, { "tier": 5.0, + "symbol": "1000PEPE/USDC:USDC", "currency": "USDC", "minNotional": 1200000.0, "maxNotional": 3000000.0, @@ -764,6 +1121,7 @@ }, { "tier": 6.0, + "symbol": "1000PEPE/USDC:USDC", "currency": "USDC", "minNotional": 3000000.0, "maxNotional": 3600000.0, @@ -780,6 +1138,7 @@ }, { "tier": 7.0, + "symbol": "1000PEPE/USDC:USDC", "currency": "USDC", "minNotional": 3600000.0, "maxNotional": 9000000.0, @@ -796,6 +1155,7 @@ }, { "tier": 8.0, + "symbol": "1000PEPE/USDC:USDC", "currency": "USDC", "minNotional": 9000000.0, "maxNotional": 15000000.0, @@ -814,6 +1174,7 @@ "1000PEPE/USDT:USDT": [ { "tier": 1.0, + "symbol": "1000PEPE/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 20000.0, @@ -830,6 +1191,7 @@ }, { "tier": 2.0, + "symbol": "1000PEPE/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 200000.0, @@ -846,6 +1208,7 @@ }, { "tier": 3.0, + "symbol": "1000PEPE/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 300000.0, @@ -862,6 +1225,7 @@ }, { "tier": 4.0, + "symbol": "1000PEPE/USDT:USDT", "currency": "USDT", "minNotional": 300000.0, "maxNotional": 1500000.0, @@ -878,6 +1242,7 @@ }, { "tier": 5.0, + "symbol": "1000PEPE/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, "maxNotional": 3000000.0, @@ -894,6 +1259,7 @@ }, { "tier": 6.0, + "symbol": "1000PEPE/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 15000000.0, @@ -910,6 +1276,7 @@ }, { "tier": 7.0, + "symbol": "1000PEPE/USDT:USDT", "currency": "USDT", "minNotional": 15000000.0, "maxNotional": 30000000.0, @@ -926,6 +1293,7 @@ }, { "tier": 8.0, + "symbol": "1000PEPE/USDT:USDT", "currency": "USDT", "minNotional": 30000000.0, "maxNotional": 37500000.0, @@ -942,6 +1310,7 @@ }, { "tier": 9.0, + "symbol": "1000PEPE/USDT:USDT", "currency": "USDT", "minNotional": 37500000.0, "maxNotional": 75000000.0, @@ -958,6 +1327,7 @@ }, { "tier": 10.0, + "symbol": "1000PEPE/USDT:USDT", "currency": "USDT", "minNotional": 75000000.0, "maxNotional": 150000000.0, @@ -976,6 +1346,7 @@ "1000RATS/USDT:USDT": [ { "tier": 1.0, + "symbol": "1000RATS/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -992,6 +1363,7 @@ }, { "tier": 2.0, + "symbol": "1000RATS/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 20000.0, @@ -1008,6 +1380,7 @@ }, { "tier": 3.0, + "symbol": "1000RATS/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 100000.0, @@ -1024,6 +1397,7 @@ }, { "tier": 4.0, + "symbol": "1000RATS/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 200000.0, @@ -1040,6 +1414,7 @@ }, { "tier": 5.0, + "symbol": "1000RATS/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 1000000.0, @@ -1056,6 +1431,7 @@ }, { "tier": 6.0, + "symbol": "1000RATS/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -1072,6 +1448,7 @@ }, { "tier": 7.0, + "symbol": "1000RATS/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 2500000.0, @@ -1088,6 +1465,7 @@ }, { "tier": 8.0, + "symbol": "1000RATS/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, "maxNotional": 5000000.0, @@ -1104,6 +1482,7 @@ }, { "tier": 9.0, + "symbol": "1000RATS/USDT:USDT", "currency": "USDT", "minNotional": 5000000.0, "maxNotional": 10000000.0, @@ -1122,6 +1501,7 @@ "1000SATS/USDT:USDT": [ { "tier": 1.0, + "symbol": "1000SATS/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -1138,6 +1518,7 @@ }, { "tier": 2.0, + "symbol": "1000SATS/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 60000.0, @@ -1154,6 +1535,7 @@ }, { "tier": 3.0, + "symbol": "1000SATS/USDT:USDT", "currency": "USDT", "minNotional": 60000.0, "maxNotional": 300000.0, @@ -1170,6 +1552,7 @@ }, { "tier": 4.0, + "symbol": "1000SATS/USDT:USDT", "currency": "USDT", "minNotional": 300000.0, "maxNotional": 600000.0, @@ -1186,6 +1569,7 @@ }, { "tier": 5.0, + "symbol": "1000SATS/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, "maxNotional": 3000000.0, @@ -1202,6 +1586,7 @@ }, { "tier": 6.0, + "symbol": "1000SATS/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 6000000.0, @@ -1218,6 +1603,7 @@ }, { "tier": 7.0, + "symbol": "1000SATS/USDT:USDT", "currency": "USDT", "minNotional": 6000000.0, "maxNotional": 7500000.0, @@ -1234,6 +1620,7 @@ }, { "tier": 8.0, + "symbol": "1000SATS/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, "maxNotional": 15000000.0, @@ -1250,6 +1637,7 @@ }, { "tier": 9.0, + "symbol": "1000SATS/USDT:USDT", "currency": "USDT", "minNotional": 15000000.0, "maxNotional": 30000000.0, @@ -1268,6 +1656,7 @@ "1000SHIB/USDC:USDC": [ { "tier": 1.0, + "symbol": "1000SHIB/USDC:USDC", "currency": "USDC", "minNotional": 0.0, "maxNotional": 5000.0, @@ -1284,6 +1673,7 @@ }, { "tier": 2.0, + "symbol": "1000SHIB/USDC:USDC", "currency": "USDC", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -1300,6 +1690,7 @@ }, { "tier": 3.0, + "symbol": "1000SHIB/USDC:USDC", "currency": "USDC", "minNotional": 25000.0, "maxNotional": 150000.0, @@ -1316,6 +1707,7 @@ }, { "tier": 4.0, + "symbol": "1000SHIB/USDC:USDC", "currency": "USDC", "minNotional": 150000.0, "maxNotional": 600000.0, @@ -1332,6 +1724,7 @@ }, { "tier": 5.0, + "symbol": "1000SHIB/USDC:USDC", "currency": "USDC", "minNotional": 600000.0, "maxNotional": 1500000.0, @@ -1348,6 +1741,7 @@ }, { "tier": 6.0, + "symbol": "1000SHIB/USDC:USDC", "currency": "USDC", "minNotional": 1500000.0, "maxNotional": 3000000.0, @@ -1364,6 +1758,7 @@ }, { "tier": 7.0, + "symbol": "1000SHIB/USDC:USDC", "currency": "USDC", "minNotional": 3000000.0, "maxNotional": 5000000.0, @@ -1380,6 +1775,7 @@ }, { "tier": 8.0, + "symbol": "1000SHIB/USDC:USDC", "currency": "USDC", "minNotional": 5000000.0, "maxNotional": 9000000.0, @@ -1396,6 +1792,7 @@ }, { "tier": 9.0, + "symbol": "1000SHIB/USDC:USDC", "currency": "USDC", "minNotional": 9000000.0, "maxNotional": 30000000.0, @@ -1414,15 +1811,16 @@ "1000SHIB/USDT:USDT": [ { "tier": 1.0, + "symbol": "1000SHIB/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.0065, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "10000", + "notionalCap": "25000", "notionalFloor": "0", "maintMarginRatio": "0.0065", "cum": "0.0" @@ -1430,357 +1828,481 @@ }, { "tier": 2.0, + "symbol": "1000SHIB/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.0075, + "minNotional": 25000.0, + "maxNotional": 150000.0, + "maintenanceMarginRate": 0.01, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "25000", - "notionalFloor": "10000", - "maintMarginRatio": "0.0075", - "cum": "10.0" + "notionalCap": "150000", + "notionalFloor": "25000", + "maintMarginRatio": "0.01", + "cum": "87.5" } }, { "tier": 3.0, + "symbol": "1000SHIB/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 150000.0, - "maintenanceMarginRate": 0.01, + "minNotional": 150000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.015, "maxLeverage": 40.0, "info": { "bracket": "3", "initialLeverage": "40", - "notionalCap": "150000", - "notionalFloor": "25000", - "maintMarginRatio": "0.01", - "cum": "72.5" + "notionalCap": "200000", + "notionalFloor": "150000", + "maintMarginRatio": "0.015", + "cum": "837.5" } }, { "tier": 4.0, + "symbol": "1000SHIB/USDT:USDT", "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 300000.0, + "minNotional": 200000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "4", "initialLeverage": "25", - "notionalCap": "300000", - "notionalFloor": "150000", + "notionalCap": "800000", + "notionalFloor": "200000", "maintMarginRatio": "0.02", - "cum": "1572.5" + "cum": "1837.5" } }, { "tier": 5.0, + "symbol": "1000SHIB/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 800000.0, + "maxNotional": 1600000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "5", "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "300000", + "notionalCap": "1600000", + "notionalFloor": "800000", "maintMarginRatio": "0.025", - "cum": "3072.5" + "cum": "5837.5" } }, { "tier": 6.0, + "symbol": "1000SHIB/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 3000000.0, + "minNotional": 1600000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "6", "initialLeverage": "10", - "notionalCap": "3000000", - "notionalFloor": "600000", + "notionalCap": "8000000", + "notionalFloor": "1600000", "maintMarginRatio": "0.05", - "cum": "18072.5" + "cum": "45837.5" } }, { "tier": 7.0, + "symbol": "1000SHIB/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "minNotional": 8000000.0, + "maxNotional": 16000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "7", "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "16000000", + "notionalFloor": "8000000", "maintMarginRatio": "0.1", - "cum": "168072.5" + "cum": "445837.5" } }, { "tier": 8.0, + "symbol": "1000SHIB/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "minNotional": 16000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "8", "initialLeverage": "4", - "notionalCap": "7500000", - "notionalFloor": "6000000", + "notionalCap": "20000000", + "notionalFloor": "16000000", "maintMarginRatio": "0.125", - "cum": "318072.5" + "cum": "845837.5" } }, { "tier": 9.0, + "symbol": "1000SHIB/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 20000000.0, + "maxNotional": 40000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "40000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.25", - "cum": "1255572.5" + "cum": "3345837.5" } }, { "tier": 10.0, + "symbol": "1000SHIB/USDT:USDT", "currency": "USDT", - "minNotional": 15000000.0, - "maxNotional": 30000000.0, + "minNotional": 40000000.0, + "maxNotional": 80000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "15000000", + "notionalCap": "80000000", + "notionalFloor": "40000000", "maintMarginRatio": "0.5", - "cum": "5005572.5" + "cum": "13345837.5" } } ], - "1000XEC/USDT:USDT": [ + "1000WHY/USDT:USDT": [ { "tier": 1.0, + "symbol": "1000WHY/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "20", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "1000WHY/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "10", - "notionalCap": "25000", + "initialLeverage": "50", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.015", "cum": "25.0" } }, { "tier": 3.0, + "symbol": "1000WHY/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "8", - "notionalCap": "100000", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "650.0" + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" } }, { "tier": 4.0, + "symbol": "1000WHY/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 250000.0, + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "1000WHY/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "1000WHY/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "250000", - "notionalFloor": "100000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "5650.0" + "cum": "16725.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "1000WHY/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 1000000.0, + "minNotional": 600000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "1000WHY/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "5", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "11900.0" + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "125475.0" } }, { - "tier": 6.0, + "tier": 9.0, + "symbol": "1000WHY/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, + "minNotional": 1500000.0, "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "9", "initialLeverage": "1", "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "386900.0" + "cum": "500475.0" } } ], - "1INCH/USDT:USDT": [ + "1000X/USDT:USDT": [ { "tier": 1.0, + "symbol": "1000X/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.012, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.012", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "1000X/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "1000X/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "1000X/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "2", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "5000", + "notionalCap": "60000", + "notionalFloor": "30000", "maintMarginRatio": "0.025", - "cum": "65.0" + "cum": "225.0" } }, { - "tier": 3.0, + "tier": 5.0, + "symbol": "1000X/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 100000.0, + "minNotional": 60000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "100000", - "notionalFloor": "25000", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.05", - "cum": "690.0" + "cum": "1725.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "1000X/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 250000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "250000", - "notionalFloor": "100000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "5690.0" + "cum": "16725.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "1000X/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 1000000.0, + "minNotional": 600000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "1000X/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "5", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "11940.0" + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "125475.0" } }, { - "tier": 6.0, + "tier": 9.0, + "symbol": "1000X/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 10000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "1000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "386940.0" + "cum": "500475.0" } } ], - "1MBABYDOGE/USDT:USDT": [ + "1000XEC/USDT:USDT": [ { "tier": 1.0, + "symbol": "1000XEC/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, + "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "10000", + "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -1788,136 +2310,145 @@ }, { "tier": 2.0, + "symbol": "1000XEC/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 30000.0, + "minNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "30000", - "notionalFloor": "10000", + "notionalCap": "10000", + "notionalFloor": "5000", "maintMarginRatio": "0.015", - "cum": "50.0" + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "1000XEC/USDT:USDT", "currency": "USDT", - "minNotional": 30000.0, - "maxNotional": 150000.0, + "minNotional": 10000.0, + "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "150000", - "notionalFloor": "30000", + "notionalCap": "30000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "200.0" + "cum": "75.0" } }, { "tier": 4.0, + "symbol": "1000XEC/USDT:USDT", "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 300000.0, + "minNotional": 30000.0, + "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "300000", - "notionalFloor": "150000", + "notionalCap": "60000", + "notionalFloor": "30000", "maintMarginRatio": "0.025", - "cum": "950.0" + "cum": "225.0" } }, { "tier": 5.0, + "symbol": "1000XEC/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 1500000.0, + "minNotional": 60000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "1500000", - "notionalFloor": "300000", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.05", - "cum": "8450.0" + "cum": "1725.0" } }, { "tier": 6.0, + "symbol": "1000XEC/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "83450.0" + "cum": "16725.0" } }, { "tier": 7.0, + "symbol": "1000XEC/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3750000.0, + "minNotional": 600000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "3750000", - "notionalFloor": "3000000", + "notionalCap": "1000000", + "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "158450.0" + "cum": "31725.0" } }, { "tier": 8.0, + "symbol": "1000XEC/USDT:USDT", "currency": "USDT", - "minNotional": 3750000.0, - "maxNotional": 7500000.0, + "minNotional": 1000000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "3750000", + "notionalCap": "1500000", + "notionalFloor": "1000000", "maintMarginRatio": "0.25", - "cum": "627200.0" + "cum": "156725.0" } }, { "tier": 9.0, + "symbol": "1000XEC/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "2502200.0" + "cum": "531725.0" } } ], - "AAVE/USDT:USDT": [ + "1INCH/USDT:USDT": [ { "tier": 1.0, + "symbol": "1INCH/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -1934,15 +2465,16 @@ }, { "tier": 2.0, + "symbol": "1INCH/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 40000.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "40000", + "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", "cum": "50.0" @@ -1950,143 +2482,462 @@ }, { "tier": 3.0, + "symbol": "1INCH/USDT:USDT", "currency": "USDT", - "minNotional": 40000.0, - "maxNotional": 200000.0, + "minNotional": 20000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "200000", - "notionalFloor": "40000", + "notionalCap": "100000", + "notionalFloor": "20000", "maintMarginRatio": "0.02", - "cum": "250.0" + "cum": "150.0" } }, { "tier": 4.0, + "symbol": "1INCH/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "200000", + "notionalFloor": "100000", "maintMarginRatio": "0.025", - "cum": "1250.0" + "cum": "650.0" } }, { "tier": 5.0, + "symbol": "1INCH/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 2000000.0, + "minNotional": 200000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "2000000", - "notionalFloor": "400000", + "notionalCap": "1000000", + "notionalFloor": "200000", "maintMarginRatio": "0.05", - "cum": "11250.0" + "cum": "5650.0" } }, { "tier": 6.0, + "symbol": "1INCH/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "4000000", - "notionalFloor": "2000000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.1", - "cum": "111250.0" + "cum": "55650.0" } }, { "tier": 7.0, + "symbol": "1INCH/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 5000000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "5000000", - "notionalFloor": "4000000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "211250.0" + "cum": "105650.0" } }, { "tier": 8.0, + "symbol": "1INCH/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.25", - "cum": "836250.0" + "cum": "418150.0" } }, { "tier": 9.0, + "symbol": "1INCH/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "3336250.0" + "cum": "1668150.0" } } ], - "ACE/USDT:USDT": [ + "1MBABYDOGE/USDT:USDT": [ { "tier": 1.0, + "symbol": "1MBABYDOGE/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "1MBABYDOGE/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, - "info": { - "bracket": "2", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "1MBABYDOGE/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 150000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "150000", + "notionalFloor": "30000", + "maintMarginRatio": "0.02", + "cum": "200.0" + } + }, + { + "tier": 4.0, + "symbol": "1MBABYDOGE/USDT:USDT", + "currency": "USDT", + "minNotional": 150000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "300000", + "notionalFloor": "150000", + "maintMarginRatio": "0.025", + "cum": "950.0" + } + }, + { + "tier": 5.0, + "symbol": "1MBABYDOGE/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "1500000", + "notionalFloor": "300000", + "maintMarginRatio": "0.05", + "cum": "8450.0" + } + }, + { + "tier": 6.0, + "symbol": "1MBABYDOGE/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.1", + "cum": "83450.0" + } + }, + { + "tier": 7.0, + "symbol": "1MBABYDOGE/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 3750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "3750000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.125", + "cum": "158450.0" + } + }, + { + "tier": 8.0, + "symbol": "1MBABYDOGE/USDT:USDT", + "currency": "USDT", + "minNotional": 3750000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "3750000", + "maintMarginRatio": "0.25", + "cum": "627200.0" + } + }, + { + "tier": 9.0, + "symbol": "1MBABYDOGE/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 15000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "15000000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "2502200.0" + } + } + ], + "AAVE/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "AAVE/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "AAVE/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "60000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "AAVE/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.02", + "cum": "350.0" + } + }, + { + "tier": 4.0, + "symbol": "AAVE/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.025", + "cum": "1850.0" + } + }, + { + "tier": 5.0, + "symbol": "AAVE/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "3000000", + "notionalFloor": "600000", + "maintMarginRatio": "0.05", + "cum": "16850.0" + } + }, + { + "tier": 6.0, + "symbol": "AAVE/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 6000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "6000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.1", + "cum": "166850.0" + } + }, + { + "tier": 7.0, + "symbol": "AAVE/USDT:USDT", + "currency": "USDT", + "minNotional": 6000000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "7500000", + "notionalFloor": "6000000", + "maintMarginRatio": "0.125", + "cum": "316850.0" + } + }, + { + "tier": 8.0, + "symbol": "AAVE/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 15000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "15000000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.25", + "cum": "1254350.0" + } + }, + { + "tier": 9.0, + "symbol": "AAVE/USDT:USDT", + "currency": "USDT", + "minNotional": 15000000.0, + "maxNotional": 30000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "15000000", + "maintMarginRatio": "0.5", + "cum": "5004350.0" + } + } + ], + "ACE/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "ACE/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": "ACE/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", "initialLeverage": "25", "notionalCap": "25000", "notionalFloor": "5000", @@ -2096,6 +2947,7 @@ }, { "tier": 3.0, + "symbol": "ACE/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 50000.0, @@ -2112,6 +2964,7 @@ }, { "tier": 4.0, + "symbol": "ACE/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, "maxNotional": 500000.0, @@ -2128,6 +2981,7 @@ }, { "tier": 5.0, + "symbol": "ACE/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -2144,6 +2998,7 @@ }, { "tier": 6.0, + "symbol": "ACE/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 1250000.0, @@ -2160,6 +3015,7 @@ }, { "tier": 7.0, + "symbol": "ACE/USDT:USDT", "currency": "USDT", "minNotional": 1250000.0, "maxNotional": 2500000.0, @@ -2176,6 +3032,7 @@ }, { "tier": 8.0, + "symbol": "ACE/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, "maxNotional": 5000000.0, @@ -2194,6 +3051,7 @@ "ACH/USDT:USDT": [ { "tier": 1.0, + "symbol": "ACH/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -2210,6 +3068,7 @@ }, { "tier": 2.0, + "symbol": "ACH/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 20000.0, @@ -2226,6 +3085,7 @@ }, { "tier": 3.0, + "symbol": "ACH/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 25000.0, @@ -2242,6 +3102,7 @@ }, { "tier": 4.0, + "symbol": "ACH/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 200000.0, @@ -2258,6 +3119,7 @@ }, { "tier": 5.0, + "symbol": "ACH/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 400000.0, @@ -2274,6 +3136,7 @@ }, { "tier": 6.0, + "symbol": "ACH/USDT:USDT", "currency": "USDT", "minNotional": 400000.0, "maxNotional": 500000.0, @@ -2290,6 +3153,7 @@ }, { "tier": 7.0, + "symbol": "ACH/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -2306,6 +3170,7 @@ }, { "tier": 8.0, + "symbol": "ACH/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -2321,180 +3186,174 @@ } } ], - "ADA/USDT:USDT": [ + "ACT/USDT:USDT": [ { "tier": 1.0, + "symbol": "ACT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.005, + "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.005", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "ACT/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.01, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "50000", + "notionalCap": "80000", "notionalFloor": "10000", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.015", "cum": "50.0" } }, { "tier": 3.0, + "symbol": "ACT/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 40.0, - "info": { - "bracket": "3", - "initialLeverage": "40", - "notionalCap": "100000", - "notionalFloor": "50000", - "maintMarginRatio": "0.015", - "cum": "300.0" - } - }, - { - "tier": 4.0, - "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 500000.0, + "minNotional": 80000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "25", - "notionalCap": "500000", - "notionalFloor": "100000", + "notionalCap": "400000", + "notionalFloor": "80000", "maintMarginRatio": "0.02", - "cum": "800.0" + "cum": "450.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "ACT/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 400000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "800000", + "notionalFloor": "400000", "maintMarginRatio": "0.025", - "cum": "3300.0" + "cum": "2450.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "ACT/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 5000000.0, + "minNotional": 800000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "5000000", - "notionalFloor": "1000000", + "notionalCap": "4000000", + "notionalFloor": "800000", "maintMarginRatio": "0.05", - "cum": "28300.0" + "cum": "22450.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "ACT/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 4000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "8000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.1", - "cum": "278300.0" + "cum": "222450.0" } }, { - "tier": 8.0, + "tier": 7.0, + "symbol": "ACT/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "minNotional": 8000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "10000000", + "notionalFloor": "8000000", "maintMarginRatio": "0.125", - "cum": "528300.0" + "cum": "422450.0" } }, { - "tier": 9.0, + "tier": 8.0, + "symbol": "ACT/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 30000000.0, + "minNotional": 10000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "30000000", - "notionalFloor": "20000000", + "notionalCap": "20000000", + "notionalFloor": "10000000", "maintMarginRatio": "0.25", - "cum": "3028300.0" + "cum": "1672450.0" } }, { - "tier": 10.0, + "tier": 9.0, + "symbol": "ACT/USDT:USDT", "currency": "USDT", - "minNotional": 30000000.0, - "maxNotional": 50000000.0, + "minNotional": 20000000.0, + "maxNotional": 40000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "30000000", + "notionalCap": "40000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.5", - "cum": "10528300.0" + "cum": "6672450.0" } } ], - "AERGO/USDT:USDT": [ + "ACX/USDT:USDT": [ { "tier": 1.0, + "symbol": "ACX/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -2502,145 +3361,636 @@ }, { "tier": 2.0, + "symbol": "ACX/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, + "minNotional": 10000.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "10000", - "notionalFloor": "5000", + "notionalCap": "20000", + "notionalFloor": "10000", "maintMarginRatio": "0.015", - "cum": "25.0" + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "ACX/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, + "minNotional": 20000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "10000", + "notionalCap": "100000", + "notionalFloor": "20000", "maintMarginRatio": "0.02", - "cum": "75.0" + "cum": "150.0" } }, { "tier": 4.0, + "symbol": "ACX/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 40000.0, + "minNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "40000", - "notionalFloor": "20000", + "notionalCap": "200000", + "notionalFloor": "100000", "maintMarginRatio": "0.025", - "cum": "175.0" + "cum": "650.0" } }, { "tier": 5.0, + "symbol": "ACX/USDT:USDT", "currency": "USDT", - "minNotional": 40000.0, - "maxNotional": 200000.0, + "minNotional": 200000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "40000", + "notionalCap": "1000000", + "notionalFloor": "200000", "maintMarginRatio": "0.05", - "cum": "1175.0" + "cum": "5650.0" } }, { "tier": 6.0, + "symbol": "ACX/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.1", - "cum": "11175.0" + "cum": "55650.0" } }, { "tier": 7.0, + "symbol": "ACX/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "21175.0" + "cum": "105650.0" } }, { "tier": 8.0, + "symbol": "ACX/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.25", - "cum": "83675.0" + "cum": "418150.0" } }, { "tier": 9.0, + "symbol": "ACX/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "333675.0" + "cum": "1668150.0" } } ], - "AEVO/USDT:USDT": [ + "ADA/USDT:USDT": [ { "tier": 1.0, + "symbol": "ADA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.005, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.005", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "ADA/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "ADA/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 40.0, + "info": { + "bracket": "3", + "initialLeverage": "40", + "notionalCap": "200000", + "notionalFloor": "50000", + "maintMarginRatio": "0.015", + "cum": "300.0" + } + }, + { + "tier": 4.0, + "symbol": "ADA/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "4", + "initialLeverage": "25", + "notionalCap": "1000000", + "notionalFloor": "200000", + "maintMarginRatio": "0.02", + "cum": "1300.0" + } + }, + { + "tier": 5.0, + "symbol": "ADA/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "5", + "initialLeverage": "20", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.025", + "cum": "6300.0" + } + }, + { + "tier": 6.0, + "symbol": "ADA/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "6", + "initialLeverage": "10", + "notionalCap": "10000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.05", + "cum": "56300.0" + } + }, + { + "tier": 7.0, + "symbol": "ADA/USDT:USDT", + "currency": "USDT", + "minNotional": 10000000.0, + "maxNotional": 20000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "7", + "initialLeverage": "5", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.1", + "cum": "556300.0" + } + }, + { + "tier": 8.0, + "symbol": "ADA/USDT:USDT", + "currency": "USDT", + "minNotional": 20000000.0, + "maxNotional": 25000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "8", + "initialLeverage": "4", + "notionalCap": "25000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.125", + "cum": "1056300.0" + } + }, + { + "tier": 9.0, + "symbol": "ADA/USDT:USDT", + "currency": "USDT", + "minNotional": 25000000.0, + "maxNotional": 50000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "50000000", + "notionalFloor": "25000000", + "maintMarginRatio": "0.25", + "cum": "4181300.0" + } + }, + { + "tier": 10.0, + "symbol": "ADA/USDT:USDT", + "currency": "USDT", + "minNotional": 50000000.0, + "maxNotional": 100000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "100000000", + "notionalFloor": "50000000", + "maintMarginRatio": "0.5", + "cum": "16681300.0" + } + } + ], + "AERGO/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "AERGO/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "AERGO/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "AERGO/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "20000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "AERGO/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 40000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "40000", + "notionalFloor": "20000", + "maintMarginRatio": "0.025", + "cum": "175.0" + } + }, + { + "tier": 5.0, + "symbol": "AERGO/USDT:USDT", + "currency": "USDT", + "minNotional": 40000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "200000", + "notionalFloor": "40000", + "maintMarginRatio": "0.05", + "cum": "1175.0" + } + }, + { + "tier": 6.0, + "symbol": "AERGO/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "400000", + "notionalFloor": "200000", + "maintMarginRatio": "0.1", + "cum": "11175.0" + } + }, + { + "tier": 7.0, + "symbol": "AERGO/USDT:USDT", + "currency": "USDT", + "minNotional": 400000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "400000", + "maintMarginRatio": "0.125", + "cum": "21175.0" + } + }, + { + "tier": 8.0, + "symbol": "AERGO/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.25", + "cum": "83675.0" + } + }, + { + "tier": 9.0, + "symbol": "AERGO/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "333675.0" + } + } + ], + "AERO/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "AERO/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "AERO/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "AERO/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "AERO/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "AERO/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "AERO/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "16725.0" + } + }, + { + "tier": 7.0, + "symbol": "AERO/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "AERO/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "125475.0" + } + }, + { + "tier": 9.0, + "symbol": "AERO/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "500475.0" + } + } + ], + "AEVO/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "AEVO/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" @@ -2648,6 +3998,7 @@ }, { "tier": 2.0, + "symbol": "AEVO/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 50000.0, @@ -2664,6 +4015,7 @@ }, { "tier": 3.0, + "symbol": "AEVO/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, "maxNotional": 100000.0, @@ -2680,6 +4032,7 @@ }, { "tier": 4.0, + "symbol": "AEVO/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 1000000.0, @@ -2696,6 +4049,7 @@ }, { "tier": 5.0, + "symbol": "AEVO/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -2712,6 +4066,7 @@ }, { "tier": 6.0, + "symbol": "AEVO/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 2500000.0, @@ -2728,6 +4083,7 @@ }, { "tier": 7.0, + "symbol": "AEVO/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, "maxNotional": 5000000.0, @@ -2744,6 +4100,7 @@ }, { "tier": 8.0, + "symbol": "AEVO/USDT:USDT", "currency": "USDT", "minNotional": 5000000.0, "maxNotional": 10000000.0, @@ -2762,6 +4119,7 @@ "AGIX/USDT:USDT": [ { "tier": 1.0, + "symbol": "AGIX/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -2778,6 +4136,7 @@ }, { "tier": 2.0, + "symbol": "AGIX/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -2794,6 +4153,7 @@ }, { "tier": 3.0, + "symbol": "AGIX/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 600000.0, @@ -2810,6 +4170,7 @@ }, { "tier": 4.0, + "symbol": "AGIX/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, "maxNotional": 1600000.0, @@ -2826,6 +4187,7 @@ }, { "tier": 5.0, + "symbol": "AGIX/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, "maxNotional": 2000000.0, @@ -2842,6 +4204,7 @@ }, { "tier": 6.0, + "symbol": "AGIX/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 6000000.0, @@ -2858,6 +4221,7 @@ }, { "tier": 7.0, + "symbol": "AGIX/USDT:USDT", "currency": "USDT", "minNotional": 6000000.0, "maxNotional": 6500000.0, @@ -2876,6 +4240,7 @@ "AGLD/USDT:USDT": [ { "tier": 1.0, + "symbol": "AGLD/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -2892,6 +4257,7 @@ }, { "tier": 2.0, + "symbol": "AGLD/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -2908,6 +4274,7 @@ }, { "tier": 3.0, + "symbol": "AGLD/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 200000.0, @@ -2924,6 +4291,7 @@ }, { "tier": 4.0, + "symbol": "AGLD/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, @@ -2940,6 +4308,7 @@ }, { "tier": 5.0, + "symbol": "AGLD/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -2956,6 +4325,7 @@ }, { "tier": 6.0, + "symbol": "AGLD/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 3000000.0, @@ -2972,6 +4342,7 @@ }, { "tier": 7.0, + "symbol": "AGLD/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 5000000.0, @@ -2990,6 +4361,7 @@ "AI/USDT:USDT": [ { "tier": 1.0, + "symbol": "AI/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -3006,6 +4378,7 @@ }, { "tier": 2.0, + "symbol": "AI/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -3022,6 +4395,7 @@ }, { "tier": 3.0, + "symbol": "AI/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 80000.0, @@ -3038,6 +4412,7 @@ }, { "tier": 4.0, + "symbol": "AI/USDT:USDT", "currency": "USDT", "minNotional": 80000.0, "maxNotional": 800000.0, @@ -3054,6 +4429,7 @@ }, { "tier": 5.0, + "symbol": "AI/USDT:USDT", "currency": "USDT", "minNotional": 800000.0, "maxNotional": 1600000.0, @@ -3070,6 +4446,7 @@ }, { "tier": 6.0, + "symbol": "AI/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, "maxNotional": 2000000.0, @@ -3086,6 +4463,7 @@ }, { "tier": 7.0, + "symbol": "AI/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 4000000.0, @@ -3102,6 +4480,7 @@ }, { "tier": 8.0, + "symbol": "AI/USDT:USDT", "currency": "USDT", "minNotional": 4000000.0, "maxNotional": 8000000.0, @@ -3117,123 +4496,475 @@ } } ], - "ALGO/USDT:USDT": [ + "AIXBT/USDT:USDT": [ { "tier": 1.0, + "symbol": "AIXBT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "AIXBT/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "50", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "maintMarginRatio": "0.015", + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "AIXBT/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "100000", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "675.0" + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" } }, { "tier": 4.0, + "symbol": "AIXBT/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "250000", - "notionalFloor": "100000", - "maintMarginRatio": "0.1", - "cum": "5675.0" + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" } }, { "tier": 5.0, + "symbol": "AIXBT/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "5", + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "AIXBT/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "16725.0" + } + }, + { + "tier": 7.0, + "symbol": "AIXBT/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "250000", + "notionalCap": "750000", + "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "11925.0" + "cum": "31725.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "AIXBT/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "136925.0" + "cum": "125475.0" + } + }, + { + "tier": 9.0, + "symbol": "AIXBT/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "500475.0" + } + } + ], + "AKT/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "AKT/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "AKT/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "AKT/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "AKT/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "AKT/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "AKT/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "16725.0" } }, { "tier": 7.0, + "symbol": "AKT/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "AKT/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "125475.0" + } + }, + { + "tier": 9.0, + "symbol": "AKT/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "500475.0" + } + } + ], + "ALGO/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "ALGO/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "ALGO/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 40000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "40000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "ALGO/USDT:USDT", + "currency": "USDT", + "minNotional": 40000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "200000", + "notionalFloor": "40000", + "maintMarginRatio": "0.02", + "cum": "250.0" + } + }, + { + "tier": 4.0, + "symbol": "ALGO/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "400000", + "notionalFloor": "200000", + "maintMarginRatio": "0.025", + "cum": "1250.0" + } + }, + { + "tier": 5.0, + "symbol": "ALGO/USDT:USDT", + "currency": "USDT", + "minNotional": 400000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "2000000", + "notionalFloor": "400000", + "maintMarginRatio": "0.05", + "cum": "11250.0" + } + }, + { + "tier": 6.0, + "symbol": "ALGO/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "4000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.1", + "cum": "111250.0" + } + }, + { + "tier": 7.0, + "symbol": "ALGO/USDT:USDT", + "currency": "USDT", + "minNotional": 4000000.0, "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.125", + "cum": "211250.0" + } + }, + { + "tier": 8.0, + "symbol": "ALGO/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.25", + "cum": "836250.0" + } + }, + { + "tier": 9.0, + "symbol": "ALGO/USDT:USDT", + "currency": "USDT", + "minNotional": 10000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "2000000", + "notionalCap": "20000000", + "notionalFloor": "10000000", "maintMarginRatio": "0.5", - "cum": "636925.0" + "cum": "3336250.0" } } ], "ALICE/USDT:USDT": [ { "tier": 1.0, + "symbol": "ALICE/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -3250,6 +4981,7 @@ }, { "tier": 2.0, + "symbol": "ALICE/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 20000.0, @@ -3266,6 +4998,7 @@ }, { "tier": 3.0, + "symbol": "ALICE/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 25000.0, @@ -3282,6 +5015,7 @@ }, { "tier": 4.0, + "symbol": "ALICE/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 200000.0, @@ -3298,6 +5032,7 @@ }, { "tier": 5.0, + "symbol": "ALICE/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 400000.0, @@ -3314,6 +5049,7 @@ }, { "tier": 6.0, + "symbol": "ALICE/USDT:USDT", "currency": "USDT", "minNotional": 400000.0, "maxNotional": 500000.0, @@ -3330,6 +5066,7 @@ }, { "tier": 7.0, + "symbol": "ALICE/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -3346,6 +5083,7 @@ }, { "tier": 8.0, + "symbol": "ALICE/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -3364,6 +5102,7 @@ "ALPACA/USDT:USDT": [ { "tier": 1.0, + "symbol": "ALPACA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -3380,6 +5119,7 @@ }, { "tier": 2.0, + "symbol": "ALPACA/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -3396,6 +5136,7 @@ }, { "tier": 3.0, + "symbol": "ALPACA/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 20000.0, @@ -3412,6 +5153,7 @@ }, { "tier": 4.0, + "symbol": "ALPACA/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 40000.0, @@ -3428,6 +5170,7 @@ }, { "tier": 5.0, + "symbol": "ALPACA/USDT:USDT", "currency": "USDT", "minNotional": 40000.0, "maxNotional": 200000.0, @@ -3444,6 +5187,7 @@ }, { "tier": 6.0, + "symbol": "ALPACA/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 400000.0, @@ -3460,6 +5204,7 @@ }, { "tier": 7.0, + "symbol": "ALPACA/USDT:USDT", "currency": "USDT", "minNotional": 400000.0, "maxNotional": 500000.0, @@ -3476,6 +5221,7 @@ }, { "tier": 8.0, + "symbol": "ALPACA/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -3492,6 +5238,7 @@ }, { "tier": 9.0, + "symbol": "ALPACA/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -3510,6 +5257,7 @@ "ALPHA/USDT:USDT": [ { "tier": 1.0, + "symbol": "ALPHA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -3526,6 +5274,7 @@ }, { "tier": 2.0, + "symbol": "ALPHA/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 20000.0, @@ -3542,6 +5291,7 @@ }, { "tier": 3.0, + "symbol": "ALPHA/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 25000.0, @@ -3558,6 +5308,7 @@ }, { "tier": 4.0, + "symbol": "ALPHA/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 200000.0, @@ -3574,6 +5325,7 @@ }, { "tier": 5.0, + "symbol": "ALPHA/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 400000.0, @@ -3590,6 +5342,7 @@ }, { "tier": 6.0, + "symbol": "ALPHA/USDT:USDT", "currency": "USDT", "minNotional": 400000.0, "maxNotional": 500000.0, @@ -3606,6 +5359,7 @@ }, { "tier": 7.0, + "symbol": "ALPHA/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -3622,6 +5376,7 @@ }, { "tier": 8.0, + "symbol": "ALPHA/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -3640,6 +5395,7 @@ "ALT/USDT:USDT": [ { "tier": 1.0, + "symbol": "ALT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -3656,6 +5412,7 @@ }, { "tier": 2.0, + "symbol": "ALT/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 16000.0, @@ -3672,6 +5429,7 @@ }, { "tier": 3.0, + "symbol": "ALT/USDT:USDT", "currency": "USDT", "minNotional": 16000.0, "maxNotional": 80000.0, @@ -3688,6 +5446,7 @@ }, { "tier": 4.0, + "symbol": "ALT/USDT:USDT", "currency": "USDT", "minNotional": 80000.0, "maxNotional": 160000.0, @@ -3704,6 +5463,7 @@ }, { "tier": 5.0, + "symbol": "ALT/USDT:USDT", "currency": "USDT", "minNotional": 160000.0, "maxNotional": 800000.0, @@ -3720,6 +5480,7 @@ }, { "tier": 6.0, + "symbol": "ALT/USDT:USDT", "currency": "USDT", "minNotional": 800000.0, "maxNotional": 1600000.0, @@ -3736,6 +5497,7 @@ }, { "tier": 7.0, + "symbol": "ALT/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, "maxNotional": 2000000.0, @@ -3752,6 +5514,7 @@ }, { "tier": 8.0, + "symbol": "ALT/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 4000000.0, @@ -3768,6 +5531,7 @@ }, { "tier": 9.0, + "symbol": "ALT/USDT:USDT", "currency": "USDT", "minNotional": 4000000.0, "maxNotional": 8000000.0, @@ -3786,6 +5550,7 @@ "AMB/USDT:USDT": [ { "tier": 1.0, + "symbol": "AMB/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -3802,6 +5567,7 @@ }, { "tier": 2.0, + "symbol": "AMB/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -3818,6 +5584,7 @@ }, { "tier": 3.0, + "symbol": "AMB/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 200000.0, @@ -3834,6 +5601,7 @@ }, { "tier": 4.0, + "symbol": "AMB/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, @@ -3850,6 +5618,7 @@ }, { "tier": 5.0, + "symbol": "AMB/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -3866,6 +5635,7 @@ }, { "tier": 6.0, + "symbol": "AMB/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 3000000.0, @@ -3882,6 +5652,7 @@ }, { "tier": 7.0, + "symbol": "AMB/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 5000000.0, @@ -3900,6 +5671,7 @@ "ANKR/USDT:USDT": [ { "tier": 1.0, + "symbol": "ANKR/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -3916,6 +5688,7 @@ }, { "tier": 2.0, + "symbol": "ANKR/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -3932,6 +5705,7 @@ }, { "tier": 3.0, + "symbol": "ANKR/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 400000.0, @@ -3948,6 +5722,7 @@ }, { "tier": 4.0, + "symbol": "ANKR/USDT:USDT", "currency": "USDT", "minNotional": 400000.0, "maxNotional": 1000000.0, @@ -3964,6 +5739,7 @@ }, { "tier": 5.0, + "symbol": "ANKR/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -3980,6 +5756,7 @@ }, { "tier": 6.0, + "symbol": "ANKR/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 6000000.0, @@ -3996,6 +5773,7 @@ }, { "tier": 7.0, + "symbol": "ANKR/USDT:USDT", "currency": "USDT", "minNotional": 6000000.0, "maxNotional": 10000000.0, @@ -4014,6 +5792,7 @@ "APE/USDT:USDT": [ { "tier": 1.0, + "symbol": "APE/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 25000.0, @@ -4030,6 +5809,7 @@ }, { "tier": 2.0, + "symbol": "APE/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 50000.0, @@ -4046,15 +5826,16 @@ }, { "tier": 3.0, + "symbol": "APE/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 80000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 40.0, "info": { "bracket": "3", "initialLeverage": "40", - "notionalCap": "80000", + "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.015", "cum": "337.5" @@ -4062,120 +5843,128 @@ }, { "tier": 4.0, + "symbol": "APE/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 150000.0, + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "4", "initialLeverage": "25", - "notionalCap": "150000", - "notionalFloor": "80000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.02", - "cum": "737.5" + "cum": "837.5" } }, { "tier": 5.0, + "symbol": "APE/USDT:USDT", "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 300000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "5", "initialLeverage": "20", - "notionalCap": "300000", - "notionalFloor": "150000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.025", - "cum": "1487.5" + "cum": "3337.5" } }, { "tier": 6.0, + "symbol": "APE/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 1500000.0, + "minNotional": 1000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "6", "initialLeverage": "10", - "notionalCap": "1500000", - "notionalFloor": "300000", + "notionalCap": "5000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.05", - "cum": "8987.5" + "cum": "28337.5" } }, { "tier": 7.0, + "symbol": "APE/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "7", "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.1", - "cum": "83987.5" + "cum": "278337.5" } }, { "tier": 8.0, + "symbol": "APE/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3750000.0, + "minNotional": 10000000.0, + "maxNotional": 12500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "8", "initialLeverage": "4", - "notionalCap": "3750000", - "notionalFloor": "3000000", + "notionalCap": "12500000", + "notionalFloor": "10000000", "maintMarginRatio": "0.125", - "cum": "158987.5" + "cum": "528337.5" } }, { "tier": 9.0, + "symbol": "APE/USDT:USDT", "currency": "USDT", - "minNotional": 3750000.0, - "maxNotional": 7500000.0, + "minNotional": 12500000.0, + "maxNotional": 25000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "3750000", + "notionalCap": "25000000", + "notionalFloor": "12500000", "maintMarginRatio": "0.25", - "cum": "627737.5" + "cum": "2090837.5" } }, { "tier": 10.0, + "symbol": "APE/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 25000000.0, + "maxNotional": 50000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "50000000", + "notionalFloor": "25000000", "maintMarginRatio": "0.5", - "cum": "2502737.5" + "cum": "8340837.5" } } ], "API3/USDT:USDT": [ { "tier": 1.0, + "symbol": "API3/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -4192,6 +5981,7 @@ }, { "tier": 2.0, + "symbol": "API3/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -4208,6 +5998,7 @@ }, { "tier": 3.0, + "symbol": "API3/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 100000.0, @@ -4224,6 +6015,7 @@ }, { "tier": 4.0, + "symbol": "API3/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 500000.0, @@ -4240,6 +6032,7 @@ }, { "tier": 5.0, + "symbol": "API3/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1600000.0, @@ -4256,6 +6049,7 @@ }, { "tier": 6.0, + "symbol": "API3/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, "maxNotional": 2000000.0, @@ -4272,6 +6066,7 @@ }, { "tier": 7.0, + "symbol": "API3/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 3000000.0, @@ -4288,6 +6083,7 @@ }, { "tier": 8.0, + "symbol": "API3/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 4000000.0, @@ -4306,6 +6102,7 @@ "APT/USDT:USDT": [ { "tier": 1.0, + "symbol": "APT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -4322,6 +6119,7 @@ }, { "tier": 2.0, + "symbol": "APT/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 100000.0, @@ -4338,6 +6136,7 @@ }, { "tier": 3.0, + "symbol": "APT/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 900000.0, @@ -4354,6 +6153,7 @@ }, { "tier": 4.0, + "symbol": "APT/USDT:USDT", "currency": "USDT", "minNotional": 900000.0, "maxNotional": 1100000.0, @@ -4370,6 +6170,7 @@ }, { "tier": 5.0, + "symbol": "APT/USDT:USDT", "currency": "USDT", "minNotional": 1100000.0, "maxNotional": 5000000.0, @@ -4386,6 +6187,7 @@ }, { "tier": 6.0, + "symbol": "APT/USDT:USDT", "currency": "USDT", "minNotional": 5000000.0, "maxNotional": 10000000.0, @@ -4402,6 +6204,7 @@ }, { "tier": 7.0, + "symbol": "APT/USDT:USDT", "currency": "USDT", "minNotional": 10000000.0, "maxNotional": 12500000.0, @@ -4418,6 +6221,7 @@ }, { "tier": 8.0, + "symbol": "APT/USDT:USDT", "currency": "USDT", "minNotional": 12500000.0, "maxNotional": 25000000.0, @@ -4434,6 +6238,7 @@ }, { "tier": 9.0, + "symbol": "APT/USDT:USDT", "currency": "USDT", "minNotional": 25000000.0, "maxNotional": 50000000.0, @@ -4452,6 +6257,7 @@ "AR/USDT:USDT": [ { "tier": 1.0, + "symbol": "AR/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -4468,6 +6274,7 @@ }, { "tier": 2.0, + "symbol": "AR/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 20000.0, @@ -4484,6 +6291,7 @@ }, { "tier": 3.0, + "symbol": "AR/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 100000.0, @@ -4500,6 +6308,7 @@ }, { "tier": 4.0, + "symbol": "AR/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 200000.0, @@ -4516,6 +6325,7 @@ }, { "tier": 5.0, + "symbol": "AR/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 1000000.0, @@ -4532,6 +6342,7 @@ }, { "tier": 6.0, + "symbol": "AR/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -4548,6 +6359,7 @@ }, { "tier": 7.0, + "symbol": "AR/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 2500000.0, @@ -4564,6 +6376,7 @@ }, { "tier": 8.0, + "symbol": "AR/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, "maxNotional": 5000000.0, @@ -4580,6 +6393,7 @@ }, { "tier": 9.0, + "symbol": "AR/USDT:USDT", "currency": "USDT", "minNotional": 5000000.0, "maxNotional": 10000000.0, @@ -4598,6 +6412,7 @@ "ARB/USDC:USDC": [ { "tier": 1.0, + "symbol": "ARB/USDC:USDC", "currency": "USDC", "minNotional": 0.0, "maxNotional": 5000.0, @@ -4614,6 +6429,7 @@ }, { "tier": 2.0, + "symbol": "ARB/USDC:USDC", "currency": "USDC", "minNotional": 5000.0, "maxNotional": 50000.0, @@ -4630,6 +6446,7 @@ }, { "tier": 3.0, + "symbol": "ARB/USDC:USDC", "currency": "USDC", "minNotional": 50000.0, "maxNotional": 600000.0, @@ -4646,6 +6463,7 @@ }, { "tier": 4.0, + "symbol": "ARB/USDC:USDC", "currency": "USDC", "minNotional": 600000.0, "maxNotional": 1200000.0, @@ -4662,6 +6480,7 @@ }, { "tier": 5.0, + "symbol": "ARB/USDC:USDC", "currency": "USDC", "minNotional": 1200000.0, "maxNotional": 3000000.0, @@ -4678,6 +6497,7 @@ }, { "tier": 6.0, + "symbol": "ARB/USDC:USDC", "currency": "USDC", "minNotional": 3000000.0, "maxNotional": 5000000.0, @@ -4694,6 +6514,7 @@ }, { "tier": 7.0, + "symbol": "ARB/USDC:USDC", "currency": "USDC", "minNotional": 5000000.0, "maxNotional": 12000000.0, @@ -4710,6 +6531,7 @@ }, { "tier": 8.0, + "symbol": "ARB/USDC:USDC", "currency": "USDC", "minNotional": 12000000.0, "maxNotional": 20000000.0, @@ -4728,6 +6550,7 @@ "ARB/USDT:USDT": [ { "tier": 1.0, + "symbol": "ARB/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -4744,6 +6567,7 @@ }, { "tier": 2.0, + "symbol": "ARB/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 50000.0, @@ -4760,15 +6584,16 @@ }, { "tier": 3.0, + "symbol": "ARB/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 80000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 40.0, "info": { "bracket": "3", "initialLeverage": "40", - "notionalCap": "80000", + "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.015", "cum": "270.0" @@ -4776,120 +6601,128 @@ }, { "tier": 4.0, + "symbol": "ARB/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 200000.0, + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "4", "initialLeverage": "25", - "notionalCap": "200000", - "notionalFloor": "80000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.02", - "cum": "670.0" + "cum": "770.0" } }, { "tier": 5.0, + "symbol": "ARB/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 600000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "5", "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "200000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.025", - "cum": "1670.0" + "cum": "3270.0" } }, { "tier": 6.0, + "symbol": "ARB/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 2000000.0, + "minNotional": 1000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "6", "initialLeverage": "10", - "notionalCap": "2000000", - "notionalFloor": "600000", + "notionalCap": "5000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.05", - "cum": "16670.0" + "cum": "28270.0" } }, { "tier": 7.0, + "symbol": "ARB/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "7", "initialLeverage": "5", - "notionalCap": "4000000", - "notionalFloor": "2000000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.1", - "cum": "116670.0" + "cum": "278270.0" } }, { "tier": 8.0, + "symbol": "ARB/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 5000000.0, + "minNotional": 10000000.0, + "maxNotional": 12500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "8", "initialLeverage": "4", - "notionalCap": "5000000", - "notionalFloor": "4000000", + "notionalCap": "12500000", + "notionalFloor": "10000000", "maintMarginRatio": "0.125", - "cum": "216670.0" + "cum": "528270.0" } }, { "tier": 9.0, + "symbol": "ARB/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 12000000.0, + "minNotional": 12500000.0, + "maxNotional": 25000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "12000000", - "notionalFloor": "5000000", + "notionalCap": "25000000", + "notionalFloor": "12500000", "maintMarginRatio": "0.25", - "cum": "841670.0" + "cum": "2090770.0" } }, { "tier": 10.0, + "symbol": "ARB/USDT:USDT", "currency": "USDT", - "minNotional": 12000000.0, - "maxNotional": 20000000.0, + "minNotional": 25000000.0, + "maxNotional": 50000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "20000000", - "notionalFloor": "12000000", + "notionalCap": "50000000", + "notionalFloor": "25000000", "maintMarginRatio": "0.5", - "cum": "3841670.0" + "cum": "8340770.0" } } ], "ARK/USDT:USDT": [ { "tier": 1.0, + "symbol": "ARK/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -4906,6 +6739,7 @@ }, { "tier": 2.0, + "symbol": "ARK/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -4922,6 +6756,7 @@ }, { "tier": 3.0, + "symbol": "ARK/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 20000.0, @@ -4938,6 +6773,7 @@ }, { "tier": 4.0, + "symbol": "ARK/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 40000.0, @@ -4954,6 +6790,7 @@ }, { "tier": 5.0, + "symbol": "ARK/USDT:USDT", "currency": "USDT", "minNotional": 40000.0, "maxNotional": 200000.0, @@ -4970,6 +6807,7 @@ }, { "tier": 6.0, + "symbol": "ARK/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, @@ -4986,6 +6824,7 @@ }, { "tier": 7.0, + "symbol": "ARK/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -5002,6 +6841,7 @@ }, { "tier": 8.0, + "symbol": "ARK/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 3000000.0, @@ -5018,6 +6858,7 @@ }, { "tier": 9.0, + "symbol": "ARK/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 5000000.0, @@ -5036,6 +6877,7 @@ "ARKM/USDT:USDT": [ { "tier": 1.0, + "symbol": "ARKM/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -5052,15 +6894,16 @@ }, { "tier": 2.0, + "symbol": "ARKM/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 30000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "20000", + "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.015", "cum": "50.0" @@ -5068,120 +6911,128 @@ }, { "tier": 3.0, + "symbol": "ARKM/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 100000.0, + "minNotional": 30000.0, + "maxNotional": 150000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "100000", - "notionalFloor": "20000", + "notionalCap": "150000", + "notionalFloor": "30000", "maintMarginRatio": "0.02", - "cum": "150.0" + "cum": "200.0" } }, { "tier": 4.0, + "symbol": "ARKM/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 200000.0, + "minNotional": 150000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "200000", - "notionalFloor": "100000", + "notionalCap": "300000", + "notionalFloor": "150000", "maintMarginRatio": "0.025", - "cum": "650.0" + "cum": "950.0" } }, { "tier": 5.0, + "symbol": "ARKM/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 1000000.0, + "minNotional": 300000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "1000000", - "notionalFloor": "200000", + "notionalCap": "1500000", + "notionalFloor": "300000", "maintMarginRatio": "0.05", - "cum": "5650.0" + "cum": "8450.0" } }, { "tier": 6.0, + "symbol": "ARKM/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.1", - "cum": "55650.0" + "cum": "83450.0" } }, { "tier": 7.0, + "symbol": "ARKM/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 2500000.0, + "minNotional": 3000000.0, + "maxNotional": 3750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "2500000", - "notionalFloor": "2000000", + "notionalCap": "3750000", + "notionalFloor": "3000000", "maintMarginRatio": "0.125", - "cum": "105650.0" + "cum": "158450.0" } }, { "tier": 8.0, + "symbol": "ARKM/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "minNotional": 3750000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "5000000", - "notionalFloor": "2500000", + "notionalCap": "7500000", + "notionalFloor": "3750000", "maintMarginRatio": "0.25", - "cum": "418150.0" + "cum": "627200.0" } }, { "tier": 9.0, + "symbol": "ARKM/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 7500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "15000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "1668150.0" + "cum": "2502200.0" } } ], "ARPA/USDT:USDT": [ { "tier": 1.0, + "symbol": "ARPA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -5198,6 +7049,7 @@ }, { "tier": 2.0, + "symbol": "ARPA/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -5214,6 +7066,7 @@ }, { "tier": 3.0, + "symbol": "ARPA/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 600000.0, @@ -5230,6 +7083,7 @@ }, { "tier": 4.0, + "symbol": "ARPA/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, "maxNotional": 1600000.0, @@ -5246,6 +7100,7 @@ }, { "tier": 5.0, + "symbol": "ARPA/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, "maxNotional": 2000000.0, @@ -5262,6 +7117,7 @@ }, { "tier": 6.0, + "symbol": "ARPA/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 6000000.0, @@ -5278,6 +7134,7 @@ }, { "tier": 7.0, + "symbol": "ARPA/USDT:USDT", "currency": "USDT", "minNotional": 6000000.0, "maxNotional": 10000000.0, @@ -5296,6 +7153,7 @@ "ASTR/USDT:USDT": [ { "tier": 1.0, + "symbol": "ASTR/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -5312,6 +7170,7 @@ }, { "tier": 2.0, + "symbol": "ASTR/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 20000.0, @@ -5328,6 +7187,7 @@ }, { "tier": 3.0, + "symbol": "ASTR/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 25000.0, @@ -5344,6 +7204,7 @@ }, { "tier": 4.0, + "symbol": "ASTR/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 200000.0, @@ -5360,6 +7221,7 @@ }, { "tier": 5.0, + "symbol": "ASTR/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 400000.0, @@ -5376,6 +7238,7 @@ }, { "tier": 6.0, + "symbol": "ASTR/USDT:USDT", "currency": "USDT", "minNotional": 400000.0, "maxNotional": 500000.0, @@ -5392,6 +7255,7 @@ }, { "tier": 7.0, + "symbol": "ASTR/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -5408,6 +7272,7 @@ }, { "tier": 8.0, + "symbol": "ASTR/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -5426,6 +7291,7 @@ "ATA/USDT:USDT": [ { "tier": 1.0, + "symbol": "ATA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -5442,6 +7308,7 @@ }, { "tier": 2.0, + "symbol": "ATA/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -5458,6 +7325,7 @@ }, { "tier": 3.0, + "symbol": "ATA/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 100000.0, @@ -5474,6 +7342,7 @@ }, { "tier": 4.0, + "symbol": "ATA/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 250000.0, @@ -5490,6 +7359,7 @@ }, { "tier": 5.0, + "symbol": "ATA/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, "maxNotional": 1000000.0, @@ -5506,6 +7376,7 @@ }, { "tier": 6.0, + "symbol": "ATA/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 3000000.0, @@ -5524,6 +7395,7 @@ "ATOM/USDT:USDT": [ { "tier": 1.0, + "symbol": "ATOM/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -5540,6 +7412,7 @@ }, { "tier": 2.0, + "symbol": "ATOM/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 50000.0, @@ -5556,6 +7429,7 @@ }, { "tier": 3.0, + "symbol": "ATOM/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, "maxNotional": 80000.0, @@ -5572,6 +7446,7 @@ }, { "tier": 4.0, + "symbol": "ATOM/USDT:USDT", "currency": "USDT", "minNotional": 80000.0, "maxNotional": 200000.0, @@ -5588,6 +7463,7 @@ }, { "tier": 5.0, + "symbol": "ATOM/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 600000.0, @@ -5604,6 +7480,7 @@ }, { "tier": 6.0, + "symbol": "ATOM/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, "maxNotional": 2000000.0, @@ -5620,6 +7497,7 @@ }, { "tier": 7.0, + "symbol": "ATOM/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 4000000.0, @@ -5636,6 +7514,7 @@ }, { "tier": 8.0, + "symbol": "ATOM/USDT:USDT", "currency": "USDT", "minNotional": 4000000.0, "maxNotional": 5000000.0, @@ -5652,6 +7531,7 @@ }, { "tier": 9.0, + "symbol": "ATOM/USDT:USDT", "currency": "USDT", "minNotional": 5000000.0, "maxNotional": 12000000.0, @@ -5668,6 +7548,7 @@ }, { "tier": 10.0, + "symbol": "ATOM/USDT:USDT", "currency": "USDT", "minNotional": 12000000.0, "maxNotional": 20000000.0, @@ -5686,6 +7567,7 @@ "AUCTION/USDT:USDT": [ { "tier": 1.0, + "symbol": "AUCTION/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -5702,6 +7584,7 @@ }, { "tier": 2.0, + "symbol": "AUCTION/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 20000.0, @@ -5718,6 +7601,7 @@ }, { "tier": 3.0, + "symbol": "AUCTION/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 30000.0, @@ -5734,6 +7618,7 @@ }, { "tier": 4.0, + "symbol": "AUCTION/USDT:USDT", "currency": "USDT", "minNotional": 30000.0, "maxNotional": 300000.0, @@ -5750,6 +7635,7 @@ }, { "tier": 5.0, + "symbol": "AUCTION/USDT:USDT", "currency": "USDT", "minNotional": 300000.0, "maxNotional": 600000.0, @@ -5766,6 +7652,7 @@ }, { "tier": 6.0, + "symbol": "AUCTION/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, "maxNotional": 750000.0, @@ -5782,6 +7669,7 @@ }, { "tier": 7.0, + "symbol": "AUCTION/USDT:USDT", "currency": "USDT", "minNotional": 750000.0, "maxNotional": 1500000.0, @@ -5798,6 +7686,7 @@ }, { "tier": 8.0, + "symbol": "AUCTION/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, "maxNotional": 3000000.0, @@ -5813,9 +7702,165 @@ } } ], + "AVA/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "AVA/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "AVA/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "AVA/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "AVA/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "AVA/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "AVA/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "16725.0" + } + }, + { + "tier": 7.0, + "symbol": "AVA/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "AVA/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "125475.0" + } + }, + { + "tier": 9.0, + "symbol": "AVA/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "500475.0" + } + } + ], "AVAX/USDC:USDC": [ { "tier": 1.0, + "symbol": "AVAX/USDC:USDC", "currency": "USDC", "minNotional": 0.0, "maxNotional": 5000.0, @@ -5832,6 +7877,7 @@ }, { "tier": 2.0, + "symbol": "AVAX/USDC:USDC", "currency": "USDC", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -5848,6 +7894,7 @@ }, { "tier": 3.0, + "symbol": "AVAX/USDC:USDC", "currency": "USDC", "minNotional": 10000.0, "maxNotional": 25000.0, @@ -5864,6 +7911,7 @@ }, { "tier": 4.0, + "symbol": "AVAX/USDC:USDC", "currency": "USDC", "minNotional": 25000.0, "maxNotional": 50000.0, @@ -5880,6 +7928,7 @@ }, { "tier": 5.0, + "symbol": "AVAX/USDC:USDC", "currency": "USDC", "minNotional": 50000.0, "maxNotional": 250000.0, @@ -5896,6 +7945,7 @@ }, { "tier": 6.0, + "symbol": "AVAX/USDC:USDC", "currency": "USDC", "minNotional": 250000.0, "maxNotional": 1000000.0, @@ -5912,6 +7962,7 @@ }, { "tier": 7.0, + "symbol": "AVAX/USDC:USDC", "currency": "USDC", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -5928,6 +7979,7 @@ }, { "tier": 8.0, + "symbol": "AVAX/USDC:USDC", "currency": "USDC", "minNotional": 2000000.0, "maxNotional": 5000000.0, @@ -5944,6 +7996,7 @@ }, { "tier": 9.0, + "symbol": "AVAX/USDC:USDC", "currency": "USDC", "minNotional": 5000000.0, "maxNotional": 20000000.0, @@ -5960,6 +8013,7 @@ }, { "tier": 10.0, + "symbol": "AVAX/USDC:USDC", "currency": "USDC", "minNotional": 20000000.0, "maxNotional": 50000000.0, @@ -5978,15 +8032,16 @@ "AVAX/USDT:USDT": [ { "tier": 1.0, + "symbol": "AVAX/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.005, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "5000", + "notionalCap": "25000", "notionalFloor": "0", "maintMarginRatio": "0.005", "cum": "0.0" @@ -5994,152 +8049,162 @@ }, { "tier": 2.0, + "symbol": "AVAX/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.0065, + "minNotional": 25000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.01, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.0065", - "cum": "7.5" + "notionalCap": "80000", + "notionalFloor": "25000", + "maintMarginRatio": "0.01", + "cum": "125.0" } }, { "tier": 3.0, + "symbol": "AVAX/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 80000.0, - "maintenanceMarginRate": 0.01, + "minNotional": 80000.0, + "maxNotional": 160000.0, + "maintenanceMarginRate": 0.015, "maxLeverage": 40.0, "info": { "bracket": "3", "initialLeverage": "40", - "notionalCap": "80000", - "notionalFloor": "25000", - "maintMarginRatio": "0.01", - "cum": "95.0" + "notionalCap": "160000", + "notionalFloor": "80000", + "maintMarginRatio": "0.015", + "cum": "525.0" } }, { "tier": 4.0, + "symbol": "AVAX/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 400000.0, + "minNotional": 160000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "4", "initialLeverage": "25", - "notionalCap": "400000", - "notionalFloor": "80000", + "notionalCap": "800000", + "notionalFloor": "160000", "maintMarginRatio": "0.02", - "cum": "895.0" + "cum": "1325.0" } }, { "tier": 5.0, + "symbol": "AVAX/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 800000.0, + "minNotional": 800000.0, + "maxNotional": 1600000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "5", "initialLeverage": "20", - "notionalCap": "800000", - "notionalFloor": "400000", + "notionalCap": "1600000", + "notionalFloor": "800000", "maintMarginRatio": "0.025", - "cum": "2895.0" + "cum": "5325.0" } }, { "tier": 6.0, + "symbol": "AVAX/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 4000000.0, + "minNotional": 1600000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "6", "initialLeverage": "10", - "notionalCap": "4000000", - "notionalFloor": "800000", + "notionalCap": "8000000", + "notionalFloor": "1600000", "maintMarginRatio": "0.05", - "cum": "22895.0" + "cum": "45325.0" } }, { "tier": 7.0, + "symbol": "AVAX/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "minNotional": 8000000.0, + "maxNotional": 16000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "7", "initialLeverage": "5", - "notionalCap": "8000000", - "notionalFloor": "4000000", + "notionalCap": "16000000", + "notionalFloor": "8000000", "maintMarginRatio": "0.1", - "cum": "222895.0" + "cum": "445325.0" } }, { "tier": 8.0, + "symbol": "AVAX/USDT:USDT", "currency": "USDT", - "minNotional": 8000000.0, - "maxNotional": 10000000.0, + "minNotional": 16000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "8", "initialLeverage": "4", - "notionalCap": "10000000", - "notionalFloor": "8000000", + "notionalCap": "20000000", + "notionalFloor": "16000000", "maintMarginRatio": "0.125", - "cum": "422895.0" + "cum": "845325.0" } }, { "tier": 9.0, + "symbol": "AVAX/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "minNotional": 20000000.0, + "maxNotional": 40000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "40000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.25", - "cum": "1672895.0" + "cum": "3345325.0" } }, { "tier": 10.0, + "symbol": "AVAX/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 50000000.0, + "minNotional": 40000000.0, + "maxNotional": 80000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "20000000", + "notionalCap": "80000000", + "notionalFloor": "40000000", "maintMarginRatio": "0.5", - "cum": "6672895.0" + "cum": "13345325.0" } } ], "AXL/USDT:USDT": [ { "tier": 1.0, + "symbol": "AXL/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -6156,6 +8221,7 @@ }, { "tier": 2.0, + "symbol": "AXL/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -6172,6 +8238,7 @@ }, { "tier": 3.0, + "symbol": "AXL/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 30000.0, @@ -6188,6 +8255,7 @@ }, { "tier": 4.0, + "symbol": "AXL/USDT:USDT", "currency": "USDT", "minNotional": 30000.0, "maxNotional": 60000.0, @@ -6204,6 +8272,7 @@ }, { "tier": 5.0, + "symbol": "AXL/USDT:USDT", "currency": "USDT", "minNotional": 60000.0, "maxNotional": 300000.0, @@ -6220,6 +8289,7 @@ }, { "tier": 6.0, + "symbol": "AXL/USDT:USDT", "currency": "USDT", "minNotional": 300000.0, "maxNotional": 600000.0, @@ -6236,6 +8306,7 @@ }, { "tier": 7.0, + "symbol": "AXL/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, "maxNotional": 750000.0, @@ -6252,6 +8323,7 @@ }, { "tier": 8.0, + "symbol": "AXL/USDT:USDT", "currency": "USDT", "minNotional": 750000.0, "maxNotional": 1500000.0, @@ -6268,6 +8340,7 @@ }, { "tier": 9.0, + "symbol": "AXL/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, "maxNotional": 3000000.0, @@ -6286,6 +8359,7 @@ "AXS/USDT:USDT": [ { "tier": 1.0, + "symbol": "AXS/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -6302,6 +8376,7 @@ }, { "tier": 2.0, + "symbol": "AXS/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -6318,6 +8393,7 @@ }, { "tier": 3.0, + "symbol": "AXS/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 400000.0, @@ -6334,6 +8410,7 @@ }, { "tier": 4.0, + "symbol": "AXS/USDT:USDT", "currency": "USDT", "minNotional": 400000.0, "maxNotional": 600000.0, @@ -6350,6 +8427,7 @@ }, { "tier": 5.0, + "symbol": "AXS/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, "maxNotional": 1200000.0, @@ -6366,6 +8444,7 @@ }, { "tier": 6.0, + "symbol": "AXS/USDT:USDT", "currency": "USDT", "minNotional": 1200000.0, "maxNotional": 3200000.0, @@ -6382,6 +8461,7 @@ }, { "tier": 7.0, + "symbol": "AXS/USDT:USDT", "currency": "USDT", "minNotional": 3200000.0, "maxNotional": 5000000.0, @@ -6398,6 +8478,7 @@ }, { "tier": 8.0, + "symbol": "AXS/USDT:USDT", "currency": "USDT", "minNotional": 5000000.0, "maxNotional": 10000000.0, @@ -6414,6 +8495,7 @@ }, { "tier": 9.0, + "symbol": "AXS/USDT:USDT", "currency": "USDT", "minNotional": 10000000.0, "maxNotional": 15000000.0, @@ -6430,6 +8512,7 @@ }, { "tier": 10.0, + "symbol": "AXS/USDT:USDT", "currency": "USDT", "minNotional": 15000000.0, "maxNotional": 20000000.0, @@ -6448,6 +8531,7 @@ "BADGER/USDT:USDT": [ { "tier": 1.0, + "symbol": "BADGER/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -6464,6 +8548,7 @@ }, { "tier": 2.0, + "symbol": "BADGER/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -6480,6 +8565,7 @@ }, { "tier": 3.0, + "symbol": "BADGER/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 100000.0, @@ -6496,6 +8582,7 @@ }, { "tier": 4.0, + "symbol": "BADGER/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 200000.0, @@ -6512,6 +8599,7 @@ }, { "tier": 5.0, + "symbol": "BADGER/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, @@ -6528,6 +8616,7 @@ }, { "tier": 6.0, + "symbol": "BADGER/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -6544,6 +8633,7 @@ }, { "tier": 7.0, + "symbol": "BADGER/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -6562,6 +8652,7 @@ "BAKE/USDT:USDT": [ { "tier": 1.0, + "symbol": "BAKE/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -6578,6 +8669,7 @@ }, { "tier": 2.0, + "symbol": "BAKE/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -6594,6 +8686,7 @@ }, { "tier": 3.0, + "symbol": "BAKE/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 100000.0, @@ -6610,6 +8703,7 @@ }, { "tier": 4.0, + "symbol": "BAKE/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 250000.0, @@ -6626,6 +8720,7 @@ }, { "tier": 5.0, + "symbol": "BAKE/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, "maxNotional": 1000000.0, @@ -6642,6 +8737,7 @@ }, { "tier": 6.0, + "symbol": "BAKE/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 1500000.0, @@ -6658,6 +8754,7 @@ }, { "tier": 7.0, + "symbol": "BAKE/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, "maxNotional": 3000000.0, @@ -6676,6 +8773,7 @@ "BAL/USDT:USDT": [ { "tier": 1.0, + "symbol": "BAL/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -6692,6 +8790,7 @@ }, { "tier": 2.0, + "symbol": "BAL/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -6708,6 +8807,7 @@ }, { "tier": 3.0, + "symbol": "BAL/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 100000.0, @@ -6724,6 +8824,7 @@ }, { "tier": 4.0, + "symbol": "BAL/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 250000.0, @@ -6740,6 +8841,7 @@ }, { "tier": 5.0, + "symbol": "BAL/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, "maxNotional": 1000000.0, @@ -6756,6 +8858,7 @@ }, { "tier": 6.0, + "symbol": "BAL/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 5000000.0, @@ -6771,18 +8874,19 @@ } } ], - "BANANA/USDT:USDT": [ + "BAN/USDT:USDT": [ { "tier": 1.0, + "symbol": "BAN/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -6790,266 +8894,300 @@ }, { "tier": 2.0, + "symbol": "BAN/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, + "minNotional": 10000.0, + "maxNotional": 30000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "10000", - "notionalFloor": "5000", + "notionalCap": "30000", + "notionalFloor": "10000", "maintMarginRatio": "0.015", - "cum": "25.0" + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "BAN/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 50000.0, + "minNotional": 30000.0, + "maxNotional": 150000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "50000", - "notionalFloor": "10000", + "notionalCap": "150000", + "notionalFloor": "30000", "maintMarginRatio": "0.02", - "cum": "75.0" + "cum": "200.0" } }, { "tier": 4.0, + "symbol": "BAN/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, + "minNotional": 150000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "100000", - "notionalFloor": "50000", + "notionalCap": "300000", + "notionalFloor": "150000", "maintMarginRatio": "0.025", - "cum": "325.0" + "cum": "950.0" } }, { "tier": 5.0, + "symbol": "BAN/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 500000.0, + "minNotional": 300000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "500000", - "notionalFloor": "100000", + "notionalCap": "1500000", + "notionalFloor": "300000", "maintMarginRatio": "0.05", - "cum": "2825.0" + "cum": "8450.0" } }, { "tier": 6.0, + "symbol": "BAN/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.1", - "cum": "27825.0" + "cum": "83450.0" } }, { "tier": 7.0, + "symbol": "BAN/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 1250000.0, + "minNotional": 3000000.0, + "maxNotional": 3750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "1250000", - "notionalFloor": "1000000", + "notionalCap": "3750000", + "notionalFloor": "3000000", "maintMarginRatio": "0.125", - "cum": "52825.0" + "cum": "158450.0" } }, { "tier": 8.0, + "symbol": "BAN/USDT:USDT", "currency": "USDT", - "minNotional": 1250000.0, - "maxNotional": 2500000.0, + "minNotional": 3750000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "2500000", - "notionalFloor": "1250000", + "notionalCap": "7500000", + "notionalFloor": "3750000", "maintMarginRatio": "0.25", - "cum": "209075.0" + "cum": "627200.0" } }, { "tier": 9.0, + "symbol": "BAN/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "minNotional": 7500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "2500000", + "notionalCap": "15000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "834075.0" + "cum": "2502200.0" } } ], - "BAND/USDT:USDT": [ + "BANANA/USDT:USDT": [ { "tier": 1.0, + "symbol": "BANANA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "BANANA/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "20000", + "initialLeverage": "50", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.015", "cum": "25.0" } }, { "tier": 3.0, + "symbol": "BANANA/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 25000.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "BANANA/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "20000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "125.0" + "cum": "325.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "BANANA/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.05", - "cum": "750.0" + "cum": "2825.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "BANANA/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "10750.0" + "cum": "27825.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "BANANA/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "1250000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "20750.0" + "cum": "52825.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "BANANA/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 1250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "2500000", + "notionalFloor": "1250000", "maintMarginRatio": "0.25", - "cum": "83250.0" + "cum": "209075.0" } }, { - "tier": 8.0, + "tier": 9.0, + "symbol": "BANANA/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "333250.0" + "cum": "834075.0" } } ], - "BAT/USDT:USDT": [ + "BAND/USDT:USDT": [ { "tier": 1.0, + "symbol": "BAND/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -7066,6 +9204,7 @@ }, { "tier": 2.0, + "symbol": "BAND/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 20000.0, @@ -7082,6 +9221,7 @@ }, { "tier": 3.0, + "symbol": "BAND/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 25000.0, @@ -7098,6 +9238,7 @@ }, { "tier": 4.0, + "symbol": "BAND/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 200000.0, @@ -7114,6 +9255,7 @@ }, { "tier": 5.0, + "symbol": "BAND/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 400000.0, @@ -7130,6 +9272,7 @@ }, { "tier": 6.0, + "symbol": "BAND/USDT:USDT", "currency": "USDT", "minNotional": 400000.0, "maxNotional": 500000.0, @@ -7146,6 +9289,7 @@ }, { "tier": 7.0, + "symbol": "BAND/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -7162,6 +9306,145 @@ }, { "tier": 8.0, + "symbol": "BAND/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "333250.0" + } + } + ], + "BAT/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "BAT/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": "BAT/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "20000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "BAT/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "20000", + "maintMarginRatio": "0.025", + "cum": "125.0" + } + }, + { + "tier": 4.0, + "symbol": "BAT/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "200000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "750.0" + } + }, + { + "tier": 5.0, + "symbol": "BAT/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "400000", + "notionalFloor": "200000", + "maintMarginRatio": "0.1", + "cum": "10750.0" + } + }, + { + "tier": 6.0, + "symbol": "BAT/USDT:USDT", + "currency": "USDT", + "minNotional": 400000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "400000", + "maintMarginRatio": "0.125", + "cum": "20750.0" + } + }, + { + "tier": 7.0, + "symbol": "BAT/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.25", + "cum": "83250.0" + } + }, + { + "tier": 8.0, + "symbol": "BAT/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -7180,6 +9463,7 @@ "BB/USDT:USDT": [ { "tier": 1.0, + "symbol": "BB/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -7196,6 +9480,7 @@ }, { "tier": 2.0, + "symbol": "BB/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -7212,6 +9497,7 @@ }, { "tier": 3.0, + "symbol": "BB/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 80000.0, @@ -7228,6 +9514,7 @@ }, { "tier": 4.0, + "symbol": "BB/USDT:USDT", "currency": "USDT", "minNotional": 80000.0, "maxNotional": 800000.0, @@ -7244,6 +9531,7 @@ }, { "tier": 5.0, + "symbol": "BB/USDT:USDT", "currency": "USDT", "minNotional": 800000.0, "maxNotional": 1600000.0, @@ -7260,6 +9548,7 @@ }, { "tier": 6.0, + "symbol": "BB/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, "maxNotional": 2000000.0, @@ -7276,6 +9565,7 @@ }, { "tier": 7.0, + "symbol": "BB/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 4000000.0, @@ -7292,6 +9582,7 @@ }, { "tier": 8.0, + "symbol": "BB/USDT:USDT", "currency": "USDT", "minNotional": 4000000.0, "maxNotional": 8000000.0, @@ -7310,6 +9601,7 @@ "BCH/USDC:USDC": [ { "tier": 1.0, + "symbol": "BCH/USDC:USDC", "currency": "USDC", "minNotional": 0.0, "maxNotional": 5000.0, @@ -7326,6 +9618,7 @@ }, { "tier": 2.0, + "symbol": "BCH/USDC:USDC", "currency": "USDC", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -7342,6 +9635,7 @@ }, { "tier": 3.0, + "symbol": "BCH/USDC:USDC", "currency": "USDC", "minNotional": 10000.0, "maxNotional": 50000.0, @@ -7358,6 +9652,7 @@ }, { "tier": 4.0, + "symbol": "BCH/USDC:USDC", "currency": "USDC", "minNotional": 50000.0, "maxNotional": 500000.0, @@ -7374,6 +9669,7 @@ }, { "tier": 5.0, + "symbol": "BCH/USDC:USDC", "currency": "USDC", "minNotional": 500000.0, "maxNotional": 2000000.0, @@ -7390,6 +9686,7 @@ }, { "tier": 6.0, + "symbol": "BCH/USDC:USDC", "currency": "USDC", "minNotional": 2000000.0, "maxNotional": 4000000.0, @@ -7406,6 +9703,7 @@ }, { "tier": 7.0, + "symbol": "BCH/USDC:USDC", "currency": "USDC", "minNotional": 4000000.0, "maxNotional": 8000000.0, @@ -7422,6 +9720,7 @@ }, { "tier": 8.0, + "symbol": "BCH/USDC:USDC", "currency": "USDC", "minNotional": 8000000.0, "maxNotional": 15000000.0, @@ -7438,6 +9737,7 @@ }, { "tier": 9.0, + "symbol": "BCH/USDC:USDC", "currency": "USDC", "minNotional": 15000000.0, "maxNotional": 20000000.0, @@ -7454,6 +9754,7 @@ }, { "tier": 10.0, + "symbol": "BCH/USDC:USDC", "currency": "USDC", "minNotional": 20000000.0, "maxNotional": 50000000.0, @@ -7472,15 +9773,16 @@ "BCH/USDT:USDT": [ { "tier": 1.0, + "symbol": "BCH/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.005, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.005", "cum": "0.0" @@ -7488,152 +9790,162 @@ }, { "tier": 2.0, + "symbol": "BCH/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.0065, + "minNotional": 10000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.01, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.0065", - "cum": "7.5" + "notionalCap": "100000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "BCH/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.01, + "minNotional": 100000.0, + "maxNotional": 160000.0, + "maintenanceMarginRate": 0.015, "maxLeverage": 40.0, "info": { "bracket": "3", "initialLeverage": "40", - "notionalCap": "100000", - "notionalFloor": "10000", - "maintMarginRatio": "0.01", - "cum": "42.5" + "notionalCap": "160000", + "notionalFloor": "100000", + "maintMarginRatio": "0.015", + "cum": "550.0" } }, { "tier": 4.0, + "symbol": "BCH/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 500000.0, + "minNotional": 160000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "4", "initialLeverage": "25", - "notionalCap": "500000", - "notionalFloor": "100000", + "notionalCap": "800000", + "notionalFloor": "160000", "maintMarginRatio": "0.02", - "cum": "1042.5" + "cum": "1350.0" } }, { "tier": 5.0, + "symbol": "BCH/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 800000.0, + "maxNotional": 1600000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "5", "initialLeverage": "20", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "1600000", + "notionalFloor": "800000", "maintMarginRatio": "0.025", - "cum": "3542.5" + "cum": "5350.0" } }, { "tier": 6.0, + "symbol": "BCH/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 5000000.0, + "minNotional": 1600000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "6", "initialLeverage": "10", - "notionalCap": "5000000", - "notionalFloor": "1000000", + "notionalCap": "8000000", + "notionalFloor": "1600000", "maintMarginRatio": "0.05", - "cum": "28542.5" + "cum": "45350.0" } }, { "tier": 7.0, + "symbol": "BCH/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 8000000.0, + "maxNotional": 16000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "7", "initialLeverage": "5", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "16000000", + "notionalFloor": "8000000", "maintMarginRatio": "0.1", - "cum": "278542.5" + "cum": "445350.0" } }, { "tier": 8.0, + "symbol": "BCH/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 15000000.0, + "minNotional": 16000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "8", "initialLeverage": "4", - "notionalCap": "15000000", - "notionalFloor": "10000000", + "notionalCap": "20000000", + "notionalFloor": "16000000", "maintMarginRatio": "0.125", - "cum": "528542.5" + "cum": "845350.0" } }, { "tier": 9.0, + "symbol": "BCH/USDT:USDT", "currency": "USDT", - "minNotional": 15000000.0, - "maxNotional": 25000000.0, + "minNotional": 20000000.0, + "maxNotional": 40000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "25000000", - "notionalFloor": "15000000", + "notionalCap": "40000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.25", - "cum": "2403542.5" + "cum": "3345350.0" } }, { "tier": 10.0, + "symbol": "BCH/USDT:USDT", "currency": "USDT", - "minNotional": 25000000.0, - "maxNotional": 50000000.0, + "minNotional": 40000000.0, + "maxNotional": 80000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "25000000", + "notionalCap": "80000000", + "notionalFloor": "40000000", "maintMarginRatio": "0.5", - "cum": "8653542.5" + "cum": "13345350.0" } } ], "BEAMX/USDT:USDT": [ { "tier": 1.0, + "symbol": "BEAMX/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -7650,6 +9962,7 @@ }, { "tier": 2.0, + "symbol": "BEAMX/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -7666,6 +9979,7 @@ }, { "tier": 3.0, + "symbol": "BEAMX/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 30000.0, @@ -7682,6 +9996,7 @@ }, { "tier": 4.0, + "symbol": "BEAMX/USDT:USDT", "currency": "USDT", "minNotional": 30000.0, "maxNotional": 60000.0, @@ -7698,6 +10013,7 @@ }, { "tier": 5.0, + "symbol": "BEAMX/USDT:USDT", "currency": "USDT", "minNotional": 60000.0, "maxNotional": 300000.0, @@ -7714,6 +10030,7 @@ }, { "tier": 6.0, + "symbol": "BEAMX/USDT:USDT", "currency": "USDT", "minNotional": 300000.0, "maxNotional": 600000.0, @@ -7730,6 +10047,7 @@ }, { "tier": 7.0, + "symbol": "BEAMX/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, "maxNotional": 750000.0, @@ -7746,6 +10064,7 @@ }, { "tier": 8.0, + "symbol": "BEAMX/USDT:USDT", "currency": "USDT", "minNotional": 750000.0, "maxNotional": 1500000.0, @@ -7762,6 +10081,7 @@ }, { "tier": 9.0, + "symbol": "BEAMX/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, "maxNotional": 3000000.0, @@ -7780,6 +10100,7 @@ "BEL/USDT:USDT": [ { "tier": 1.0, + "symbol": "BEL/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -7796,6 +10117,7 @@ }, { "tier": 2.0, + "symbol": "BEL/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 50000.0, @@ -7812,6 +10134,7 @@ }, { "tier": 3.0, + "symbol": "BEL/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, "maxNotional": 200000.0, @@ -7828,6 +10151,7 @@ }, { "tier": 4.0, + "symbol": "BEL/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, @@ -7844,6 +10168,7 @@ }, { "tier": 5.0, + "symbol": "BEL/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -7860,6 +10185,7 @@ }, { "tier": 6.0, + "symbol": "BEL/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 1500000.0, @@ -7876,6 +10202,7 @@ }, { "tier": 7.0, + "symbol": "BEL/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, "maxNotional": 3000000.0, @@ -7894,104 +10221,162 @@ "BICO/USDT:USDT": [ { "tier": 1.0, + "symbol": "BICO/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.03, - "maxLeverage": 20.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "20", - "notionalCap": "10000", + "initialLeverage": "75", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.03", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "BICO/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "BICO/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 200000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "BICO/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "325.0" + } + }, + { + "tier": 5.0, + "symbol": "BICO/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "2", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "10000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.05", - "cum": "200.0" + "cum": "2825.0" } }, { - "tier": 3.0, + "tier": 6.0, + "symbol": "BICO/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "3", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "10200.0" + "cum": "27825.0" } }, { - "tier": 4.0, + "tier": 7.0, + "symbol": "BICO/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "4", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "1250000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "22700.0" + "cum": "52825.0" } }, { - "tier": 5.0, + "tier": 8.0, + "symbol": "BICO/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, + "minNotional": 1250000.0, "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "5", + "bracket": "8", "initialLeverage": "2", "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalFloor": "1250000", "maintMarginRatio": "0.25", - "cum": "147700.0" + "cum": "209075.0" } }, { - "tier": 6.0, + "tier": 9.0, + "symbol": "BICO/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, - "maxNotional": 3500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "3500000", + "notionalCap": "5000000", "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "897700.0" + "cum": "959075.0" } } ], "BIGTIME/USDT:USDT": [ { "tier": 1.0, + "symbol": "BIGTIME/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -8008,15 +10393,16 @@ }, { "tier": 2.0, + "symbol": "BIGTIME/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 30000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "20000", + "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.015", "cum": "50.0" @@ -8024,120 +10410,128 @@ }, { "tier": 3.0, + "symbol": "BIGTIME/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 100000.0, + "minNotional": 30000.0, + "maxNotional": 150000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "100000", - "notionalFloor": "20000", + "notionalCap": "150000", + "notionalFloor": "30000", "maintMarginRatio": "0.02", - "cum": "150.0" + "cum": "200.0" } }, { "tier": 4.0, + "symbol": "BIGTIME/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 200000.0, + "minNotional": 150000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "200000", - "notionalFloor": "100000", + "notionalCap": "300000", + "notionalFloor": "150000", "maintMarginRatio": "0.025", - "cum": "650.0" + "cum": "950.0" } }, { "tier": 5.0, + "symbol": "BIGTIME/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 1000000.0, + "minNotional": 300000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "1000000", - "notionalFloor": "200000", + "notionalCap": "1500000", + "notionalFloor": "300000", "maintMarginRatio": "0.05", - "cum": "5650.0" + "cum": "8450.0" } }, { "tier": 6.0, + "symbol": "BIGTIME/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.1", - "cum": "55650.0" + "cum": "83450.0" } }, { "tier": 7.0, + "symbol": "BIGTIME/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 2500000.0, + "minNotional": 3000000.0, + "maxNotional": 3750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "2500000", - "notionalFloor": "2000000", + "notionalCap": "3750000", + "notionalFloor": "3000000", "maintMarginRatio": "0.125", - "cum": "105650.0" + "cum": "158450.0" } }, { "tier": 8.0, + "symbol": "BIGTIME/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "minNotional": 3750000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "5000000", - "notionalFloor": "2500000", + "notionalCap": "7500000", + "notionalFloor": "3750000", "maintMarginRatio": "0.25", - "cum": "418150.0" + "cum": "627200.0" } }, { "tier": 9.0, + "symbol": "BIGTIME/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 7500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "15000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "1668150.0" + "cum": "2502200.0" } } ], "BLUR/USDT:USDT": [ { "tier": 1.0, + "symbol": "BLUR/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -8154,6 +10548,7 @@ }, { "tier": 2.0, + "symbol": "BLUR/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -8170,6 +10565,7 @@ }, { "tier": 3.0, + "symbol": "BLUR/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 100000.0, @@ -8186,6 +10582,7 @@ }, { "tier": 4.0, + "symbol": "BLUR/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 600000.0, @@ -8202,6 +10599,7 @@ }, { "tier": 5.0, + "symbol": "BLUR/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, "maxNotional": 1600000.0, @@ -8218,6 +10616,7 @@ }, { "tier": 6.0, + "symbol": "BLUR/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, "maxNotional": 2000000.0, @@ -8234,6 +10633,7 @@ }, { "tier": 7.0, + "symbol": "BLUR/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 6000000.0, @@ -8250,6 +10650,7 @@ }, { "tier": 8.0, + "symbol": "BLUR/USDT:USDT", "currency": "USDT", "minNotional": 6000000.0, "maxNotional": 10000000.0, @@ -8268,14 +10669,15 @@ "BLZ/USDT:USDT": [ { "tier": 1.0, + "symbol": "BLZ/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "25000", "notionalFloor": "0", "maintMarginRatio": "0.025", @@ -8284,14 +10686,15 @@ }, { "tier": 2.0, + "symbol": "BLZ/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "2", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "100000", "notionalFloor": "25000", "maintMarginRatio": "0.05", @@ -8300,6 +10703,7 @@ }, { "tier": 3.0, + "symbol": "BLZ/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 250000.0, @@ -8316,6 +10720,7 @@ }, { "tier": 4.0, + "symbol": "BLZ/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, "maxNotional": 1000000.0, @@ -8332,15 +10737,16 @@ }, { "tier": 5.0, + "symbol": "BLZ/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 1500000.0, + "maxNotional": 1300000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "5", "initialLeverage": "2", - "notionalCap": "1500000", + "notionalCap": "1300000", "notionalFloor": "1000000", "maintMarginRatio": "0.25", "cum": "136875.0" @@ -8348,24 +10754,26 @@ }, { "tier": 6.0, + "symbol": "BLZ/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 1300000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "6", "initialLeverage": "1", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "1500000", + "notionalFloor": "1300000", "maintMarginRatio": "0.5", - "cum": "511875.0" + "cum": "461875.0" } } ], "BNB/USDC:USDC": [ { "tier": 1.0, + "symbol": "BNB/USDC:USDC", "currency": "USDC", "minNotional": 0.0, "maxNotional": 5000.0, @@ -8382,6 +10790,7 @@ }, { "tier": 2.0, + "symbol": "BNB/USDC:USDC", "currency": "USDC", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -8398,6 +10807,7 @@ }, { "tier": 3.0, + "symbol": "BNB/USDC:USDC", "currency": "USDC", "minNotional": 10000.0, "maxNotional": 50000.0, @@ -8414,6 +10824,7 @@ }, { "tier": 4.0, + "symbol": "BNB/USDC:USDC", "currency": "USDC", "minNotional": 50000.0, "maxNotional": 250000.0, @@ -8430,6 +10841,7 @@ }, { "tier": 5.0, + "symbol": "BNB/USDC:USDC", "currency": "USDC", "minNotional": 250000.0, "maxNotional": 1000000.0, @@ -8446,6 +10858,7 @@ }, { "tier": 6.0, + "symbol": "BNB/USDC:USDC", "currency": "USDC", "minNotional": 1000000.0, "maxNotional": 5000000.0, @@ -8462,6 +10875,7 @@ }, { "tier": 7.0, + "symbol": "BNB/USDC:USDC", "currency": "USDC", "minNotional": 5000000.0, "maxNotional": 10000000.0, @@ -8478,6 +10892,7 @@ }, { "tier": 8.0, + "symbol": "BNB/USDC:USDC", "currency": "USDC", "minNotional": 10000000.0, "maxNotional": 20000000.0, @@ -8494,6 +10909,7 @@ }, { "tier": 9.0, + "symbol": "BNB/USDC:USDC", "currency": "USDC", "minNotional": 20000000.0, "maxNotional": 30000000.0, @@ -8510,6 +10926,7 @@ }, { "tier": 10.0, + "symbol": "BNB/USDC:USDC", "currency": "USDC", "minNotional": 30000000.0, "maxNotional": 50000000.0, @@ -8528,6 +10945,7 @@ "BNB/USDT:USDT": [ { "tier": 1.0, + "symbol": "BNB/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -8544,6 +10962,7 @@ }, { "tier": 2.0, + "symbol": "BNB/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 50000.0, @@ -8560,6 +10979,7 @@ }, { "tier": 3.0, + "symbol": "BNB/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, "maxNotional": 200000.0, @@ -8576,6 +10996,7 @@ }, { "tier": 4.0, + "symbol": "BNB/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 1500000.0, @@ -8592,6 +11013,7 @@ }, { "tier": 5.0, + "symbol": "BNB/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, "maxNotional": 3000000.0, @@ -8608,6 +11030,7 @@ }, { "tier": 6.0, + "symbol": "BNB/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 15000000.0, @@ -8624,6 +11047,7 @@ }, { "tier": 7.0, + "symbol": "BNB/USDT:USDT", "currency": "USDT", "minNotional": 15000000.0, "maxNotional": 30000000.0, @@ -8640,6 +11064,7 @@ }, { "tier": 8.0, + "symbol": "BNB/USDT:USDT", "currency": "USDT", "minNotional": 30000000.0, "maxNotional": 37500000.0, @@ -8656,6 +11081,7 @@ }, { "tier": 9.0, + "symbol": "BNB/USDT:USDT", "currency": "USDT", "minNotional": 37500000.0, "maxNotional": 75000000.0, @@ -8672,6 +11098,7 @@ }, { "tier": 10.0, + "symbol": "BNB/USDT:USDT", "currency": "USDT", "minNotional": 75000000.0, "maxNotional": 150000000.0, @@ -8690,6 +11117,7 @@ "BNT/USDT:USDT": [ { "tier": 1.0, + "symbol": "BNT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -8706,6 +11134,7 @@ }, { "tier": 2.0, + "symbol": "BNT/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -8722,6 +11151,7 @@ }, { "tier": 3.0, + "symbol": "BNT/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 200000.0, @@ -8738,6 +11168,7 @@ }, { "tier": 4.0, + "symbol": "BNT/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, @@ -8754,6 +11185,7 @@ }, { "tier": 5.0, + "symbol": "BNT/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -8770,6 +11202,7 @@ }, { "tier": 6.0, + "symbol": "BNT/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 3000000.0, @@ -8786,6 +11219,7 @@ }, { "tier": 7.0, + "symbol": "BNT/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 5000000.0, @@ -8804,6 +11238,7 @@ "BNX/USDT:USDT": [ { "tier": 1.0, + "symbol": "BNX/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -8820,6 +11255,7 @@ }, { "tier": 2.0, + "symbol": "BNX/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 20000.0, @@ -8836,6 +11272,7 @@ }, { "tier": 3.0, + "symbol": "BNX/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 100000.0, @@ -8852,6 +11289,7 @@ }, { "tier": 4.0, + "symbol": "BNX/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 200000.0, @@ -8868,6 +11306,7 @@ }, { "tier": 5.0, + "symbol": "BNX/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 1000000.0, @@ -8884,6 +11323,7 @@ }, { "tier": 6.0, + "symbol": "BNX/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -8900,6 +11340,7 @@ }, { "tier": 7.0, + "symbol": "BNX/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 2500000.0, @@ -8916,6 +11357,7 @@ }, { "tier": 8.0, + "symbol": "BNX/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, "maxNotional": 3000000.0, @@ -8932,6 +11374,7 @@ }, { "tier": 9.0, + "symbol": "BNX/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 3500000.0, @@ -8950,6 +11393,7 @@ "BOME/USDC:USDC": [ { "tier": 1.0, + "symbol": "BOME/USDC:USDC", "currency": "USDC", "minNotional": 0.0, "maxNotional": 5000.0, @@ -8966,6 +11410,7 @@ }, { "tier": 2.0, + "symbol": "BOME/USDC:USDC", "currency": "USDC", "minNotional": 5000.0, "maxNotional": 50000.0, @@ -8982,6 +11427,7 @@ }, { "tier": 3.0, + "symbol": "BOME/USDC:USDC", "currency": "USDC", "minNotional": 50000.0, "maxNotional": 600000.0, @@ -8998,6 +11444,7 @@ }, { "tier": 4.0, + "symbol": "BOME/USDC:USDC", "currency": "USDC", "minNotional": 600000.0, "maxNotional": 1200000.0, @@ -9014,6 +11461,7 @@ }, { "tier": 5.0, + "symbol": "BOME/USDC:USDC", "currency": "USDC", "minNotional": 1200000.0, "maxNotional": 3000000.0, @@ -9030,6 +11478,7 @@ }, { "tier": 6.0, + "symbol": "BOME/USDC:USDC", "currency": "USDC", "minNotional": 3000000.0, "maxNotional": 4000000.0, @@ -9046,6 +11495,7 @@ }, { "tier": 7.0, + "symbol": "BOME/USDC:USDC", "currency": "USDC", "minNotional": 4000000.0, "maxNotional": 6000000.0, @@ -9062,6 +11512,7 @@ }, { "tier": 8.0, + "symbol": "BOME/USDC:USDC", "currency": "USDC", "minNotional": 6000000.0, "maxNotional": 10000000.0, @@ -9080,6 +11531,7 @@ "BOME/USDT:USDT": [ { "tier": 1.0, + "symbol": "BOME/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -9096,6 +11548,7 @@ }, { "tier": 2.0, + "symbol": "BOME/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 60000.0, @@ -9112,6 +11565,7 @@ }, { "tier": 3.0, + "symbol": "BOME/USDT:USDT", "currency": "USDT", "minNotional": 60000.0, "maxNotional": 300000.0, @@ -9128,6 +11582,7 @@ }, { "tier": 4.0, + "symbol": "BOME/USDT:USDT", "currency": "USDT", "minNotional": 300000.0, "maxNotional": 600000.0, @@ -9144,6 +11599,7 @@ }, { "tier": 5.0, + "symbol": "BOME/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, "maxNotional": 3000000.0, @@ -9160,6 +11616,7 @@ }, { "tier": 6.0, + "symbol": "BOME/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 6000000.0, @@ -9176,6 +11633,7 @@ }, { "tier": 7.0, + "symbol": "BOME/USDT:USDT", "currency": "USDT", "minNotional": 6000000.0, "maxNotional": 7500000.0, @@ -9192,6 +11650,7 @@ }, { "tier": 8.0, + "symbol": "BOME/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, "maxNotional": 15000000.0, @@ -9208,6 +11667,7 @@ }, { "tier": 9.0, + "symbol": "BOME/USDT:USDT", "currency": "USDT", "minNotional": 15000000.0, "maxNotional": 30000000.0, @@ -9226,14 +11686,15 @@ "BOND/USDT:USDT": [ { "tier": 1.0, + "symbol": "BOND/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 21.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "21", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.015", @@ -9242,14 +11703,15 @@ }, { "tier": 2.0, + "symbol": "BOND/USDT:USDT", "currency": "USDT", "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", @@ -9258,14 +11720,15 @@ }, { "tier": 3.0, + "symbol": "BOND/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "100000", "notionalFloor": "10000", "maintMarginRatio": "0.05", @@ -9274,6 +11737,7 @@ }, { "tier": 4.0, + "symbol": "BOND/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 200000.0, @@ -9290,6 +11754,7 @@ }, { "tier": 5.0, + "symbol": "BOND/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, @@ -9306,6 +11771,7 @@ }, { "tier": 6.0, + "symbol": "BOND/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -9322,6 +11788,7 @@ }, { "tier": 7.0, + "symbol": "BOND/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -9340,15 +11807,16 @@ "BRETT/USDT:USDT": [ { "tier": 1.0, + "symbol": "BRETT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -9356,136 +11824,145 @@ }, { "tier": 2.0, + "symbol": "BRETT/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, + "minNotional": 10000.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "10000", - "notionalFloor": "5000", + "notionalCap": "20000", + "notionalFloor": "10000", "maintMarginRatio": "0.015", - "cum": "25.0" + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "BRETT/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 30000.0, + "minNotional": 20000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "30000", - "notionalFloor": "10000", + "notionalCap": "100000", + "notionalFloor": "20000", "maintMarginRatio": "0.02", - "cum": "75.0" + "cum": "150.0" } }, { "tier": 4.0, + "symbol": "BRETT/USDT:USDT", "currency": "USDT", - "minNotional": 30000.0, - "maxNotional": 60000.0, + "minNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "60000", - "notionalFloor": "30000", + "notionalCap": "200000", + "notionalFloor": "100000", "maintMarginRatio": "0.025", - "cum": "225.0" + "cum": "650.0" } }, { "tier": 5.0, + "symbol": "BRETT/USDT:USDT", "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 300000.0, + "minNotional": 200000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "300000", - "notionalFloor": "60000", + "notionalCap": "1000000", + "notionalFloor": "200000", "maintMarginRatio": "0.05", - "cum": "1725.0" + "cum": "5650.0" } }, { "tier": 6.0, + "symbol": "BRETT/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "600000", - "notionalFloor": "300000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.1", - "cum": "16725.0" + "cum": "55650.0" } }, { "tier": 7.0, + "symbol": "BRETT/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 750000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "750000", - "notionalFloor": "600000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "31725.0" + "cum": "105650.0" } }, { "tier": 8.0, + "symbol": "BRETT/USDT:USDT", "currency": "USDT", - "minNotional": 750000.0, - "maxNotional": 1500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "1500000", - "notionalFloor": "750000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.25", - "cum": "125475.0" + "cum": "418150.0" } }, { "tier": 9.0, + "symbol": "BRETT/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "500475.0" + "cum": "1668150.0" } } ], "BSV/USDT:USDT": [ { "tier": 1.0, + "symbol": "BSV/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -9502,6 +11979,7 @@ }, { "tier": 2.0, + "symbol": "BSV/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -9518,6 +11996,7 @@ }, { "tier": 3.0, + "symbol": "BSV/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 100000.0, @@ -9534,6 +12013,7 @@ }, { "tier": 4.0, + "symbol": "BSV/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 200000.0, @@ -9550,6 +12030,7 @@ }, { "tier": 5.0, + "symbol": "BSV/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, @@ -9566,6 +12047,7 @@ }, { "tier": 6.0, + "symbol": "BSV/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -9582,6 +12064,7 @@ }, { "tier": 7.0, + "symbol": "BSV/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -9600,6 +12083,7 @@ "BSW/USDT:USDT": [ { "tier": 1.0, + "symbol": "BSW/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -9616,6 +12100,7 @@ }, { "tier": 2.0, + "symbol": "BSW/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -9632,6 +12117,7 @@ }, { "tier": 3.0, + "symbol": "BSW/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 20000.0, @@ -9648,6 +12134,7 @@ }, { "tier": 4.0, + "symbol": "BSW/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 40000.0, @@ -9664,6 +12151,7 @@ }, { "tier": 5.0, + "symbol": "BSW/USDT:USDT", "currency": "USDT", "minNotional": 40000.0, "maxNotional": 200000.0, @@ -9680,6 +12168,7 @@ }, { "tier": 6.0, + "symbol": "BSW/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 400000.0, @@ -9696,6 +12185,7 @@ }, { "tier": 7.0, + "symbol": "BSW/USDT:USDT", "currency": "USDT", "minNotional": 400000.0, "maxNotional": 500000.0, @@ -9712,6 +12202,7 @@ }, { "tier": 8.0, + "symbol": "BSW/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -9728,6 +12219,7 @@ }, { "tier": 9.0, + "symbol": "BSW/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -9746,6 +12238,7 @@ "BTC/USDC:USDC": [ { "tier": 1.0, + "symbol": "BTC/USDC:USDC", "currency": "USDC", "minNotional": 0.0, "maxNotional": 50000.0, @@ -9762,6 +12255,7 @@ }, { "tier": 2.0, + "symbol": "BTC/USDC:USDC", "currency": "USDC", "minNotional": 50000.0, "maxNotional": 500000.0, @@ -9778,6 +12272,7 @@ }, { "tier": 3.0, + "symbol": "BTC/USDC:USDC", "currency": "USDC", "minNotional": 500000.0, "maxNotional": 10000000.0, @@ -9794,6 +12289,7 @@ }, { "tier": 4.0, + "symbol": "BTC/USDC:USDC", "currency": "USDC", "minNotional": 10000000.0, "maxNotional": 80000000.0, @@ -9810,6 +12306,7 @@ }, { "tier": 5.0, + "symbol": "BTC/USDC:USDC", "currency": "USDC", "minNotional": 80000000.0, "maxNotional": 150000000.0, @@ -9826,6 +12323,7 @@ }, { "tier": 6.0, + "symbol": "BTC/USDC:USDC", "currency": "USDC", "minNotional": 150000000.0, "maxNotional": 300000000.0, @@ -9842,6 +12340,7 @@ }, { "tier": 7.0, + "symbol": "BTC/USDC:USDC", "currency": "USDC", "minNotional": 300000000.0, "maxNotional": 450000000.0, @@ -9858,6 +12357,7 @@ }, { "tier": 8.0, + "symbol": "BTC/USDC:USDC", "currency": "USDC", "minNotional": 450000000.0, "maxNotional": 600000000.0, @@ -9874,6 +12374,7 @@ }, { "tier": 9.0, + "symbol": "BTC/USDC:USDC", "currency": "USDC", "minNotional": 600000000.0, "maxNotional": 800000000.0, @@ -9890,6 +12391,7 @@ }, { "tier": 10.0, + "symbol": "BTC/USDC:USDC", "currency": "USDC", "minNotional": 800000000.0, "maxNotional": 1000000000.0, @@ -9908,6 +12410,7 @@ "BTC/USDT:USDT": [ { "tier": 1.0, + "symbol": "BTC/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 50000.0, @@ -9924,6 +12427,7 @@ }, { "tier": 2.0, + "symbol": "BTC/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, "maxNotional": 600000.0, @@ -9940,6 +12444,7 @@ }, { "tier": 3.0, + "symbol": "BTC/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, "maxNotional": 3000000.0, @@ -9956,6 +12461,7 @@ }, { "tier": 4.0, + "symbol": "BTC/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 12000000.0, @@ -9972,6 +12478,7 @@ }, { "tier": 5.0, + "symbol": "BTC/USDT:USDT", "currency": "USDT", "minNotional": 12000000.0, "maxNotional": 70000000.0, @@ -9988,6 +12495,7 @@ }, { "tier": 6.0, + "symbol": "BTC/USDT:USDT", "currency": "USDT", "minNotional": 70000000.0, "maxNotional": 100000000.0, @@ -10004,6 +12512,7 @@ }, { "tier": 7.0, + "symbol": "BTC/USDT:USDT", "currency": "USDT", "minNotional": 100000000.0, "maxNotional": 230000000.0, @@ -10020,6 +12529,7 @@ }, { "tier": 8.0, + "symbol": "BTC/USDT:USDT", "currency": "USDT", "minNotional": 230000000.0, "maxNotional": 480000000.0, @@ -10036,6 +12546,7 @@ }, { "tier": 9.0, + "symbol": "BTC/USDT:USDT", "currency": "USDT", "minNotional": 480000000.0, "maxNotional": 600000000.0, @@ -10052,6 +12563,7 @@ }, { "tier": 10.0, + "symbol": "BTC/USDT:USDT", "currency": "USDT", "minNotional": 600000000.0, "maxNotional": 800000000.0, @@ -10068,6 +12580,7 @@ }, { "tier": 11.0, + "symbol": "BTC/USDT:USDT", "currency": "USDT", "minNotional": 800000000.0, "maxNotional": 1200000000.0, @@ -10084,6 +12597,7 @@ }, { "tier": 12.0, + "symbol": "BTC/USDT:USDT", "currency": "USDT", "minNotional": 1200000000.0, "maxNotional": 1800000000.0, @@ -10102,6 +12616,7 @@ "BTC/USDT:USDT-241227": [ { "tier": 1.0, + "symbol": "BTC/USDT:USDT-241227", "currency": "USDT", "minNotional": 0.0, "maxNotional": 50000.0, @@ -10118,6 +12633,7 @@ }, { "tier": 2.0, + "symbol": "BTC/USDT:USDT-241227", "currency": "USDT", "minNotional": 50000.0, "maxNotional": 375000.0, @@ -10134,6 +12650,7 @@ }, { "tier": 3.0, + "symbol": "BTC/USDT:USDT-241227", "currency": "USDT", "minNotional": 375000.0, "maxNotional": 2000000.0, @@ -10150,6 +12667,7 @@ }, { "tier": 4.0, + "symbol": "BTC/USDT:USDT-241227", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 4000000.0, @@ -10166,6 +12684,7 @@ }, { "tier": 5.0, + "symbol": "BTC/USDT:USDT-241227", "currency": "USDT", "minNotional": 4000000.0, "maxNotional": 10000000.0, @@ -10182,6 +12701,7 @@ }, { "tier": 6.0, + "symbol": "BTC/USDT:USDT-241227", "currency": "USDT", "minNotional": 10000000.0, "maxNotional": 20000000.0, @@ -10198,6 +12718,7 @@ }, { "tier": 7.0, + "symbol": "BTC/USDT:USDT-241227", "currency": "USDT", "minNotional": 20000000.0, "maxNotional": 40000000.0, @@ -10214,6 +12735,7 @@ }, { "tier": 8.0, + "symbol": "BTC/USDT:USDT-241227", "currency": "USDT", "minNotional": 40000000.0, "maxNotional": 120000000.0, @@ -10232,6 +12754,7 @@ "BTC/USDT:USDT-250328": [ { "tier": 1.0, + "symbol": "BTC/USDT:USDT-250328", "currency": "USDT", "minNotional": 0.0, "maxNotional": 50000.0, @@ -10248,6 +12771,7 @@ }, { "tier": 2.0, + "symbol": "BTC/USDT:USDT-250328", "currency": "USDT", "minNotional": 50000.0, "maxNotional": 375000.0, @@ -10264,6 +12788,7 @@ }, { "tier": 3.0, + "symbol": "BTC/USDT:USDT-250328", "currency": "USDT", "minNotional": 375000.0, "maxNotional": 2000000.0, @@ -10280,6 +12805,7 @@ }, { "tier": 4.0, + "symbol": "BTC/USDT:USDT-250328", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 4000000.0, @@ -10296,6 +12822,7 @@ }, { "tier": 5.0, + "symbol": "BTC/USDT:USDT-250328", "currency": "USDT", "minNotional": 4000000.0, "maxNotional": 10000000.0, @@ -10312,6 +12839,7 @@ }, { "tier": 6.0, + "symbol": "BTC/USDT:USDT-250328", "currency": "USDT", "minNotional": 10000000.0, "maxNotional": 20000000.0, @@ -10328,6 +12856,7 @@ }, { "tier": 7.0, + "symbol": "BTC/USDT:USDT-250328", "currency": "USDT", "minNotional": 20000000.0, "maxNotional": 40000000.0, @@ -10344,6 +12873,7 @@ }, { "tier": 8.0, + "symbol": "BTC/USDT:USDT-250328", "currency": "USDT", "minNotional": 40000000.0, "maxNotional": 120000000.0, @@ -10362,6 +12892,7 @@ "BTCDOM/USDT:USDT": [ { "tier": 1.0, + "symbol": "BTCDOM/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -10378,6 +12909,7 @@ }, { "tier": 2.0, + "symbol": "BTCDOM/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -10394,6 +12926,7 @@ }, { "tier": 3.0, + "symbol": "BTCDOM/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 100000.0, @@ -10410,6 +12943,7 @@ }, { "tier": 4.0, + "symbol": "BTCDOM/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 250000.0, @@ -10426,6 +12960,7 @@ }, { "tier": 5.0, + "symbol": "BTCDOM/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, "maxNotional": 1000000.0, @@ -10442,6 +12977,7 @@ }, { "tier": 6.0, + "symbol": "BTCDOM/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 3000000.0, @@ -10460,6 +12996,7 @@ "BTCST/USDT:USDT": [ { "tier": 1.0, + "symbol": "BTCST/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -10476,6 +13013,7 @@ }, { "tier": 2.0, + "symbol": "BTCST/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -10492,6 +13030,7 @@ }, { "tier": 3.0, + "symbol": "BTCST/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 100000.0, @@ -10508,6 +13047,7 @@ }, { "tier": 4.0, + "symbol": "BTCST/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 250000.0, @@ -10524,6 +13064,7 @@ }, { "tier": 5.0, + "symbol": "BTCST/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, "maxNotional": 1000000.0, @@ -10540,6 +13081,7 @@ }, { "tier": 6.0, + "symbol": "BTCST/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 9.223372036854776e+18, @@ -10558,6 +13100,7 @@ "C98/USDT:USDT": [ { "tier": 1.0, + "symbol": "C98/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -10574,6 +13117,7 @@ }, { "tier": 2.0, + "symbol": "C98/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -10590,6 +13134,7 @@ }, { "tier": 3.0, + "symbol": "C98/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 300000.0, @@ -10606,6 +13151,7 @@ }, { "tier": 4.0, + "symbol": "C98/USDT:USDT", "currency": "USDT", "minNotional": 300000.0, "maxNotional": 800000.0, @@ -10622,6 +13168,7 @@ }, { "tier": 5.0, + "symbol": "C98/USDT:USDT", "currency": "USDT", "minNotional": 800000.0, "maxNotional": 1000000.0, @@ -10638,6 +13185,7 @@ }, { "tier": 6.0, + "symbol": "C98/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 3000000.0, @@ -10654,6 +13202,7 @@ }, { "tier": 7.0, + "symbol": "C98/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 5000000.0, @@ -10672,15 +13221,16 @@ "CAKE/USDT:USDT": [ { "tier": 1.0, + "symbol": "CAKE/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -10688,136 +13238,145 @@ }, { "tier": 2.0, + "symbol": "CAKE/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, + "minNotional": 10000.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "10000", - "notionalFloor": "5000", + "notionalCap": "20000", + "notionalFloor": "10000", "maintMarginRatio": "0.015", - "cum": "25.0" + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "CAKE/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 50000.0, + "minNotional": 20000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "50000", - "notionalFloor": "10000", + "notionalCap": "100000", + "notionalFloor": "20000", "maintMarginRatio": "0.02", - "cum": "75.0" + "cum": "150.0" } }, { "tier": 4.0, + "symbol": "CAKE/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, + "minNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "100000", - "notionalFloor": "50000", + "notionalCap": "200000", + "notionalFloor": "100000", "maintMarginRatio": "0.025", - "cum": "325.0" + "cum": "650.0" } }, { "tier": 5.0, + "symbol": "CAKE/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 500000.0, + "minNotional": 200000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "500000", - "notionalFloor": "100000", + "notionalCap": "1000000", + "notionalFloor": "200000", "maintMarginRatio": "0.05", - "cum": "2825.0" + "cum": "5650.0" } }, { "tier": 6.0, + "symbol": "CAKE/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.1", - "cum": "27825.0" + "cum": "55650.0" } }, { "tier": 7.0, + "symbol": "CAKE/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 1250000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "1250000", - "notionalFloor": "1000000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "52825.0" + "cum": "105650.0" } }, { "tier": 8.0, + "symbol": "CAKE/USDT:USDT", "currency": "USDT", - "minNotional": 1250000.0, - "maxNotional": 2500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "2500000", - "notionalFloor": "1250000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.25", - "cum": "209075.0" + "cum": "418150.0" } }, { "tier": 9.0, + "symbol": "CAKE/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "2500000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "834075.0" + "cum": "1668150.0" } } ], "CATI/USDT:USDT": [ { "tier": 1.0, + "symbol": "CATI/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -10834,6 +13393,7 @@ }, { "tier": 2.0, + "symbol": "CATI/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 30000.0, @@ -10850,6 +13410,7 @@ }, { "tier": 3.0, + "symbol": "CATI/USDT:USDT", "currency": "USDT", "minNotional": 30000.0, "maxNotional": 150000.0, @@ -10866,6 +13427,7 @@ }, { "tier": 4.0, + "symbol": "CATI/USDT:USDT", "currency": "USDT", "minNotional": 150000.0, "maxNotional": 300000.0, @@ -10882,6 +13444,7 @@ }, { "tier": 5.0, + "symbol": "CATI/USDT:USDT", "currency": "USDT", "minNotional": 300000.0, "maxNotional": 1500000.0, @@ -10898,6 +13461,7 @@ }, { "tier": 6.0, + "symbol": "CATI/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, "maxNotional": 3000000.0, @@ -10914,6 +13478,7 @@ }, { "tier": 7.0, + "symbol": "CATI/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 3750000.0, @@ -10930,6 +13495,7 @@ }, { "tier": 8.0, + "symbol": "CATI/USDT:USDT", "currency": "USDT", "minNotional": 3750000.0, "maxNotional": 7500000.0, @@ -10946,6 +13512,7 @@ }, { "tier": 9.0, + "symbol": "CATI/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, "maxNotional": 15000000.0, @@ -10964,6 +13531,7 @@ "CELO/USDT:USDT": [ { "tier": 1.0, + "symbol": "CELO/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -10980,6 +13548,7 @@ }, { "tier": 2.0, + "symbol": "CELO/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 16000.0, @@ -10996,6 +13565,7 @@ }, { "tier": 3.0, + "symbol": "CELO/USDT:USDT", "currency": "USDT", "minNotional": 16000.0, "maxNotional": 80000.0, @@ -11012,6 +13582,7 @@ }, { "tier": 4.0, + "symbol": "CELO/USDT:USDT", "currency": "USDT", "minNotional": 80000.0, "maxNotional": 160000.0, @@ -11028,6 +13599,7 @@ }, { "tier": 5.0, + "symbol": "CELO/USDT:USDT", "currency": "USDT", "minNotional": 160000.0, "maxNotional": 800000.0, @@ -11044,6 +13616,7 @@ }, { "tier": 6.0, + "symbol": "CELO/USDT:USDT", "currency": "USDT", "minNotional": 800000.0, "maxNotional": 1600000.0, @@ -11060,6 +13633,7 @@ }, { "tier": 7.0, + "symbol": "CELO/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, "maxNotional": 2000000.0, @@ -11076,6 +13650,7 @@ }, { "tier": 8.0, + "symbol": "CELO/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 4000000.0, @@ -11092,6 +13667,7 @@ }, { "tier": 9.0, + "symbol": "CELO/USDT:USDT", "currency": "USDT", "minNotional": 4000000.0, "maxNotional": 8000000.0, @@ -11110,6 +13686,7 @@ "CELR/USDT:USDT": [ { "tier": 1.0, + "symbol": "CELR/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -11126,6 +13703,7 @@ }, { "tier": 2.0, + "symbol": "CELR/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -11142,6 +13720,7 @@ }, { "tier": 3.0, + "symbol": "CELR/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 600000.0, @@ -11158,6 +13737,7 @@ }, { "tier": 4.0, + "symbol": "CELR/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, "maxNotional": 1600000.0, @@ -11174,6 +13754,7 @@ }, { "tier": 5.0, + "symbol": "CELR/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, "maxNotional": 2000000.0, @@ -11190,6 +13771,7 @@ }, { "tier": 6.0, + "symbol": "CELR/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 6000000.0, @@ -11206,6 +13788,7 @@ }, { "tier": 7.0, + "symbol": "CELR/USDT:USDT", "currency": "USDT", "minNotional": 6000000.0, "maxNotional": 10000000.0, @@ -11221,18 +13804,19 @@ } } ], - "CFX/USDT:USDT": [ + "CETUS/USDT:USDT": [ { "tier": 1.0, + "symbol": "CETUS/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, + "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "10000", + "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -11240,145 +13824,154 @@ }, { "tier": 2.0, + "symbol": "CETUS/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 60000.0, + "minNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "60000", - "notionalFloor": "10000", + "notionalCap": "10000", + "notionalFloor": "5000", "maintMarginRatio": "0.015", - "cum": "50.0" + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "CETUS/USDT:USDT", "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 400000.0, + "minNotional": 10000.0, + "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "400000", - "notionalFloor": "60000", + "notionalCap": "30000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "350.0" + "cum": "75.0" } }, { "tier": 4.0, + "symbol": "CETUS/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 600000.0, + "minNotional": 30000.0, + "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "400000", + "notionalCap": "60000", + "notionalFloor": "30000", "maintMarginRatio": "0.025", - "cum": "2350.0" + "cum": "225.0" } }, { "tier": 5.0, + "symbol": "CETUS/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 3000000.0, + "minNotional": 60000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "3000000", - "notionalFloor": "600000", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.05", - "cum": "17350.0" + "cum": "1725.0" } }, { "tier": 6.0, + "symbol": "CETUS/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "167350.0" + "cum": "16725.0" } }, { "tier": 7.0, + "symbol": "CETUS/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "minNotional": 600000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "7500000", - "notionalFloor": "6000000", + "notionalCap": "750000", + "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "317350.0" + "cum": "31725.0" } }, { "tier": 8.0, + "symbol": "CETUS/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 18000000.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "18000000", - "notionalFloor": "7500000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "1254850.0" + "cum": "125475.0" } }, { "tier": 9.0, + "symbol": "CETUS/USDT:USDT", "currency": "USDT", - "minNotional": 18000000.0, - "maxNotional": 30000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "18000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "5754850.0" + "cum": "500475.0" } } ], - "CHESS/USDT:USDT": [ + "CFX/USDT:USDT": [ { "tier": 1.0, + "symbol": "CFX/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -11386,234 +13979,300 @@ }, { "tier": 2.0, + "symbol": "CFX/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, + "minNotional": 10000.0, + "maxNotional": 60000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "10000", - "notionalFloor": "5000", + "notionalCap": "60000", + "notionalFloor": "10000", "maintMarginRatio": "0.015", - "cum": "25.0" + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "CFX/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, + "minNotional": 60000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "10000", + "notionalCap": "400000", + "notionalFloor": "60000", "maintMarginRatio": "0.02", - "cum": "75.0" + "cum": "350.0" } }, { "tier": 4.0, + "symbol": "CFX/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 40000.0, + "minNotional": 400000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "40000", - "notionalFloor": "20000", + "notionalCap": "600000", + "notionalFloor": "400000", "maintMarginRatio": "0.025", - "cum": "175.0" + "cum": "2350.0" } }, { "tier": 5.0, + "symbol": "CFX/USDT:USDT", "currency": "USDT", - "minNotional": 40000.0, - "maxNotional": 200000.0, + "minNotional": 600000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "40000", + "notionalCap": "3000000", + "notionalFloor": "600000", "maintMarginRatio": "0.05", - "cum": "1175.0" + "cum": "17350.0" } }, { "tier": 6.0, + "symbol": "CFX/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 3000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "6000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.1", - "cum": "11175.0" + "cum": "167350.0" } }, { "tier": 7.0, + "symbol": "CFX/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 6000000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "7500000", + "notionalFloor": "6000000", "maintMarginRatio": "0.125", - "cum": "21175.0" + "cum": "317350.0" } }, { "tier": 8.0, + "symbol": "CFX/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 7500000.0, + "maxNotional": 18000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "18000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.25", - "cum": "83675.0" + "cum": "1254850.0" } }, { "tier": 9.0, + "symbol": "CFX/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 18000000.0, + "maxNotional": 30000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "30000000", + "notionalFloor": "18000000", "maintMarginRatio": "0.5", - "cum": "333675.0" + "cum": "5754850.0" } } ], - "CHR/USDT:USDT": [ + "CGPT/USDT:USDT": [ { "tier": 1.0, + "symbol": "CGPT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "CGPT/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "50", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.015", "cum": "25.0" } }, { "tier": 3.0, + "symbol": "CGPT/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "CGPT/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "CGPT/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "1725.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "CGPT/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "10650.0" + "cum": "16725.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "CGPT/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 600000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "CGPT/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "5", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", - "maintMarginRatio": "0.125", - "cum": "23150.0" + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "125475.0" } }, { - "tier": 6.0, + "tier": 9.0, + "symbol": "CGPT/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 5000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "1000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "398150.0" + "cum": "500475.0" } } ], - "CHZ/USDT:USDT": [ + "CHESS/USDT:USDT": [ { "tier": 1.0, + "symbol": "CHESS/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -11630,15 +14289,16 @@ }, { "tier": 2.0, + "symbol": "CHESS/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 16000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "16000", + "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", "cum": "25.0" @@ -11646,120 +14306,128 @@ }, { "tier": 3.0, + "symbol": "CHESS/USDT:USDT", "currency": "USDT", - "minNotional": 16000.0, - "maxNotional": 80000.0, + "minNotional": 10000.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "80000", - "notionalFloor": "16000", + "notionalCap": "20000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "105.0" + "cum": "75.0" } }, { "tier": 4.0, + "symbol": "CHESS/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 160000.0, + "minNotional": 20000.0, + "maxNotional": 40000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "160000", - "notionalFloor": "80000", + "notionalCap": "40000", + "notionalFloor": "20000", "maintMarginRatio": "0.025", - "cum": "505.0" + "cum": "175.0" } }, { "tier": 5.0, + "symbol": "CHESS/USDT:USDT", "currency": "USDT", - "minNotional": 160000.0, - "maxNotional": 800000.0, + "minNotional": 40000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "800000", - "notionalFloor": "160000", + "notionalCap": "200000", + "notionalFloor": "40000", "maintMarginRatio": "0.05", - "cum": "4505.0" + "cum": "1175.0" } }, { "tier": 6.0, + "symbol": "CHESS/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 1600000.0, + "minNotional": 200000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "1600000", - "notionalFloor": "800000", + "notionalCap": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "44505.0" + "cum": "11175.0" } }, { "tier": 7.0, + "symbol": "CHESS/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 2000000.0, + "minNotional": 400000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1600000", + "notionalCap": "500000", + "notionalFloor": "400000", "maintMarginRatio": "0.125", - "cum": "84505.0" + "cum": "21175.0" } }, { "tier": 8.0, + "symbol": "CHESS/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "4000000", - "notionalFloor": "2000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "334505.0" + "cum": "83675.0" } }, { "tier": 9.0, + "symbol": "CHESS/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "8000000", - "notionalFloor": "4000000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "1334505.0" + "cum": "333675.0" } } ], - "CKB/USDT:USDT": [ + "CHILLGUY/USDT:USDT": [ { "tier": 1.0, + "symbol": "CHILLGUY/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -11776,6 +14444,7 @@ }, { "tier": 2.0, + "symbol": "CHILLGUY/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 20000.0, @@ -11792,6 +14461,7 @@ }, { "tier": 3.0, + "symbol": "CHILLGUY/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 100000.0, @@ -11808,6 +14478,7 @@ }, { "tier": 4.0, + "symbol": "CHILLGUY/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 200000.0, @@ -11824,6 +14495,7 @@ }, { "tier": 5.0, + "symbol": "CHILLGUY/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 1000000.0, @@ -11840,6 +14512,7 @@ }, { "tier": 6.0, + "symbol": "CHILLGUY/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -11856,6 +14529,7 @@ }, { "tier": 7.0, + "symbol": "CHILLGUY/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 2500000.0, @@ -11872,6 +14546,7 @@ }, { "tier": 8.0, + "symbol": "CHILLGUY/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, "maxNotional": 5000000.0, @@ -11888,6 +14563,7 @@ }, { "tier": 9.0, + "symbol": "CHILLGUY/USDT:USDT", "currency": "USDT", "minNotional": 5000000.0, "maxNotional": 10000000.0, @@ -11903,131 +14579,173 @@ } } ], - "COMBO/USDT:USDT": [ + "CHR/USDT:USDT": [ { "tier": 1.0, + "symbol": "CHR/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "20", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "CHR/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "15", - "notionalCap": "25000", + "initialLeverage": "50", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.015", "cum": "25.0" } }, { "tier": 3.0, + "symbol": "CHR/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "CHR/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "325.0" + } + }, + { + "tier": 5.0, + "symbol": "CHR/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "2825.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "CHR/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "10650.0" + "cum": "27825.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "CHR/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "1250000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "23150.0" + "cum": "52825.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "CHR/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "minNotional": 1250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalCap": "2500000", + "notionalFloor": "1250000", "maintMarginRatio": "0.25", - "cum": "148150.0" + "cum": "209075.0" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "CHR/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, + "minNotional": 2500000.0, "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", "notionalCap": "5000000", - "notionalFloor": "3000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "898150.0" + "cum": "834075.0" } } ], - "COMP/USDT:USDT": [ + "CHZ/USDT:USDT": [ { "tier": 1.0, + "symbol": "CHZ/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -12036,113 +14754,154 @@ }, { "tier": 2.0, + "symbol": "CHZ/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 16000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "50000", + "initialLeverage": "50", + "notionalCap": "16000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.015", + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "CHZ/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 400000.0, + "minNotional": 16000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "80000", + "notionalFloor": "16000", + "maintMarginRatio": "0.02", + "cum": "105.0" + } + }, + { + "tier": 4.0, + "symbol": "CHZ/USDT:USDT", + "currency": "USDT", + "minNotional": 80000.0, + "maxNotional": 160000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "160000", + "notionalFloor": "80000", + "maintMarginRatio": "0.025", + "cum": "505.0" + } + }, + { + "tier": 5.0, + "symbol": "CHZ/USDT:USDT", + "currency": "USDT", + "minNotional": 160000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "400000", - "notionalFloor": "50000", + "notionalCap": "800000", + "notionalFloor": "160000", "maintMarginRatio": "0.05", - "cum": "1325.0" + "cum": "4505.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "CHZ/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 1000000.0, + "minNotional": 800000.0, + "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "1000000", - "notionalFloor": "400000", + "notionalCap": "1600000", + "notionalFloor": "800000", "maintMarginRatio": "0.1", - "cum": "21325.0" + "cum": "44505.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "CHZ/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 1200000.0, + "minNotional": 1600000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "1200000", - "notionalFloor": "1000000", + "notionalCap": "2000000", + "notionalFloor": "1600000", "maintMarginRatio": "0.125", - "cum": "46325.0" + "cum": "84505.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "CHZ/USDT:USDT", "currency": "USDT", - "minNotional": 1200000.0, - "maxNotional": 2000000.0, + "minNotional": 2000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "2000000", - "notionalFloor": "1200000", + "notionalCap": "4000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.25", - "cum": "196325.0" + "cum": "334505.0" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "CHZ/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 5000000.0, + "minNotional": 4000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "2000000", + "notionalCap": "8000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "696325.0" + "cum": "1334505.0" } } ], - "COS/USDT:USDT": [ + "CKB/USDT:USDT": [ { "tier": 1.0, + "symbol": "CKB/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -12150,275 +14909,275 @@ }, { "tier": 2.0, + "symbol": "CKB/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, + "minNotional": 10000.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "10000", - "notionalFloor": "5000", + "notionalCap": "20000", + "notionalFloor": "10000", "maintMarginRatio": "0.015", - "cum": "25.0" + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "CKB/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, + "minNotional": 20000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "10000", + "notionalCap": "100000", + "notionalFloor": "20000", "maintMarginRatio": "0.02", - "cum": "75.0" + "cum": "150.0" } }, { "tier": 4.0, + "symbol": "CKB/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 40000.0, + "minNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "40000", - "notionalFloor": "20000", + "notionalCap": "200000", + "notionalFloor": "100000", "maintMarginRatio": "0.025", - "cum": "175.0" + "cum": "650.0" } }, { "tier": 5.0, + "symbol": "CKB/USDT:USDT", "currency": "USDT", - "minNotional": 40000.0, - "maxNotional": 200000.0, + "minNotional": 200000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "40000", + "notionalCap": "1000000", + "notionalFloor": "200000", "maintMarginRatio": "0.05", - "cum": "1175.0" + "cum": "5650.0" } }, { "tier": 6.0, + "symbol": "CKB/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.1", - "cum": "11175.0" + "cum": "55650.0" } }, { "tier": 7.0, + "symbol": "CKB/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "21175.0" + "cum": "105650.0" } }, { "tier": 8.0, + "symbol": "CKB/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.25", - "cum": "83675.0" + "cum": "418150.0" } }, { "tier": 9.0, + "symbol": "CKB/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "333675.0" + "cum": "1668150.0" } } ], - "COTI/USDT:USDT": [ + "COMBO/USDT:USDT": [ { "tier": 1.0, + "symbol": "COMBO/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "COMBO/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, - "info": { - "bracket": "2", - "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 20000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 15.0, "info": { - "bracket": "3", - "initialLeverage": "20", + "bracket": "2", + "initialLeverage": "15", "notionalCap": "25000", - "notionalFloor": "20000", + "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "125.0" + "cum": "25.0" } }, { - "tier": 4.0, + "tier": 3.0, + "symbol": "COMBO/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "10", "notionalCap": "200000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "750.0" + "cum": "650.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "COMBO/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, - "maxNotional": 400000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "5", - "notionalCap": "400000", + "notionalCap": "500000", "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "10750.0" + "cum": "10650.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "COMBO/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "20750.0" + "cum": "23150.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "COMBO/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 1000000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "3000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.25", - "cum": "83250.0" + "cum": "148150.0" } }, { - "tier": 8.0, + "tier": 7.0, + "symbol": "COMBO/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "333250.0" + "cum": "898150.0" } } ], - "CRV/USDC:USDC": [ + "COMP/USDT:USDT": [ { "tier": 1.0, - "currency": "USDC", + "symbol": "COMP/USDT:USDT", + "currency": "USDT", "minNotional": 0.0, - "maxNotional": 50000.0, + "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "25", - "notionalCap": "50000", + "initialLeverage": "75", + "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -12426,748 +15185,894 @@ }, { "tier": 2.0, - "currency": "USDC", + "symbol": "COMP/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "COMP/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "COMP/USDT:USDT", + "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 150000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "2", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "150000", + "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "750.0" + "cum": "325.0" } }, { - "tier": 3.0, - "currency": "USDC", - "minNotional": 150000.0, - "maxNotional": 250000.0, + "tier": 5.0, + "symbol": "COMP/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "250000", - "notionalFloor": "150000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.05", - "cum": "4500.0" + "cum": "2825.0" } }, { - "tier": 4.0, - "currency": "USDC", - "minNotional": 250000.0, - "maxNotional": 500000.0, + "tier": 6.0, + "symbol": "COMP/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "250000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "17000.0" + "cum": "27825.0" } }, { - "tier": 5.0, - "currency": "USDC", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "tier": 7.0, + "symbol": "COMP/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "1250000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "29500.0" + "cum": "52825.0" } }, { - "tier": 6.0, - "currency": "USDC", - "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "tier": 8.0, + "symbol": "COMP/USDT:USDT", + "currency": "USDT", + "minNotional": 1250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalCap": "2500000", + "notionalFloor": "1250000", "maintMarginRatio": "0.25", - "cum": "154500.0" + "cum": "209075.0" } }, { - "tier": 7.0, - "currency": "USDC", - "minNotional": 3000000.0, + "tier": 9.0, + "symbol": "COMP/USDT:USDT", + "currency": "USDT", + "minNotional": 2500000.0, "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", "notionalCap": "5000000", - "notionalFloor": "3000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "904500.0" + "cum": "834075.0" } } ], - "CRV/USDT:USDT": [ + "COS/USDT:USDT": [ { "tier": 1.0, + "symbol": "COS/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.0065, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "10000", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.0065", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "COS/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.01, + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "50000", - "notionalFloor": "10000", - "maintMarginRatio": "0.01", - "cum": "35.0" + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "COS/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 200000.0, + "minNotional": 10000.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "200000", - "notionalFloor": "50000", + "notionalCap": "20000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "535.0" + "cum": "75.0" } }, { "tier": 4.0, + "symbol": "COS/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 20000.0, + "maxNotional": 40000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "40000", + "notionalFloor": "20000", "maintMarginRatio": "0.025", - "cum": "1535.0" + "cum": "175.0" } }, { "tier": 5.0, + "symbol": "COS/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 2000000.0, + "minNotional": 40000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "2000000", - "notionalFloor": "400000", + "notionalCap": "200000", + "notionalFloor": "40000", "maintMarginRatio": "0.05", - "cum": "11535.0" + "cum": "1175.0" } }, { "tier": 6.0, + "symbol": "COS/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, + "minNotional": 200000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "4000000", - "notionalFloor": "2000000", + "notionalCap": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "111535.0" + "cum": "11175.0" } }, { "tier": 7.0, + "symbol": "COS/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 5000000.0, + "minNotional": 400000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "5000000", - "notionalFloor": "4000000", + "notionalCap": "500000", + "notionalFloor": "400000", "maintMarginRatio": "0.125", - "cum": "211535.0" + "cum": "21175.0" } }, { "tier": 8.0, + "symbol": "COS/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "836535.0" + "cum": "83675.0" } }, { "tier": 9.0, + "symbol": "COS/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "3336535.0" + "cum": "333675.0" } } ], - "CTK/USDT:USDT": [ + "COTI/USDT:USDT": [ { "tier": 1.0, + "symbol": "COTI/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 11.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "11", + "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "COTI/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "2", - "initialLeverage": "10", - "notionalCap": "25000", + "initialLeverage": "25", + "notionalCap": "20000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.02", "cum": "25.0" } }, { "tier": 3.0, + "symbol": "COTI/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "20000", + "maintMarginRatio": "0.025", + "cum": "125.0" + } + }, + { + "tier": 4.0, + "symbol": "COTI/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "maxLeverage": 10.0, "info": { - "bracket": "3", - "initialLeverage": "8", - "notionalCap": "100000", + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "200000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "750.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "COTI/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 250000.0, + "minNotional": 200000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "5", - "notionalCap": "250000", - "notionalFloor": "100000", + "notionalCap": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "5650.0" + "cum": "10750.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "COTI/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 1000000.0, + "minNotional": 400000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "400000", + "maintMarginRatio": "0.125", + "cum": "20750.0" + } + }, + { + "tier": 7.0, + "symbol": "COTI/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "2", "notionalCap": "1000000", - "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "11900.0" + "notionalFloor": "500000", + "maintMarginRatio": "0.25", + "cum": "83250.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "COTI/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 1500000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "1500000", + "notionalCap": "2000000", "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "386900.0" + "cum": "333250.0" } } ], - "CTSI/USDT:USDT": [ + "COW/USDT:USDT": [ { "tier": 1.0, + "symbol": "COW/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "COW/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 16000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "50", + "notionalCap": "16000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.015", "cum": "25.0" } }, { "tier": 3.0, + "symbol": "COW/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 300000.0, + "minNotional": 16000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "80000", + "notionalFloor": "16000", + "maintMarginRatio": "0.02", + "cum": "105.0" + } + }, + { + "tier": 4.0, + "symbol": "COW/USDT:USDT", + "currency": "USDT", + "minNotional": 80000.0, + "maxNotional": 160000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "160000", + "notionalFloor": "80000", + "maintMarginRatio": "0.025", + "cum": "505.0" + } + }, + { + "tier": 5.0, + "symbol": "COW/USDT:USDT", + "currency": "USDT", + "minNotional": 160000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "300000", - "notionalFloor": "25000", + "notionalCap": "800000", + "notionalFloor": "160000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "4505.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "COW/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 800000.0, + "minNotional": 800000.0, + "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "800000", - "notionalFloor": "300000", + "notionalCap": "1600000", + "notionalFloor": "800000", "maintMarginRatio": "0.1", - "cum": "15650.0" + "cum": "44505.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "COW/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 1000000.0, + "minNotional": 1600000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "800000", + "notionalCap": "2000000", + "notionalFloor": "1600000", "maintMarginRatio": "0.125", - "cum": "35650.0" + "cum": "84505.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "COW/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "minNotional": 2000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalCap": "4000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.25", - "cum": "160650.0" + "cum": "334505.0" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "COW/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 5000000.0, + "minNotional": 4000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "3000000", + "notionalCap": "8000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "910650.0" + "cum": "1334505.0" } } ], - "CVC/USDT:USDT": [ + "CRV/USDC:USDC": [ { "tier": 1.0, - "currency": "USDT", + "symbol": "CRV/USDC:USDC", + "currency": "USDC", "minNotional": 0.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "10", - "notionalCap": "25000", + "initialLeverage": "25", + "notionalCap": "50000", "notionalFloor": "0", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, - "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "symbol": "CRV/USDC:USDC", + "currency": "USDC", + "minNotional": 50000.0, + "maxNotional": 150000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "8", - "notionalCap": "100000", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "625.0" + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "750.0" } }, { "tier": 3.0, - "currency": "USDT", - "minNotional": 100000.0, + "symbol": "CRV/USDC:USDC", + "currency": "USDC", + "minNotional": 150000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "5", + "initialLeverage": "10", "notionalCap": "250000", - "notionalFloor": "100000", - "maintMarginRatio": "0.1", - "cum": "5625.0" + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4500.0" } }, { "tier": 4.0, - "currency": "USDT", + "symbol": "CRV/USDC:USDC", + "currency": "USDC", "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "17000.0" + } + }, + { + "tier": 5.0, + "symbol": "CRV/USDC:USDC", + "currency": "USDC", + "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 2.0, + "maxLeverage": 4.0, "info": { - "bracket": "4", - "initialLeverage": "2", + "bracket": "5", + "initialLeverage": "4", "notionalCap": "1000000", - "notionalFloor": "250000", + "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "11875.0" + "cum": "29500.0" } }, { - "tier": 5.0, - "currency": "USDT", + "tier": 6.0, + "symbol": "CRV/USDC:USDC", + "currency": "USDC", "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "154500.0" + } + }, + { + "tier": 7.0, + "symbol": "CRV/USDC:USDC", + "currency": "USDC", + "minNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "386875.0" + "cum": "904500.0" } } ], - "CVX/USDT:USDT": [ + "CRV/USDT:USDT": [ { "tier": 1.0, + "symbol": "CRV/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.0065, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.0065", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "CRV/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "10", - "notionalCap": "100000", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "625.0" + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "35.0" } }, { "tier": 3.0, + "symbol": "CRV/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 50000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 40.0, "info": { "bracket": "3", - "initialLeverage": "5", - "notionalCap": "250000", - "notionalFloor": "100000", - "maintMarginRatio": "0.1", - "cum": "5625.0" + "initialLeverage": "40", + "notionalCap": "80000", + "notionalFloor": "50000", + "maintMarginRatio": "0.015", + "cum": "285.0" } }, { "tier": 4.0, + "symbol": "CRV/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 2.0, + "minNotional": 80000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "4", - "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "11875.0" + "initialLeverage": "25", + "notionalCap": "300000", + "notionalFloor": "80000", + "maintMarginRatio": "0.02", + "cum": "685.0" } }, { "tier": 5.0, + "symbol": "CRV/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, - "maintenanceMarginRate": 0.5, - "maxLeverage": 1.0, - "info": { - "bracket": "5", - "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", - "maintMarginRatio": "0.5", - "cum": "386875.0" - } - } - ], - "CYBER/USDT:USDT": [ - { - "tier": 1.0, - "currency": "USDT", - "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "1", + "bracket": "5", "initialLeverage": "20", - "notionalCap": "5000", - "notionalFloor": "0", - "maintMarginRatio": "0.02", - "cum": "0.0" - } - }, - { - "tier": 2.0, - "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, - "info": { - "bracket": "2", - "initialLeverage": "15", - "notionalCap": "25000", - "notionalFloor": "5000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.025", - "cum": "25.0" + "cum": "2185.0" } }, { - "tier": 3.0, + "tier": 6.0, + "symbol": "CRV/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 600000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "6", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "3000000", + "notionalFloor": "600000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "17185.0" } }, { - "tier": 4.0, + "tier": 7.0, + "symbol": "CRV/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 3000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "7", "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "6000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.1", - "cum": "10650.0" + "cum": "167185.0" } }, { - "tier": 5.0, + "tier": 8.0, + "symbol": "CRV/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 6000000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "8", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "7500000", + "notionalFloor": "6000000", "maintMarginRatio": "0.125", - "cum": "23150.0" + "cum": "317185.0" } }, { - "tier": 6.0, + "tier": 9.0, + "symbol": "CRV/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "minNotional": 7500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "9", "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalCap": "15000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.25", - "cum": "148150.0" + "cum": "1254685.0" } }, { - "tier": 7.0, + "tier": 10.0, + "symbol": "CRV/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 5000000.0, + "minNotional": 15000000.0, + "maxNotional": 30000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "3000000", + "notionalCap": "30000000", + "notionalFloor": "15000000", "maintMarginRatio": "0.5", - "cum": "898150.0" + "cum": "5004685.0" } } ], - "DAR/USDT:USDT": [ + "CTK/USDT:USDT": [ { "tier": 1.0, + "symbol": "CTK/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 11.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "11", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -13176,14 +16081,15 @@ }, { "tier": 2.0, + "symbol": "CTK/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -13192,15 +16098,16 @@ }, { "tier": 3.0, + "symbol": "CTK/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 600000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "600000", + "initialLeverage": "8", + "notionalCap": "100000", "notionalFloor": "25000", "maintMarginRatio": "0.05", "cum": "650.0" @@ -13208,422 +16115,397 @@ }, { "tier": 4.0, + "symbol": "CTK/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 1600000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "4", "initialLeverage": "5", - "notionalCap": "1600000", - "notionalFloor": "600000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1", - "cum": "30650.0" + "cum": "5650.0" } }, { "tier": 5.0, + "symbol": "CTK/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 2000000.0, + "minNotional": 250000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1600000", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", "maintMarginRatio": "0.125", - "cum": "70650.0" + "cum": "11900.0" } }, { "tier": 6.0, + "symbol": "CTK/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 6000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "6", - "initialLeverage": "2", - "notionalCap": "6000000", - "notionalFloor": "2000000", - "maintMarginRatio": "0.25", - "cum": "320650.0" - } - }, - { - "tier": 7.0, - "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 10000000.0, + "minNotional": 1000000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalCap": "1500000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "1820650.0" + "cum": "386900.0" } } ], - "DASH/USDT:USDT": [ + "CTSI/USDT:USDT": [ { "tier": 1.0, + "symbol": "CTSI/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "CTSI/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "20000", + "initialLeverage": "50", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.015", "cum": "25.0" } }, { "tier": 3.0, + "symbol": "CTSI/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 25000.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "CTSI/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "20000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "125.0" + "cum": "325.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "CTSI/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.05", - "cum": "750.0" + "cum": "2825.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "CTSI/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "10750.0" + "cum": "27825.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "CTSI/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "1250000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "20750.0" + "cum": "52825.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "CTSI/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 1250000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "3000000", + "notionalFloor": "1250000", "maintMarginRatio": "0.25", - "cum": "83250.0" + "cum": "209075.0" } }, { - "tier": 8.0, + "tier": 9.0, + "symbol": "CTSI/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "333250.0" + "cum": "959075.0" } } ], - "DEFI/USDT:USDT": [ + "CVC/USDT:USDT": [ { "tier": 1.0, + "symbol": "CVC/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 20.0, - "info": { - "bracket": "1", - "initialLeverage": "20", - "notionalCap": "5000", - "notionalFloor": "0", - "maintMarginRatio": "0.01", - "cum": "0.0" - } - }, - { - "tier": 2.0, - "currency": "USDT", - "minNotional": 5000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 10.0, "info": { - "bracket": "2", + "bracket": "1", "initialLeverage": "10", "notionalCap": "25000", - "notionalFloor": "5000", + "notionalFloor": "0", "maintMarginRatio": "0.025", - "cum": "75.0" + "cum": "0.0" } }, { - "tier": 3.0, + "tier": 2.0, + "symbol": "CVC/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 8.0, "info": { - "bracket": "3", + "bracket": "2", "initialLeverage": "8", "notionalCap": "100000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "700.0" + "cum": "625.0" } }, { - "tier": 4.0, + "tier": 3.0, + "symbol": "CVC/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "5", "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1", - "cum": "5700.0" + "cum": "5625.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "CVC/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 2.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "2", "notionalCap": "1000000", "notionalFloor": "250000", "maintMarginRatio": "0.125", - "cum": "11950.0" + "cum": "11875.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "CVC/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "1", - "notionalCap": "3000000", + "notionalCap": "2000000", "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "386950.0" + "cum": "386875.0" } } ], - "DENT/USDT:USDT": [ + "CVX/USDT:USDT": [ { "tier": 1.0, + "symbol": "CVX/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, - "info": { - "bracket": "1", - "initialLeverage": "25", - "notionalCap": "5000", - "notionalFloor": "0", - "maintMarginRatio": "0.02", - "cum": "0.0" - } - }, - { - "tier": 2.0, - "currency": "USDT", - "minNotional": 5000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "2", + "bracket": "1", "initialLeverage": "20", "notionalCap": "25000", - "notionalFloor": "5000", + "notionalFloor": "0", "maintMarginRatio": "0.025", - "cum": "25.0" + "cum": "0.0" } }, { - "tier": 3.0, + "tier": 2.0, + "symbol": "CVX/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 300000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "2", "initialLeverage": "10", - "notionalCap": "300000", + "notionalCap": "100000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "625.0" } }, { - "tier": 4.0, + "tier": 3.0, + "symbol": "CVX/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 800000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "5", - "notionalCap": "800000", - "notionalFloor": "300000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1", - "cum": "15650.0" + "cum": "5625.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "CVX/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, + "minNotional": 250000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 2.0, "info": { - "bracket": "5", - "initialLeverage": "4", + "bracket": "4", + "initialLeverage": "2", "notionalCap": "1000000", - "notionalFloor": "800000", + "notionalFloor": "250000", "maintMarginRatio": "0.125", - "cum": "35650.0" + "cum": "11875.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "CVX/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 3000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "6", - "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "1000000", - "maintMarginRatio": "0.25", - "cum": "160650.0" - } - }, - { - "tier": 7.0, - "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 5000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "3000000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "910650.0" + "cum": "386875.0" } } ], - "DGB/USDT:USDT": [ + "CYBER/USDT:USDT": [ { "tier": 1.0, + "symbol": "CYBER/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 11.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "11", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -13632,14 +16514,15 @@ }, { "tier": 2.0, + "symbol": "CYBER/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "10", + "initialLeverage": "15", "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -13648,15 +16531,16 @@ }, { "tier": 3.0, + "symbol": "CYBER/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "8", - "notionalCap": "100000", + "initialLeverage": "10", + "notionalCap": "200000", "notionalFloor": "25000", "maintMarginRatio": "0.05", "cum": "650.0" @@ -13664,64 +16548,85 @@ }, { "tier": 4.0, + "symbol": "CYBER/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 250000.0, + "minNotional": 200000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "4", "initialLeverage": "5", - "notionalCap": "250000", - "notionalFloor": "100000", + "notionalCap": "500000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "5650.0" + "cum": "10650.0" } }, { "tier": 5.0, + "symbol": "CYBER/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, + "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 2.0, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "2", + "initialLeverage": "4", "notionalCap": "1000000", - "notionalFloor": "250000", + "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "11900.0" + "cum": "23150.0" } }, { "tier": 6.0, + "symbol": "CYBER/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "148150.0" + } + }, + { + "tier": 7.0, + "symbol": "CYBER/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "1500000", - "notionalFloor": "1000000", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "386900.0" + "cum": "898150.0" } } ], - "DIA/USDT:USDT": [ + "DAR/USDT:USDT": [ { "tier": 1.0, + "symbol": "DAR/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "50", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -13730,14 +16635,15 @@ }, { "tier": 2.0, + "symbol": "DAR/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 25.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "25", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -13746,14 +16652,15 @@ }, { "tier": 3.0, + "symbol": "DAR/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 20.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "100000", "notionalFloor": "20000", "maintMarginRatio": "0.02", @@ -13762,14 +16669,15 @@ }, { "tier": 4.0, + "symbol": "DAR/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 15.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "15", "notionalCap": "200000", "notionalFloor": "100000", "maintMarginRatio": "0.025", @@ -13778,6 +16686,7 @@ }, { "tier": 5.0, + "symbol": "DAR/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 1000000.0, @@ -13794,15 +16703,16 @@ }, { "tier": 6.0, + "symbol": "DAR/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "2000000", + "notionalCap": "1500000", "notionalFloor": "1000000", "maintMarginRatio": "0.1", "cum": "55650.0" @@ -13810,503 +16720,483 @@ }, { "tier": 7.0, + "symbol": "DAR/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 2500000.0, + "minNotional": 1500000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "2500000", - "notionalFloor": "2000000", + "notionalCap": "2000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.125", - "cum": "105650.0" + "cum": "93150.0" } }, { "tier": 8.0, + "symbol": "DAR/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "5000000", - "notionalFloor": "2500000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.25", - "cum": "418150.0" + "cum": "343150.0" } }, { "tier": 9.0, + "symbol": "DAR/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 2500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "3000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1668150.0" + "cum": "968150.0" } } ], - "DODOX/USDT:USDT": [ + "DASH/USDT:USDT": [ { "tier": 1.0, + "symbol": "DASH/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "20", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "DASH/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "15", - "notionalCap": "25000", + "initialLeverage": "50", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.015", "cum": "25.0" } }, { "tier": 3.0, + "symbol": "DASH/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "650.0" + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" } }, { "tier": 4.0, + "symbol": "DASH/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", - "maintMarginRatio": "0.1", - "cum": "10650.0" + "initialLeverage": "20", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "325.0" } }, { "tier": 5.0, + "symbol": "DASH/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 100000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "500000", - "maintMarginRatio": "0.125", - "cum": "23150.0" + "initialLeverage": "10", + "notionalCap": "500000", + "notionalFloor": "100000", + "maintMarginRatio": "0.05", + "cum": "2825.0" } }, { "tier": 6.0, + "symbol": "DASH/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 3000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "6", - "initialLeverage": "2", - "notionalCap": "3000000", + "initialLeverage": "5", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1", + "cum": "27825.0" + } + }, + { + "tier": 7.0, + "symbol": "DASH/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 1250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "1250000", "notionalFloor": "1000000", + "maintMarginRatio": "0.125", + "cum": "52825.0" + } + }, + { + "tier": 8.0, + "symbol": "DASH/USDT:USDT", + "currency": "USDT", + "minNotional": 1250000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "1250000", "maintMarginRatio": "0.25", - "cum": "148150.0" + "cum": "209075.0" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "DASH/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, + "minNotional": 2500000.0, "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", "notionalCap": "5000000", - "notionalFloor": "3000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "898150.0" + "cum": "834075.0" } } ], - "DOGE/USDC:USDC": [ + "DEFI/USDT:USDT": [ { "tier": 1.0, - "currency": "USDC", + "symbol": "DEFI/USDT:USDT", + "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.005, - "maxLeverage": 75.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.005", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, - "currency": "USDC", + "symbol": "DEFI/USDT:USDT", + "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.006, - "maxLeverage": 50.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", - "notionalCap": "10000", + "initialLeverage": "10", + "notionalCap": "25000", "notionalFloor": "5000", - "maintMarginRatio": "0.006", - "cum": "5.0" - } - }, - { - "tier": 3.0, - "currency": "USDC", - "minNotional": 10000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.007, - "maxLeverage": 40.0, - "info": { - "bracket": "3", - "initialLeverage": "40", - "notionalCap": "50000", - "notionalFloor": "10000", - "maintMarginRatio": "0.007", - "cum": "15.0" - } - }, - { - "tier": 4.0, - "currency": "USDC", - "minNotional": 50000.0, - "maxNotional": 750000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, - "info": { - "bracket": "4", - "initialLeverage": "25", - "notionalCap": "750000", - "notionalFloor": "50000", - "maintMarginRatio": "0.01", - "cum": "165.0" - } - }, - { - "tier": 5.0, - "currency": "USDC", - "minNotional": 750000.0, - "maxNotional": 1100000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, - "info": { - "bracket": "5", - "initialLeverage": "20", - "notionalCap": "1100000", - "notionalFloor": "750000", "maintMarginRatio": "0.025", - "cum": "11415.0" + "cum": "75.0" } }, { - "tier": 6.0, - "currency": "USDC", - "minNotional": 1100000.0, - "maxNotional": 2200000.0, + "tier": 3.0, + "symbol": "DEFI/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { - "bracket": "6", - "initialLeverage": "10", - "notionalCap": "2200000", - "notionalFloor": "1100000", + "bracket": "3", + "initialLeverage": "8", + "notionalCap": "100000", + "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "38915.0" + "cum": "700.0" } }, { - "tier": 7.0, - "currency": "USDC", - "minNotional": 2200000.0, - "maxNotional": 5600000.0, + "tier": 4.0, + "symbol": "DEFI/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "7", + "bracket": "4", "initialLeverage": "5", - "notionalCap": "5600000", - "notionalFloor": "2200000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1", - "cum": "148915.0" + "cum": "5700.0" } }, { - "tier": 8.0, - "currency": "USDC", - "minNotional": 5600000.0, - "maxNotional": 7000000.0, + "tier": 5.0, + "symbol": "DEFI/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "8", - "initialLeverage": "4", - "notionalCap": "7000000", - "notionalFloor": "5600000", - "maintMarginRatio": "0.125", - "cum": "288915.0" - } - }, - { - "tier": 9.0, - "currency": "USDC", - "minNotional": 7000000.0, - "maxNotional": 18000000.0, - "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "5", "initialLeverage": "2", - "notionalCap": "18000000", - "notionalFloor": "7000000", - "maintMarginRatio": "0.25", - "cum": "1163915.0" + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11950.0" } }, { - "tier": 10.0, - "currency": "USDC", - "minNotional": 18000000.0, - "maxNotional": 30000000.0, + "tier": 6.0, + "symbol": "DEFI/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "18000000", + "notionalCap": "3000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "5663915.0" + "cum": "386950.0" } } ], - "DOGE/USDT:USDT": [ + "DEGEN/USDT:USDT": [ { "tier": 1.0, + "symbol": "DEGEN/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.005, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "10000", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.005", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "DEGEN/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.007, + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "50000", - "notionalFloor": "10000", - "maintMarginRatio": "0.007", - "cum": "20.0" + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "DEGEN/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 750000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 40.0, - "info": { - "bracket": "3", - "initialLeverage": "40", - "notionalCap": "750000", - "notionalFloor": "50000", - "maintMarginRatio": "0.01", - "cum": "170.0" - } - }, - { - "tier": 4.0, - "currency": "USDT", - "minNotional": 750000.0, - "maxNotional": 800000.0, + "minNotional": 10000.0, + "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "25", - "notionalCap": "800000", - "notionalFloor": "750000", + "notionalCap": "30000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "7670.0" + "cum": "75.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "DEGEN/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 1600000.0, + "minNotional": 30000.0, + "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "1600000", - "notionalFloor": "800000", + "notionalCap": "60000", + "notionalFloor": "30000", "maintMarginRatio": "0.025", - "cum": "11670.0" + "cum": "225.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "DEGEN/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 8000000.0, + "minNotional": 60000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "8000000", - "notionalFloor": "1600000", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.05", - "cum": "51670.0" + "cum": "1725.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "DEGEN/USDT:USDT", "currency": "USDT", - "minNotional": 8000000.0, - "maxNotional": 16000000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "16000000", - "notionalFloor": "8000000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "451670.0" + "cum": "16725.0" } }, { - "tier": 8.0, + "tier": 7.0, + "symbol": "DEGEN/USDT:USDT", "currency": "USDT", - "minNotional": 16000000.0, - "maxNotional": 20000000.0, + "minNotional": 600000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "20000000", - "notionalFloor": "16000000", + "notionalCap": "750000", + "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "851670.0" + "cum": "31725.0" } }, { - "tier": 9.0, + "tier": 8.0, + "symbol": "DEGEN/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 40000000.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "40000000", - "notionalFloor": "20000000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "3351670.0" + "cum": "125475.0" } }, { - "tier": 10.0, + "tier": 9.0, + "symbol": "DEGEN/USDT:USDT", "currency": "USDT", - "minNotional": 40000000.0, - "maxNotional": 80000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "80000000", - "notionalFloor": "40000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "13351670.0" + "cum": "500475.0" } } ], - "DOGS/USDT:USDT": [ + "DEGO/USDT:USDT": [ { "tier": 1.0, + "symbol": "DEGO/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, + "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "10000", + "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -14314,306 +17204,429 @@ }, { "tier": 2.0, + "symbol": "DEGO/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 60000.0, + "minNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "60000", - "notionalFloor": "10000", + "notionalCap": "10000", + "notionalFloor": "5000", "maintMarginRatio": "0.015", - "cum": "50.0" + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "DEGO/USDT:USDT", "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 300000.0, + "minNotional": 10000.0, + "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "300000", - "notionalFloor": "60000", + "notionalCap": "30000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "350.0" + "cum": "75.0" } }, { "tier": 4.0, + "symbol": "DEGO/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 30000.0, + "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "300000", + "notionalCap": "60000", + "notionalFloor": "30000", "maintMarginRatio": "0.025", - "cum": "1850.0" + "cum": "225.0" } }, { "tier": 5.0, + "symbol": "DEGO/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 3000000.0, + "minNotional": 60000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "3000000", - "notionalFloor": "600000", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.05", - "cum": "16850.0" + "cum": "1725.0" } }, { "tier": 6.0, + "symbol": "DEGO/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "166850.0" + "cum": "16725.0" } }, { "tier": 7.0, + "symbol": "DEGO/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "minNotional": 600000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "7500000", - "notionalFloor": "6000000", + "notionalCap": "750000", + "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "316850.0" + "cum": "31725.0" } }, { "tier": 8.0, + "symbol": "DEGO/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "1254350.0" + "cum": "125475.0" } }, { "tier": 9.0, + "symbol": "DEGO/USDT:USDT", "currency": "USDT", - "minNotional": 15000000.0, - "maxNotional": 30000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "15000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "5004350.0" + "cum": "500475.0" } } ], - "DOT/USDT:USDT": [ + "DENT/USDT:USDT": [ { "tier": 1.0, + "symbol": "DENT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.0065, - "maxLeverage": 75.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "75", - "notionalCap": "10000", + "initialLeverage": "25", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.0065", + "maintMarginRatio": "0.02", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "DENT/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 50.0, + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", - "notionalCap": "50000", - "notionalFloor": "10000", - "maintMarginRatio": "0.01", - "cum": "35.0" + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "DENT/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 40.0, + "minNotional": 25000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "40", - "notionalCap": "100000", - "notionalFloor": "50000", - "maintMarginRatio": "0.015", - "cum": "285.0" + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "650.0" } }, { "tier": 4.0, + "symbol": "DENT/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 300000.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "25", - "notionalCap": "500000", - "notionalFloor": "100000", - "maintMarginRatio": "0.02", - "cum": "785.0" + "initialLeverage": "5", + "notionalCap": "800000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "15650.0" } }, { "tier": 5.0, + "symbol": "DENT/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 800000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 800000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "20", - "notionalCap": "800000", - "notionalFloor": "500000", - "maintMarginRatio": "0.025", - "cum": "3285.0" + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "800000", + "maintMarginRatio": "0.125", + "cum": "35650.0" } }, { "tier": 6.0, + "symbol": "DENT/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 4000000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, - "info": { + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { "bracket": "6", + "initialLeverage": "2", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "160650.0" + } + }, + { + "tier": 7.0, + "symbol": "DENT/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "5000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.5", + "cum": "910650.0" + } + } + ], + "DEXE/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "DEXE/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "DEXE/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "DEXE/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "DEXE/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "DEXE/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", "initialLeverage": "10", - "notionalCap": "4000000", - "notionalFloor": "800000", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.05", - "cum": "23285.0" + "cum": "1725.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "DEXE/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "8000000", - "notionalFloor": "4000000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "223285.0" + "cum": "16725.0" } }, { - "tier": 8.0, + "tier": 7.0, + "symbol": "DEXE/USDT:USDT", "currency": "USDT", - "minNotional": 8000000.0, - "maxNotional": 10000000.0, + "minNotional": 600000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "10000000", - "notionalFloor": "8000000", + "notionalCap": "750000", + "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "423285.0" + "cum": "31725.0" } }, { - "tier": 9.0, + "tier": 8.0, + "symbol": "DEXE/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 30000000.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "30000000", - "notionalFloor": "10000000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "1673285.0" + "cum": "125475.0" } }, { - "tier": 10.0, + "tier": 9.0, + "symbol": "DEXE/USDT:USDT", "currency": "USDT", - "minNotional": 30000000.0, - "maxNotional": 50000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "30000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "9173285.0" + "cum": "500475.0" } } ], - "DUSK/USDT:USDT": [ + "DGB/USDT:USDT": [ { "tier": 1.0, + "symbol": "DGB/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 11.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "11", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -14622,14 +17635,15 @@ }, { "tier": 2.0, + "symbol": "DGB/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -14638,15 +17652,16 @@ }, { "tier": 3.0, + "symbol": "DGB/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 200000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "200000", + "initialLeverage": "8", + "notionalCap": "100000", "notionalFloor": "25000", "maintMarginRatio": "0.05", "cum": "650.0" @@ -14654,72 +17669,60 @@ }, { "tier": 4.0, + "symbol": "DGB/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "4", "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1", - "cum": "10650.0" + "cum": "5650.0" } }, { "tier": 5.0, + "symbol": "DGB/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, + "minNotional": 250000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", + "initialLeverage": "2", "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalFloor": "250000", "maintMarginRatio": "0.125", - "cum": "23150.0" + "cum": "11900.0" } }, { "tier": 6.0, + "symbol": "DGB/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 3000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "6", - "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "1000000", - "maintMarginRatio": "0.25", - "cum": "148150.0" - } - }, - { - "tier": 7.0, - "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 5000000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "3000000", + "notionalCap": "1500000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "898150.0" + "cum": "386900.0" } } ], - "DYDX/USDT:USDT": [ + "DIA/USDT:USDT": [ { "tier": 1.0, + "symbol": "DIA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -14736,15 +17739,16 @@ }, { "tier": 2.0, + "symbol": "DIA/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 40000.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "40000", + "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", "cum": "50.0" @@ -14752,282 +17756,162 @@ }, { "tier": 3.0, + "symbol": "DIA/USDT:USDT", "currency": "USDT", - "minNotional": 40000.0, - "maxNotional": 200000.0, + "minNotional": 20000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "200000", - "notionalFloor": "40000", + "notionalCap": "100000", + "notionalFloor": "20000", "maintMarginRatio": "0.02", - "cum": "250.0" + "cum": "150.0" } }, { "tier": 4.0, + "symbol": "DIA/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "200000", + "notionalFloor": "100000", "maintMarginRatio": "0.025", - "cum": "1250.0" + "cum": "650.0" } }, { "tier": 5.0, + "symbol": "DIA/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 2000000.0, + "minNotional": 200000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "2000000", - "notionalFloor": "400000", + "notionalCap": "1000000", + "notionalFloor": "200000", "maintMarginRatio": "0.05", - "cum": "11250.0" + "cum": "5650.0" } }, { "tier": 6.0, + "symbol": "DIA/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "4000000", - "notionalFloor": "2000000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.1", - "cum": "111250.0" + "cum": "55650.0" } }, { "tier": 7.0, + "symbol": "DIA/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 5000000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "5000000", - "notionalFloor": "4000000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "211250.0" + "cum": "105650.0" } }, { "tier": 8.0, + "symbol": "DIA/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 12000000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "12000000", - "notionalFloor": "5000000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.25", - "cum": "836250.0" + "cum": "418150.0" } }, { "tier": 9.0, + "symbol": "DIA/USDT:USDT", "currency": "USDT", - "minNotional": 12000000.0, - "maxNotional": 20000000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "20000000", - "notionalFloor": "12000000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "3836250.0" + "cum": "1668150.0" } } ], - "DYM/USDT:USDT": [ + "DODOX/USDT:USDT": [ { "tier": 1.0, + "symbol": "DODOX/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, - "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, - "info": { - "bracket": "2", - "initialLeverage": "25", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 80000.0, - "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, - "info": { - "bracket": "3", - "initialLeverage": "20", - "notionalCap": "80000", - "notionalFloor": "25000", - "maintMarginRatio": "0.025", - "cum": "150.0" - } - }, - { - "tier": 4.0, - "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 800000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, - "info": { - "bracket": "4", - "initialLeverage": "10", - "notionalCap": "800000", - "notionalFloor": "80000", - "maintMarginRatio": "0.05", - "cum": "2150.0" - } - }, - { - "tier": 5.0, - "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 1600000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "1600000", - "notionalFloor": "800000", - "maintMarginRatio": "0.1", - "cum": "42150.0" - } - }, - { - "tier": 6.0, - "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 2000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "6", - "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1600000", - "maintMarginRatio": "0.125", - "cum": "82150.0" - } - }, - { - "tier": 7.0, - "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "4000000", - "notionalFloor": "2000000", - "maintMarginRatio": "0.25", - "cum": "332150.0" - } - }, - { - "tier": 8.0, - "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, - "maintenanceMarginRate": 0.5, - "maxLeverage": 1.0, - "info": { - "bracket": "8", - "initialLeverage": "1", - "notionalCap": "8000000", - "notionalFloor": "4000000", - "maintMarginRatio": "0.5", - "cum": "1332150.0" - } - } - ], - "EDU/USDT:USDT": [ - { - "tier": 1.0, - "currency": "USDT", - "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "DODOX/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "15", "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "DODOX/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 200000.0, @@ -15039,11 +17923,12 @@ "notionalCap": "200000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "675.0" + "cum": "650.0" } }, { "tier": 4.0, + "symbol": "DODOX/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, @@ -15055,11 +17940,12 @@ "notionalCap": "500000", "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "10675.0" + "cum": "10650.0" } }, { "tier": 5.0, + "symbol": "DODOX/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -15071,11 +17957,12 @@ "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "23175.0" + "cum": "23150.0" } }, { "tier": 6.0, + "symbol": "DODOX/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 3000000.0, @@ -15087,11 +17974,12 @@ "notionalCap": "3000000", "notionalFloor": "1000000", "maintMarginRatio": "0.25", - "cum": "148175.0" + "cum": "148150.0" } }, { "tier": 7.0, + "symbol": "DODOX/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 5000000.0, @@ -15103,127 +17991,358 @@ "notionalCap": "5000000", "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "898175.0" + "cum": "898150.0" } } ], - "EGLD/USDT:USDT": [ + "DOGE/USDC:USDC": [ { "tier": 1.0, - "currency": "USDT", + "symbol": "DOGE/USDC:USDC", + "currency": "USDC", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.005, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.005", "cum": "0.0" } }, { "tier": 2.0, - "currency": "USDT", + "symbol": "DOGE/USDC:USDC", + "currency": "USDC", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.006, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "50", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.006", + "cum": "5.0" } }, { "tier": 3.0, - "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 600000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "symbol": "DOGE/USDC:USDC", + "currency": "USDC", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.007, + "maxLeverage": 40.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "600000", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "40", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.007", + "cum": "15.0" } }, { "tier": 4.0, - "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 1600000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "4", - "initialLeverage": "5", - "notionalCap": "1600000", - "notionalFloor": "600000", - "maintMarginRatio": "0.1", - "cum": "30700.0" + "symbol": "DOGE/USDC:USDC", + "currency": "USDC", + "minNotional": 50000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 25.0, + "info": { + "bracket": "4", + "initialLeverage": "25", + "notionalCap": "750000", + "notionalFloor": "50000", + "maintMarginRatio": "0.01", + "cum": "165.0" } }, { "tier": 5.0, + "symbol": "DOGE/USDC:USDC", + "currency": "USDC", + "minNotional": 750000.0, + "maxNotional": 1100000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "5", + "initialLeverage": "20", + "notionalCap": "1100000", + "notionalFloor": "750000", + "maintMarginRatio": "0.025", + "cum": "11415.0" + } + }, + { + "tier": 6.0, + "symbol": "DOGE/USDC:USDC", + "currency": "USDC", + "minNotional": 1100000.0, + "maxNotional": 2200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "6", + "initialLeverage": "10", + "notionalCap": "2200000", + "notionalFloor": "1100000", + "maintMarginRatio": "0.05", + "cum": "38915.0" + } + }, + { + "tier": 7.0, + "symbol": "DOGE/USDC:USDC", + "currency": "USDC", + "minNotional": 2200000.0, + "maxNotional": 5600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "7", + "initialLeverage": "5", + "notionalCap": "5600000", + "notionalFloor": "2200000", + "maintMarginRatio": "0.1", + "cum": "148915.0" + } + }, + { + "tier": 8.0, + "symbol": "DOGE/USDC:USDC", + "currency": "USDC", + "minNotional": 5600000.0, + "maxNotional": 7000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "8", + "initialLeverage": "4", + "notionalCap": "7000000", + "notionalFloor": "5600000", + "maintMarginRatio": "0.125", + "cum": "288915.0" + } + }, + { + "tier": 9.0, + "symbol": "DOGE/USDC:USDC", + "currency": "USDC", + "minNotional": 7000000.0, + "maxNotional": 18000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "18000000", + "notionalFloor": "7000000", + "maintMarginRatio": "0.25", + "cum": "1163915.0" + } + }, + { + "tier": 10.0, + "symbol": "DOGE/USDC:USDC", + "currency": "USDC", + "minNotional": 18000000.0, + "maxNotional": 30000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "18000000", + "maintMarginRatio": "0.5", + "cum": "5663915.0" + } + } + ], + "DOGE/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "DOGE/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, + "minNotional": 0.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.005, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.005", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "DOGE/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.007, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.007", + "cum": "20.0" + } + }, + { + "tier": 3.0, + "symbol": "DOGE/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 40.0, + "info": { + "bracket": "3", + "initialLeverage": "40", + "notionalCap": "750000", + "notionalFloor": "50000", + "maintMarginRatio": "0.01", + "cum": "170.0" + } + }, + { + "tier": 4.0, + "symbol": "DOGE/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "4", + "initialLeverage": "25", + "notionalCap": "2000000", + "notionalFloor": "750000", + "maintMarginRatio": "0.02", + "cum": "7670.0" + } + }, + { + "tier": 5.0, + "symbol": "DOGE/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "5", + "initialLeverage": "20", + "notionalCap": "4000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.025", + "cum": "17670.0" + } + }, + { + "tier": 6.0, + "symbol": "DOGE/USDT:USDT", + "currency": "USDT", + "minNotional": 4000000.0, + "maxNotional": 20000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "6", + "initialLeverage": "10", + "notionalCap": "20000000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.05", + "cum": "117670.0" + } + }, + { + "tier": 7.0, + "symbol": "DOGE/USDT:USDT", + "currency": "USDT", + "minNotional": 20000000.0, + "maxNotional": 40000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "7", + "initialLeverage": "5", + "notionalCap": "40000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.1", + "cum": "1117670.0" + } + }, + { + "tier": 8.0, + "symbol": "DOGE/USDT:USDT", + "currency": "USDT", + "minNotional": 40000000.0, + "maxNotional": 50000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "8", "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1600000", + "notionalCap": "50000000", + "notionalFloor": "40000000", "maintMarginRatio": "0.125", - "cum": "70700.0" + "cum": "2117670.0" } }, { - "tier": 6.0, + "tier": 9.0, + "symbol": "DOGE/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 6000000.0, + "minNotional": 50000000.0, + "maxNotional": 100000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "9", "initialLeverage": "2", - "notionalCap": "6000000", - "notionalFloor": "2000000", + "notionalCap": "100000000", + "notionalFloor": "50000000", "maintMarginRatio": "0.25", - "cum": "320700.0" + "cum": "8367670.0" } }, { - "tier": 7.0, + "tier": 10.0, + "symbol": "DOGE/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 10000000.0, + "minNotional": 100000000.0, + "maxNotional": 200000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalCap": "200000000", + "notionalFloor": "100000000", "maintMarginRatio": "0.5", - "cum": "1820700.0" + "cum": "33367670.0" } } ], - "EIGEN/USDT:USDT": [ + "DOGS/USDT:USDT": [ { "tier": 1.0, + "symbol": "DOGS/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -15240,6 +18359,7 @@ }, { "tier": 2.0, + "symbol": "DOGS/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 60000.0, @@ -15256,6 +18376,7 @@ }, { "tier": 3.0, + "symbol": "DOGS/USDT:USDT", "currency": "USDT", "minNotional": 60000.0, "maxNotional": 300000.0, @@ -15272,6 +18393,7 @@ }, { "tier": 4.0, + "symbol": "DOGS/USDT:USDT", "currency": "USDT", "minNotional": 300000.0, "maxNotional": 600000.0, @@ -15288,6 +18410,7 @@ }, { "tier": 5.0, + "symbol": "DOGS/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, "maxNotional": 3000000.0, @@ -15304,6 +18427,7 @@ }, { "tier": 6.0, + "symbol": "DOGS/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 6000000.0, @@ -15320,6 +18444,7 @@ }, { "tier": 7.0, + "symbol": "DOGS/USDT:USDT", "currency": "USDT", "minNotional": 6000000.0, "maxNotional": 7500000.0, @@ -15336,6 +18461,7 @@ }, { "tier": 8.0, + "symbol": "DOGS/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, "maxNotional": 15000000.0, @@ -15352,6 +18478,7 @@ }, { "tier": 9.0, + "symbol": "DOGS/USDT:USDT", "currency": "USDT", "minNotional": 15000000.0, "maxNotional": 30000000.0, @@ -15367,139 +18494,182 @@ } } ], - "ENA/USDC:USDC": [ + "DOT/USDT:USDT": [ { "tier": 1.0, - "currency": "USDC", + "symbol": "DOT/USDT:USDT", + "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.0065, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.0065", "cum": "0.0" } }, { "tier": 2.0, - "currency": "USDC", - "minNotional": 5000.0, + "symbol": "DOT/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, "maxNotional": 50000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "50", "notionalCap": "50000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "50.0" + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "35.0" } }, { "tier": 3.0, - "currency": "USDC", + "symbol": "DOT/USDT:USDT", + "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 600000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 40.0, + "info": { + "bracket": "3", + "initialLeverage": "40", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.015", + "cum": "285.0" + } + }, + { + "tier": 4.0, + "symbol": "DOT/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "4", + "initialLeverage": "25", + "notionalCap": "500000", + "notionalFloor": "100000", + "maintMarginRatio": "0.02", + "cum": "785.0" + } + }, + { + "tier": 5.0, + "symbol": "DOT/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "50000", + "notionalCap": "800000", + "notionalFloor": "500000", "maintMarginRatio": "0.025", - "cum": "300.0" + "cum": "3285.0" } }, { - "tier": 4.0, - "currency": "USDC", - "minNotional": 600000.0, - "maxNotional": 1200000.0, + "tier": 6.0, + "symbol": "DOT/USDT:USDT", + "currency": "USDT", + "minNotional": 800000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "10", - "notionalCap": "1200000", - "notionalFloor": "600000", + "notionalCap": "4000000", + "notionalFloor": "800000", "maintMarginRatio": "0.05", - "cum": "15300.0" + "cum": "23285.0" } }, { - "tier": 5.0, - "currency": "USDC", - "minNotional": 1200000.0, - "maxNotional": 3000000.0, + "tier": 7.0, + "symbol": "DOT/USDT:USDT", + "currency": "USDT", + "minNotional": 4000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "1200000", + "notionalCap": "8000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.1", - "cum": "75300.0" + "cum": "223285.0" } }, { - "tier": 6.0, - "currency": "USDC", - "minNotional": 3000000.0, - "maxNotional": 4000000.0, + "tier": 8.0, + "symbol": "DOT/USDT:USDT", + "currency": "USDT", + "minNotional": 8000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "4", - "notionalCap": "4000000", - "notionalFloor": "3000000", + "notionalCap": "10000000", + "notionalFloor": "8000000", "maintMarginRatio": "0.125", - "cum": "150300.0" + "cum": "423285.0" } }, { - "tier": 7.0, - "currency": "USDC", - "minNotional": 4000000.0, - "maxNotional": 6000000.0, + "tier": 9.0, + "symbol": "DOT/USDT:USDT", + "currency": "USDT", + "minNotional": 10000000.0, + "maxNotional": 30000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "2", - "notionalCap": "6000000", - "notionalFloor": "4000000", + "notionalCap": "30000000", + "notionalFloor": "10000000", "maintMarginRatio": "0.25", - "cum": "650300.0" + "cum": "1673285.0" } }, { - "tier": 8.0, - "currency": "USDC", - "minNotional": 6000000.0, - "maxNotional": 10000000.0, + "tier": 10.0, + "symbol": "DOT/USDT:USDT", + "currency": "USDT", + "minNotional": 30000000.0, + "maxNotional": 50000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalCap": "50000000", + "notionalFloor": "30000000", "maintMarginRatio": "0.5", - "cum": "2150300.0" + "cum": "9173285.0" } } ], - "ENA/USDT:USDT": [ + "DRIFT/USDT:USDT": [ { "tier": 1.0, + "symbol": "DRIFT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -15516,15 +18686,16 @@ }, { "tier": 2.0, + "symbol": "DRIFT/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 80000.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "80000", + "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", "cum": "50.0" @@ -15532,129 +18703,137 @@ }, { "tier": 3.0, + "symbol": "DRIFT/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 400000.0, + "minNotional": 20000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "400000", - "notionalFloor": "80000", + "notionalCap": "100000", + "notionalFloor": "20000", "maintMarginRatio": "0.02", - "cum": "450.0" + "cum": "150.0" } }, { "tier": 4.0, + "symbol": "DRIFT/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 800000.0, + "minNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "800000", - "notionalFloor": "400000", + "notionalCap": "200000", + "notionalFloor": "100000", "maintMarginRatio": "0.025", - "cum": "2450.0" + "cum": "650.0" } }, { "tier": 5.0, + "symbol": "DRIFT/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 4000000.0, + "minNotional": 200000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "4000000", - "notionalFloor": "800000", + "notionalCap": "1000000", + "notionalFloor": "200000", "maintMarginRatio": "0.05", - "cum": "22450.0" + "cum": "5650.0" } }, { "tier": 6.0, + "symbol": "DRIFT/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "8000000", - "notionalFloor": "4000000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.1", - "cum": "222450.0" + "cum": "55650.0" } }, { "tier": 7.0, + "symbol": "DRIFT/USDT:USDT", "currency": "USDT", - "minNotional": 8000000.0, - "maxNotional": 10000000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "10000000", - "notionalFloor": "8000000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "422450.0" + "cum": "105650.0" } }, { "tier": 8.0, + "symbol": "DRIFT/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.25", - "cum": "1672450.0" + "cum": "418150.0" } }, { "tier": 9.0, + "symbol": "DRIFT/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 40000000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "40000000", - "notionalFloor": "20000000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "6672450.0" + "cum": "1668150.0" } } ], - "ENJ/USDT:USDT": [ + "DUSK/USDT:USDT": [ { "tier": 1.0, + "symbol": "DUSK/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 50000.0, + "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "25", - "notionalCap": "50000", + "initialLeverage": "75", + "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -15662,1085 +18841,7375 @@ }, { "tier": 2.0, + "symbol": "DUSK/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "100000", - "notionalFloor": "50000", - "maintMarginRatio": "0.02", - "cum": "500.0" - } - }, + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, { "tier": 3.0, + "symbol": "DUSK/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 150000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "150000", - "notionalFloor": "100000", - "maintMarginRatio": "0.025", - "cum": "1000.0" + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" } }, { "tier": 4.0, + "symbol": "DUSK/USDT:USDT", "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "4", - "initialLeverage": "8", - "notionalCap": "250000", - "notionalFloor": "150000", - "maintMarginRatio": "0.05", - "cum": "4750.0" + "initialLeverage": "20", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "325.0" } }, { "tier": 5.0, + "symbol": "DUSK/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, + "minNotional": 100000.0, "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "5", - "initialLeverage": "5", + "initialLeverage": "10", "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1", - "cum": "17250.0" + "notionalFloor": "100000", + "maintMarginRatio": "0.05", + "cum": "2825.0" } }, { "tier": 6.0, + "symbol": "DUSK/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "6", - "initialLeverage": "4", + "initialLeverage": "5", "notionalCap": "1000000", "notionalFloor": "500000", - "maintMarginRatio": "0.125", - "cum": "29750.0" + "maintMarginRatio": "0.1", + "cum": "27825.0" } }, { "tier": 7.0, + "symbol": "DUSK/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maxNotional": 1250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "7", - "initialLeverage": "2", - "notionalCap": "5000000", + "initialLeverage": "4", + "notionalCap": "1250000", "notionalFloor": "1000000", - "maintMarginRatio": "0.25", - "cum": "154750.0" + "maintMarginRatio": "0.125", + "cum": "52825.0" } }, { "tier": 8.0, + "symbol": "DUSK/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, - "maintenanceMarginRate": 0.5, - "maxLeverage": 1.0, - "info": { - "bracket": "8", - "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "5000000", - "maintMarginRatio": "0.5", - "cum": "1404750.0" - } - } - ], - "ENS/USDT:USDT": [ - { - "tier": 1.0, - "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, - "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, - "info": { - "bracket": "2", - "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, - "info": { - "bracket": "3", - "initialLeverage": "10", - "notionalCap": "100000", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "675.0" - } - }, - { - "tier": 4.0, - "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "4", - "initialLeverage": "5", - "notionalCap": "250000", - "notionalFloor": "100000", - "maintMarginRatio": "0.1", - "cum": "5675.0" - } - }, - { - "tier": 5.0, - "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.125, + "minNotional": 1250000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "5", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "11925.0" + "notionalCap": "3000000", + "notionalFloor": "1250000", + "maintMarginRatio": "0.25", + "cum": "209075.0" } }, { - "tier": 6.0, + "tier": 9.0, + "symbol": "DUSK/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 8000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "8000000", - "notionalFloor": "1000000", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "386925.0" + "cum": "959075.0" } } ], - "EOS/USDT:USDT": [ + "DYDX/USDT:USDT": [ { "tier": 1.0, + "symbol": "DYDX/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.005, + "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.005", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "DYDX/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.01, + "maxNotional": 40000.0, + "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "50000", + "notionalCap": "40000", "notionalFloor": "10000", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.015", "cum": "50.0" } }, { "tier": 3.0, + "symbol": "DYDX/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 80000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 40.0, - "info": { - "bracket": "3", - "initialLeverage": "40", - "notionalCap": "80000", - "notionalFloor": "50000", - "maintMarginRatio": "0.015", - "cum": "300.0" - } - }, - { - "tier": 4.0, - "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 250000.0, + "minNotional": 40000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "25", - "notionalCap": "250000", - "notionalFloor": "80000", + "notionalCap": "200000", + "notionalFloor": "40000", "maintMarginRatio": "0.02", - "cum": "700.0" + "cum": "250.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "DYDX/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, + "minNotional": 200000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "500000", - "notionalFloor": "250000", + "notionalCap": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.025", - "cum": "1950.0" + "cum": "1250.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "DYDX/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, + "minNotional": 400000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "10", "notionalCap": "2000000", - "notionalFloor": "500000", + "notionalFloor": "400000", "maintMarginRatio": "0.05", - "cum": "14450.0" + "cum": "11250.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "DYDX/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, - "maxNotional": 5000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "5000000", + "notionalCap": "4000000", "notionalFloor": "2000000", "maintMarginRatio": "0.1", - "cum": "114450.0" + "cum": "111250.0" } }, { - "tier": 8.0, + "tier": 7.0, + "symbol": "DYDX/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 20000000.0, + "minNotional": 4000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "20000000", - "notionalFloor": "5000000", + "notionalCap": "5000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.125", - "cum": "239450.0" + "cum": "211250.0" } }, { - "tier": 9.0, + "tier": 8.0, + "symbol": "DYDX/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 30000000.0, + "minNotional": 5000000.0, + "maxNotional": 12000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "30000000", - "notionalFloor": "20000000", + "notionalCap": "12000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.25", - "cum": "2739450.0" + "cum": "836250.0" } }, { - "tier": 10.0, + "tier": 9.0, + "symbol": "DYDX/USDT:USDT", "currency": "USDT", - "minNotional": 30000000.0, - "maxNotional": 50000000.0, + "minNotional": 12000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "30000000", + "notionalCap": "20000000", + "notionalFloor": "12000000", "maintMarginRatio": "0.5", - "cum": "10239450.0" + "cum": "3836250.0" } } ], - "ETC/USDT:USDT": [ + "DYM/USDT:USDT": [ { "tier": 1.0, + "symbol": "DYM/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.005, - "maxLeverage": 75.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "75", - "notionalCap": "10000", + "initialLeverage": "50", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.005", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "DYM/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 50.0, - "info": { - "bracket": "2", - "initialLeverage": "50", - "notionalCap": "50000", - "notionalFloor": "10000", - "maintMarginRatio": "0.01", - "cum": "50.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 80000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 40.0, - "info": { - "bracket": "3", - "initialLeverage": "40", - "notionalCap": "80000", - "notionalFloor": "50000", - "maintMarginRatio": "0.015", - "cum": "300.0" - } - }, - { - "tier": 4.0, - "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 400000.0, + "minNotional": 5000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "25", - "notionalCap": "400000", - "notionalFloor": "80000", + "notionalCap": "25000", + "notionalFloor": "5000", "maintMarginRatio": "0.02", - "cum": "700.0" + "cum": "25.0" } }, { - "tier": 5.0, + "tier": 3.0, + "symbol": "DYM/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 800000.0, + "minNotional": 25000.0, + "maxNotional": 80000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "20", - "notionalCap": "800000", - "notionalFloor": "400000", + "notionalCap": "80000", + "notionalFloor": "25000", "maintMarginRatio": "0.025", - "cum": "2700.0" + "cum": "150.0" } }, { - "tier": 6.0, + "tier": 4.0, + "symbol": "DYM/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 4000000.0, + "minNotional": 80000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "10", - "notionalCap": "4000000", - "notionalFloor": "800000", + "notionalCap": "800000", + "notionalFloor": "80000", "maintMarginRatio": "0.05", - "cum": "22700.0" + "cum": "2150.0" } }, { - "tier": 7.0, + "tier": 5.0, + "symbol": "DYM/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "minNotional": 800000.0, + "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "5", - "notionalCap": "8000000", - "notionalFloor": "4000000", + "notionalCap": "1600000", + "notionalFloor": "800000", "maintMarginRatio": "0.1", - "cum": "222700.0" + "cum": "42150.0" } }, { - "tier": 8.0, + "tier": 6.0, + "symbol": "DYM/USDT:USDT", "currency": "USDT", - "minNotional": 8000000.0, - "maxNotional": 20000000.0, + "minNotional": 1600000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "4", - "notionalCap": "20000000", - "notionalFloor": "8000000", + "notionalCap": "2000000", + "notionalFloor": "1600000", "maintMarginRatio": "0.125", - "cum": "422700.0" + "cum": "82150.0" } }, { - "tier": 9.0, + "tier": 7.0, + "symbol": "DYM/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 30000000.0, + "minNotional": 2000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "7", "initialLeverage": "2", - "notionalCap": "30000000", - "notionalFloor": "20000000", + "notionalCap": "4000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.25", - "cum": "2922700.0" + "cum": "332150.0" } }, { - "tier": 10.0, + "tier": 8.0, + "symbol": "DYM/USDT:USDT", "currency": "USDT", - "minNotional": 30000000.0, - "maxNotional": 50000000.0, + "minNotional": 4000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "30000000", + "notionalCap": "8000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "10422700.0" + "cum": "1332150.0" } } ], - "ETH/BTC:BTC": [ + "EDU/USDT:USDT": [ { "tier": 1.0, - "currency": "BTC", + "symbol": "EDU/USDT:USDT", + "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5.0, - "maintenanceMarginRate": 0.005, - "maxLeverage": 100.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "100", - "notionalCap": "5", + "initialLeverage": "50", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.005", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, - "currency": "BTC", - "minNotional": 5.0, - "maxNotional": 10.0, - "maintenanceMarginRate": 0.006, - "maxLeverage": 75.0, + "symbol": "EDU/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "75", - "notionalCap": "10", - "notionalFloor": "5", - "maintMarginRatio": "0.006", - "cum": "0.005" + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { "tier": 3.0, - "currency": "BTC", - "minNotional": 10.0, - "maxNotional": 100.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 50.0, + "symbol": "EDU/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "50", - "notionalCap": "100", - "notionalFloor": "10", - "maintMarginRatio": "0.01", - "cum": "0.045" + "initialLeverage": "10", + "notionalCap": "200000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "675.0" } }, { "tier": 4.0, - "currency": "BTC", - "minNotional": 100.0, - "maxNotional": 400.0, - "maintenanceMarginRate": 0.02, + "symbol": "EDU/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "200000", + "maintMarginRatio": "0.1", + "cum": "10675.0" + } + }, + { + "tier": 5.0, + "symbol": "EDU/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "23175.0" + } + }, + { + "tier": 6.0, + "symbol": "EDU/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "148175.0" + } + }, + { + "tier": 7.0, + "symbol": "EDU/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "5000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.5", + "cum": "898175.0" + } + } + ], + "EGLD/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "EGLD/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "EGLD/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "20000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "EGLD/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "100000", + "notionalFloor": "20000", + "maintMarginRatio": "0.02", + "cum": "150.0" + } + }, + { + "tier": 4.0, + "symbol": "EGLD/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "400", - "notionalFloor": "100", - "maintMarginRatio": "0.02", - "cum": "1.045" + "notionalCap": "200000", + "notionalFloor": "100000", + "maintMarginRatio": "0.025", + "cum": "650.0" } }, { "tier": 5.0, - "currency": "BTC", - "minNotional": 400.0, - "maxNotional": 800.0, - "maintenanceMarginRate": 0.025, + "symbol": "EGLD/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "800", - "notionalFloor": "400", - "maintMarginRatio": "0.025", - "cum": "3.045" + "notionalCap": "1000000", + "notionalFloor": "200000", + "maintMarginRatio": "0.05", + "cum": "5650.0" } }, { "tier": 6.0, - "currency": "BTC", - "minNotional": 800.0, - "maxNotional": 1500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "symbol": "EGLD/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "6", - "initialLeverage": "8", - "notionalCap": "1500", - "notionalFloor": "800", - "maintMarginRatio": "0.05", - "cum": "23.045" + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "55650.0" } }, { "tier": 7.0, - "currency": "BTC", - "minNotional": 1500.0, - "maxNotional": 2000.0, + "symbol": "EGLD/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "2500000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "105650.0" + } + }, + { + "tier": 8.0, + "symbol": "EGLD/USDT:USDT", + "currency": "USDT", + "minNotional": 2500000.0, + "maxNotional": 6000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "6000000", + "notionalFloor": "2500000", + "maintMarginRatio": "0.25", + "cum": "418150.0" + } + }, + { + "tier": 9.0, + "symbol": "EGLD/USDT:USDT", + "currency": "USDT", + "minNotional": 6000000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "10000000", + "notionalFloor": "6000000", + "maintMarginRatio": "0.5", + "cum": "1918150.0" + } + } + ], + "EIGEN/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "EIGEN/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "EIGEN/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "60000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "EIGEN/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.02", + "cum": "350.0" + } + }, + { + "tier": 4.0, + "symbol": "EIGEN/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.025", + "cum": "1850.0" + } + }, + { + "tier": 5.0, + "symbol": "EIGEN/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "3000000", + "notionalFloor": "600000", + "maintMarginRatio": "0.05", + "cum": "16850.0" + } + }, + { + "tier": 6.0, + "symbol": "EIGEN/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "2000", - "notionalFloor": "1500", + "notionalCap": "6000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.1", - "cum": "98.045" + "cum": "166850.0" } }, { - "tier": 8.0, - "currency": "BTC", - "minNotional": 2000.0, - "maxNotional": 3000.0, + "tier": 7.0, + "symbol": "EIGEN/USDT:USDT", + "currency": "USDT", + "minNotional": 6000000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "3000", - "notionalFloor": "2000", + "notionalCap": "7500000", + "notionalFloor": "6000000", "maintMarginRatio": "0.125", - "cum": "148.045" + "cum": "316850.0" } }, { - "tier": 9.0, - "currency": "BTC", - "minNotional": 3000.0, - "maxNotional": 5000.0, + "tier": 8.0, + "symbol": "EIGEN/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "5000", - "notionalFloor": "3000", + "notionalCap": "15000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.25", - "cum": "523.045" + "cum": "1254350.0" } }, { - "tier": 10.0, - "currency": "BTC", - "minNotional": 5000.0, - "maxNotional": 10000.0, + "tier": 9.0, + "symbol": "EIGEN/USDT:USDT", + "currency": "USDT", + "minNotional": 15000000.0, + "maxNotional": 30000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "10000", - "notionalFloor": "5000", + "notionalCap": "30000000", + "notionalFloor": "15000000", "maintMarginRatio": "0.5", - "cum": "1773.045" + "cum": "5004350.0" } } ], - "ETH/USDC:USDC": [ + "ENA/USDC:USDC": [ { "tier": 1.0, + "symbol": "ENA/USDC:USDC", "currency": "USDC", "minNotional": 0.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.004, - "maxLeverage": 125.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "125", - "notionalCap": "50000", + "initialLeverage": "50", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.004", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "ENA/USDC:USDC", "currency": "USDC", - "minNotional": 50000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.005, - "maxLeverage": 100.0, + "minNotional": 5000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "2", - "initialLeverage": "100", - "notionalCap": "500000", - "notionalFloor": "50000", - "maintMarginRatio": "0.005", + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", "cum": "50.0" } }, { "tier": 3.0, + "symbol": "ENA/USDC:USDC", "currency": "USDC", - "minNotional": 500000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.0065, - "maxLeverage": 75.0, + "minNotional": 50000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "3", - "initialLeverage": "75", - "notionalCap": "1000000", - "notionalFloor": "500000", - "maintMarginRatio": "0.0065", - "cum": "800.0" + "initialLeverage": "20", + "notionalCap": "600000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "300.0" } }, { "tier": 4.0, + "symbol": "ENA/USDC:USDC", "currency": "USDC", - "minNotional": 1000000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 50.0, + "minNotional": 600000.0, + "maxNotional": 1200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "50", - "notionalCap": "5000000", - "notionalFloor": "1000000", - "maintMarginRatio": "0.01", - "cum": "4300.0" + "initialLeverage": "10", + "notionalCap": "1200000", + "notionalFloor": "600000", + "maintMarginRatio": "0.05", + "cum": "15300.0" } }, { "tier": 5.0, + "symbol": "ENA/USDC:USDC", "currency": "USDC", - "minNotional": 5000000.0, - "maxNotional": 50000000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "minNotional": 1200000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "20", - "notionalCap": "50000000", - "notionalFloor": "5000000", - "maintMarginRatio": "0.02", - "cum": "54300.0" + "initialLeverage": "5", + "notionalCap": "3000000", + "notionalFloor": "1200000", + "maintMarginRatio": "0.1", + "cum": "75300.0" } }, { "tier": 6.0, + "symbol": "ENA/USDC:USDC", "currency": "USDC", - "minNotional": 50000000.0, - "maxNotional": 100000000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 3000000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "10", - "notionalCap": "100000000", - "notionalFloor": "50000000", - "maintMarginRatio": "0.05", - "cum": "1554300.0" + "initialLeverage": "4", + "notionalCap": "4000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.125", + "cum": "150300.0" } }, { "tier": 7.0, + "symbol": "ENA/USDC:USDC", "currency": "USDC", - "minNotional": 100000000.0, - "maxNotional": 150000000.0, + "minNotional": 4000000.0, + "maxNotional": 6000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "6000000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.25", + "cum": "650300.0" + } + }, + { + "tier": 8.0, + "symbol": "ENA/USDC:USDC", + "currency": "USDC", + "minNotional": 6000000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "10000000", + "notionalFloor": "6000000", + "maintMarginRatio": "0.5", + "cum": "2150300.0" + } + } + ], + "ENA/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "ENA/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "20000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "ENA/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 160000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "160000", + "notionalFloor": "20000", + "maintMarginRatio": "0.015", + "cum": "100.0" + } + }, + { + "tier": 3.0, + "symbol": "ENA/USDT:USDT", + "currency": "USDT", + "minNotional": 160000.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "800000", + "notionalFloor": "160000", + "maintMarginRatio": "0.02", + "cum": "900.0" + } + }, + { + "tier": 4.0, + "symbol": "ENA/USDT:USDT", + "currency": "USDT", + "minNotional": 800000.0, + "maxNotional": 1600000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "1600000", + "notionalFloor": "800000", + "maintMarginRatio": "0.025", + "cum": "4900.0" + } + }, + { + "tier": 5.0, + "symbol": "ENA/USDT:USDT", + "currency": "USDT", + "minNotional": 1600000.0, + "maxNotional": 8000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "8000000", + "notionalFloor": "1600000", + "maintMarginRatio": "0.05", + "cum": "44900.0" + } + }, + { + "tier": 6.0, + "symbol": "ENA/USDT:USDT", + "currency": "USDT", + "minNotional": 8000000.0, + "maxNotional": 16000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "16000000", + "notionalFloor": "8000000", + "maintMarginRatio": "0.1", + "cum": "444900.0" + } + }, + { + "tier": 7.0, + "symbol": "ENA/USDT:USDT", + "currency": "USDT", + "minNotional": 16000000.0, + "maxNotional": 20000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "20000000", + "notionalFloor": "16000000", + "maintMarginRatio": "0.125", + "cum": "844900.0" + } + }, + { + "tier": 8.0, + "symbol": "ENA/USDT:USDT", + "currency": "USDT", + "minNotional": 20000000.0, + "maxNotional": 40000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "40000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.25", + "cum": "3344900.0" + } + }, + { + "tier": 9.0, + "symbol": "ENA/USDT:USDT", + "currency": "USDT", + "minNotional": 40000000.0, + "maxNotional": 80000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "80000000", + "notionalFloor": "40000000", + "maintMarginRatio": "0.5", + "cum": "13344900.0" + } + } + ], + "ENJ/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "ENJ/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 25.0, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "ENJ/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "500.0" + } + }, + { + "tier": 3.0, + "symbol": "ENJ/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 150000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "150000", + "notionalFloor": "100000", + "maintMarginRatio": "0.025", + "cum": "1000.0" + } + }, + { + "tier": 4.0, + "symbol": "ENJ/USDT:USDT", + "currency": "USDT", + "minNotional": 150000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 8.0, + "info": { + "bracket": "4", + "initialLeverage": "8", + "notionalCap": "250000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4750.0" + } + }, + { + "tier": 5.0, + "symbol": "ENJ/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "17250.0" + } + }, + { + "tier": 6.0, + "symbol": "ENJ/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "29750.0" + } + }, + { + "tier": 7.0, + "symbol": "ENJ/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "154750.0" + } + }, + { + "tier": 8.0, + "symbol": "ENJ/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.5", + "cum": "1404750.0" + } + } + ], + "ENS/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "ENS/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "ENS/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 40000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "40000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "ENS/USDT:USDT", + "currency": "USDT", + "minNotional": 40000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "200000", + "notionalFloor": "40000", + "maintMarginRatio": "0.02", + "cum": "250.0" + } + }, + { + "tier": 4.0, + "symbol": "ENS/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "400000", + "notionalFloor": "200000", + "maintMarginRatio": "0.025", + "cum": "1250.0" + } + }, + { + "tier": 5.0, + "symbol": "ENS/USDT:USDT", + "currency": "USDT", + "minNotional": 400000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "2000000", + "notionalFloor": "400000", + "maintMarginRatio": "0.05", + "cum": "11250.0" + } + }, + { + "tier": 6.0, + "symbol": "ENS/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "4000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.1", + "cum": "111250.0" + } + }, + { + "tier": 7.0, + "symbol": "ENS/USDT:USDT", + "currency": "USDT", + "minNotional": 4000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.125", + "cum": "211250.0" + } + }, + { + "tier": 8.0, + "symbol": "ENS/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.25", + "cum": "836250.0" + } + }, + { + "tier": 9.0, + "symbol": "ENS/USDT:USDT", + "currency": "USDT", + "minNotional": 10000000.0, + "maxNotional": 20000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.5", + "cum": "3336250.0" + } + } + ], + "EOS/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "EOS/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.005, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.005", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "EOS/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "EOS/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 40.0, + "info": { + "bracket": "3", + "initialLeverage": "40", + "notionalCap": "80000", + "notionalFloor": "50000", + "maintMarginRatio": "0.015", + "cum": "300.0" + } + }, + { + "tier": 4.0, + "symbol": "EOS/USDT:USDT", + "currency": "USDT", + "minNotional": 80000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "4", + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "80000", + "maintMarginRatio": "0.02", + "cum": "700.0" + } + }, + { + "tier": 5.0, + "symbol": "EOS/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "5", + "initialLeverage": "20", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.025", + "cum": "1950.0" + } + }, + { + "tier": 6.0, + "symbol": "EOS/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "6", + "initialLeverage": "10", + "notionalCap": "2000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.05", + "cum": "14450.0" + } + }, + { + "tier": 7.0, + "symbol": "EOS/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "7", + "initialLeverage": "5", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.1", + "cum": "114450.0" + } + }, + { + "tier": 8.0, + "symbol": "EOS/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 20000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "8", + "initialLeverage": "4", + "notionalCap": "20000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.125", + "cum": "239450.0" + } + }, + { + "tier": 9.0, + "symbol": "EOS/USDT:USDT", + "currency": "USDT", + "minNotional": 20000000.0, + "maxNotional": 30000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "30000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.25", + "cum": "2739450.0" + } + }, + { + "tier": 10.0, + "symbol": "EOS/USDT:USDT", + "currency": "USDT", + "minNotional": 30000000.0, + "maxNotional": 50000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "30000000", + "maintMarginRatio": "0.5", + "cum": "10239450.0" + } + } + ], + "ETC/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "ETC/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.005, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.005", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "ETC/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "ETC/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 40.0, + "info": { + "bracket": "3", + "initialLeverage": "40", + "notionalCap": "80000", + "notionalFloor": "50000", + "maintMarginRatio": "0.015", + "cum": "300.0" + } + }, + { + "tier": 4.0, + "symbol": "ETC/USDT:USDT", + "currency": "USDT", + "minNotional": 80000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "4", + "initialLeverage": "25", + "notionalCap": "400000", + "notionalFloor": "80000", + "maintMarginRatio": "0.02", + "cum": "700.0" + } + }, + { + "tier": 5.0, + "symbol": "ETC/USDT:USDT", + "currency": "USDT", + "minNotional": 400000.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "5", + "initialLeverage": "20", + "notionalCap": "800000", + "notionalFloor": "400000", + "maintMarginRatio": "0.025", + "cum": "2700.0" + } + }, + { + "tier": 6.0, + "symbol": "ETC/USDT:USDT", + "currency": "USDT", + "minNotional": 800000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "6", + "initialLeverage": "10", + "notionalCap": "4000000", + "notionalFloor": "800000", + "maintMarginRatio": "0.05", + "cum": "22700.0" + } + }, + { + "tier": 7.0, + "symbol": "ETC/USDT:USDT", + "currency": "USDT", + "minNotional": 4000000.0, + "maxNotional": 8000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "7", + "initialLeverage": "5", + "notionalCap": "8000000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.1", + "cum": "222700.0" + } + }, + { + "tier": 8.0, + "symbol": "ETC/USDT:USDT", + "currency": "USDT", + "minNotional": 8000000.0, + "maxNotional": 20000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "8", + "initialLeverage": "4", + "notionalCap": "20000000", + "notionalFloor": "8000000", + "maintMarginRatio": "0.125", + "cum": "422700.0" + } + }, + { + "tier": 9.0, + "symbol": "ETC/USDT:USDT", + "currency": "USDT", + "minNotional": 20000000.0, + "maxNotional": 30000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "30000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.25", + "cum": "2922700.0" + } + }, + { + "tier": 10.0, + "symbol": "ETC/USDT:USDT", + "currency": "USDT", + "minNotional": 30000000.0, + "maxNotional": 50000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "30000000", + "maintMarginRatio": "0.5", + "cum": "10422700.0" + } + } + ], + "ETH/BTC:BTC": [ + { + "tier": 1.0, + "symbol": "ETH/BTC:BTC", + "currency": "BTC", + "minNotional": 0.0, + "maxNotional": 5.0, + "maintenanceMarginRate": 0.005, + "maxLeverage": 100.0, + "info": { + "bracket": "1", + "initialLeverage": "100", + "notionalCap": "5", + "notionalFloor": "0", + "maintMarginRatio": "0.005", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "ETH/BTC:BTC", + "currency": "BTC", + "minNotional": 5.0, + "maxNotional": 10.0, + "maintenanceMarginRate": 0.006, + "maxLeverage": 75.0, + "info": { + "bracket": "2", + "initialLeverage": "75", + "notionalCap": "10", + "notionalFloor": "5", + "maintMarginRatio": "0.006", + "cum": "0.005" + } + }, + { + "tier": 3.0, + "symbol": "ETH/BTC:BTC", + "currency": "BTC", + "minNotional": 10.0, + "maxNotional": 100.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, + "info": { + "bracket": "3", + "initialLeverage": "50", + "notionalCap": "100", + "notionalFloor": "10", + "maintMarginRatio": "0.01", + "cum": "0.045" + } + }, + { + "tier": 4.0, + "symbol": "ETH/BTC:BTC", + "currency": "BTC", + "minNotional": 100.0, + "maxNotional": 400.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "400", + "notionalFloor": "100", + "maintMarginRatio": "0.02", + "cum": "1.045" + } + }, + { + "tier": 5.0, + "symbol": "ETH/BTC:BTC", + "currency": "BTC", + "minNotional": 400.0, + "maxNotional": 800.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "800", + "notionalFloor": "400", + "maintMarginRatio": "0.025", + "cum": "3.045" + } + }, + { + "tier": 6.0, + "symbol": "ETH/BTC:BTC", + "currency": "BTC", + "minNotional": 800.0, + "maxNotional": 1500.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 8.0, + "info": { + "bracket": "6", + "initialLeverage": "8", + "notionalCap": "1500", + "notionalFloor": "800", + "maintMarginRatio": "0.05", + "cum": "23.045" + } + }, + { + "tier": 7.0, + "symbol": "ETH/BTC:BTC", + "currency": "BTC", + "minNotional": 1500.0, + "maxNotional": 2000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "7", + "initialLeverage": "5", + "notionalCap": "2000", + "notionalFloor": "1500", + "maintMarginRatio": "0.1", + "cum": "98.045" + } + }, + { + "tier": 8.0, + "symbol": "ETH/BTC:BTC", + "currency": "BTC", + "minNotional": 2000.0, + "maxNotional": 3000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "8", + "initialLeverage": "4", + "notionalCap": "3000", + "notionalFloor": "2000", + "maintMarginRatio": "0.125", + "cum": "148.045" + } + }, + { + "tier": 9.0, + "symbol": "ETH/BTC:BTC", + "currency": "BTC", + "minNotional": 3000.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000", + "notionalFloor": "3000", + "maintMarginRatio": "0.25", + "cum": "523.045" + } + }, + { + "tier": 10.0, + "symbol": "ETH/BTC:BTC", + "currency": "BTC", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.5", + "cum": "1773.045" + } + } + ], + "ETH/USDC:USDC": [ + { + "tier": 1.0, + "symbol": "ETH/USDC:USDC", + "currency": "USDC", + "minNotional": 0.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.004, + "maxLeverage": 125.0, + "info": { + "bracket": "1", + "initialLeverage": "125", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.004", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "ETH/USDC:USDC", + "currency": "USDC", + "minNotional": 50000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.005, + "maxLeverage": 100.0, + "info": { + "bracket": "2", + "initialLeverage": "100", + "notionalCap": "500000", + "notionalFloor": "50000", + "maintMarginRatio": "0.005", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "ETH/USDC:USDC", + "currency": "USDC", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.0065, + "maxLeverage": 75.0, + "info": { + "bracket": "3", + "initialLeverage": "75", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.0065", + "cum": "800.0" + } + }, + { + "tier": 4.0, + "symbol": "ETH/USDC:USDC", + "currency": "USDC", + "minNotional": 1000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, + "info": { + "bracket": "4", + "initialLeverage": "50", + "notionalCap": "5000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.01", + "cum": "4300.0" + } + }, + { + "tier": 5.0, + "symbol": "ETH/USDC:USDC", + "currency": "USDC", + "minNotional": 5000000.0, + "maxNotional": 50000000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 20.0, + "info": { + "bracket": "5", + "initialLeverage": "20", + "notionalCap": "50000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.02", + "cum": "54300.0" + } + }, + { + "tier": 6.0, + "symbol": "ETH/USDC:USDC", + "currency": "USDC", + "minNotional": 50000000.0, + "maxNotional": 100000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "6", + "initialLeverage": "10", + "notionalCap": "100000000", + "notionalFloor": "50000000", + "maintMarginRatio": "0.05", + "cum": "1554300.0" + } + }, + { + "tier": 7.0, + "symbol": "ETH/USDC:USDC", + "currency": "USDC", + "minNotional": 100000000.0, + "maxNotional": 150000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "7", + "initialLeverage": "5", + "notionalCap": "150000000", + "notionalFloor": "100000000", + "maintMarginRatio": "0.1", + "cum": "6554300.0" + } + }, + { + "tier": 8.0, + "symbol": "ETH/USDC:USDC", + "currency": "USDC", + "minNotional": 150000000.0, + "maxNotional": 300000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "8", + "initialLeverage": "4", + "notionalCap": "300000000", + "notionalFloor": "150000000", + "maintMarginRatio": "0.125", + "cum": "10304300.0" + } + }, + { + "tier": 9.0, + "symbol": "ETH/USDC:USDC", + "currency": "USDC", + "minNotional": 300000000.0, + "maxNotional": 400000000.0, + "maintenanceMarginRate": 0.15, + "maxLeverage": 3.0, + "info": { + "bracket": "9", + "initialLeverage": "3", + "notionalCap": "400000000", + "notionalFloor": "300000000", + "maintMarginRatio": "0.15", + "cum": "17804300.0" + } + }, + { + "tier": 10.0, + "symbol": "ETH/USDC:USDC", + "currency": "USDC", + "minNotional": 400000000.0, + "maxNotional": 500000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "10", + "initialLeverage": "2", + "notionalCap": "500000000", + "notionalFloor": "400000000", + "maintMarginRatio": "0.25", + "cum": "57804300.0" + } + }, + { + "tier": 11.0, + "symbol": "ETH/USDC:USDC", + "currency": "USDC", + "minNotional": 500000000.0, + "maxNotional": 800000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "11", + "initialLeverage": "1", + "notionalCap": "800000000", + "notionalFloor": "500000000", + "maintMarginRatio": "0.5", + "cum": "182804300.0" + } + } + ], + "ETH/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "ETH/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.004, + "maxLeverage": 125.0, + "info": { + "bracket": "1", + "initialLeverage": "125", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.004", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "ETH/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.005, + "maxLeverage": 100.0, + "info": { + "bracket": "2", + "initialLeverage": "100", + "notionalCap": "600000", + "notionalFloor": "50000", + "maintMarginRatio": "0.005", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "ETH/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.0065, + "maxLeverage": 75.0, + "info": { + "bracket": "3", + "initialLeverage": "75", + "notionalCap": "3000000", + "notionalFloor": "600000", + "maintMarginRatio": "0.0065", + "cum": "950.0" + } + }, + { + "tier": 4.0, + "symbol": "ETH/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 12000000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, + "info": { + "bracket": "4", + "initialLeverage": "50", + "notionalCap": "12000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.01", + "cum": "11450.0" + } + }, + { + "tier": 5.0, + "symbol": "ETH/USDT:USDT", + "currency": "USDT", + "minNotional": 12000000.0, + "maxNotional": 50000000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "5", + "initialLeverage": "25", + "notionalCap": "50000000", + "notionalFloor": "12000000", + "maintMarginRatio": "0.02", + "cum": "131450.0" + } + }, + { + "tier": 6.0, + "symbol": "ETH/USDT:USDT", + "currency": "USDT", + "minNotional": 50000000.0, + "maxNotional": 65000000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "6", + "initialLeverage": "20", + "notionalCap": "65000000", + "notionalFloor": "50000000", + "maintMarginRatio": "0.025", + "cum": "381450.0" + } + }, + { + "tier": 7.0, + "symbol": "ETH/USDT:USDT", + "currency": "USDT", + "minNotional": 65000000.0, + "maxNotional": 150000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "7", + "initialLeverage": "10", + "notionalCap": "150000000", + "notionalFloor": "65000000", + "maintMarginRatio": "0.05", + "cum": "2006450.0" + } + }, + { + "tier": 8.0, + "symbol": "ETH/USDT:USDT", + "currency": "USDT", + "minNotional": 150000000.0, + "maxNotional": 320000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "8", + "initialLeverage": "5", + "notionalCap": "320000000", + "notionalFloor": "150000000", + "maintMarginRatio": "0.1", + "cum": "9506450.0" + } + }, + { + "tier": 9.0, + "symbol": "ETH/USDT:USDT", + "currency": "USDT", + "minNotional": 320000000.0, + "maxNotional": 400000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "9", + "initialLeverage": "4", + "notionalCap": "400000000", + "notionalFloor": "320000000", + "maintMarginRatio": "0.125", + "cum": "17506450.0" + } + }, + { + "tier": 10.0, + "symbol": "ETH/USDT:USDT", + "currency": "USDT", + "minNotional": 400000000.0, + "maxNotional": 530000000.0, + "maintenanceMarginRate": 0.15, + "maxLeverage": 3.0, + "info": { + "bracket": "10", + "initialLeverage": "3", + "notionalCap": "530000000", + "notionalFloor": "400000000", + "maintMarginRatio": "0.15", + "cum": "27506450.0" + } + }, + { + "tier": 11.0, + "symbol": "ETH/USDT:USDT", + "currency": "USDT", + "minNotional": 530000000.0, + "maxNotional": 800000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "11", + "initialLeverage": "2", + "notionalCap": "800000000", + "notionalFloor": "530000000", + "maintMarginRatio": "0.25", + "cum": "80506450.0" + } + }, + { + "tier": 12.0, + "symbol": "ETH/USDT:USDT", + "currency": "USDT", + "minNotional": 800000000.0, + "maxNotional": 1200000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "12", + "initialLeverage": "1", + "notionalCap": "1200000000", + "notionalFloor": "800000000", + "maintMarginRatio": "0.5", + "cum": "280506450.0" + } + } + ], + "ETH/USDT:USDT-241227": [ + { + "tier": 1.0, + "symbol": "ETH/USDT:USDT-241227", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "ETH/USDT:USDT-241227", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 375000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "375000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "500.0" + } + }, + { + "tier": 3.0, + "symbol": "ETH/USDT:USDT-241227", + "currency": "USDT", + "minNotional": 375000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "2000000", + "notionalFloor": "375000", + "maintMarginRatio": "0.05", + "cum": "11750.0" + } + }, + { + "tier": 4.0, + "symbol": "ETH/USDT:USDT-241227", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "4000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.1", + "cum": "111750.0" + } + }, + { + "tier": 5.0, + "symbol": "ETH/USDT:USDT-241227", + "currency": "USDT", + "minNotional": 4000000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "10000000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.125", + "cum": "211750.0" + } + }, + { + "tier": 6.0, + "symbol": "ETH/USDT:USDT-241227", + "currency": "USDT", + "minNotional": 10000000.0, + "maxNotional": 20000000.0, + "maintenanceMarginRate": 0.15, + "maxLeverage": 3.0, + "info": { + "bracket": "6", + "initialLeverage": "3", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.15", + "cum": "461750.0" + } + }, + { + "tier": 7.0, + "symbol": "ETH/USDT:USDT-241227", + "currency": "USDT", + "minNotional": 20000000.0, + "maxNotional": 40000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "40000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.25", + "cum": "2461750.0" + } + }, + { + "tier": 8.0, + "symbol": "ETH/USDT:USDT-241227", + "currency": "USDT", + "minNotional": 40000000.0, + "maxNotional": 120000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "120000000", + "notionalFloor": "40000000", + "maintMarginRatio": "0.5", + "cum": "12461750.0" + } + } + ], + "ETH/USDT:USDT-250328": [ + { + "tier": 1.0, + "symbol": "ETH/USDT:USDT-250328", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "ETH/USDT:USDT-250328", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 375000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "375000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "500.0" + } + }, + { + "tier": 3.0, + "symbol": "ETH/USDT:USDT-250328", + "currency": "USDT", + "minNotional": 375000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "2000000", + "notionalFloor": "375000", + "maintMarginRatio": "0.05", + "cum": "11750.0" + } + }, + { + "tier": 4.0, + "symbol": "ETH/USDT:USDT-250328", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "4000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.1", + "cum": "111750.0" + } + }, + { + "tier": 5.0, + "symbol": "ETH/USDT:USDT-250328", + "currency": "USDT", + "minNotional": 4000000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "10000000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.125", + "cum": "211750.0" + } + }, + { + "tier": 6.0, + "symbol": "ETH/USDT:USDT-250328", + "currency": "USDT", + "minNotional": 10000000.0, + "maxNotional": 20000000.0, + "maintenanceMarginRate": 0.15, + "maxLeverage": 3.0, + "info": { + "bracket": "6", + "initialLeverage": "3", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.15", + "cum": "461750.0" + } + }, + { + "tier": 7.0, + "symbol": "ETH/USDT:USDT-250328", + "currency": "USDT", + "minNotional": 20000000.0, + "maxNotional": 40000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "40000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.25", + "cum": "2461750.0" + } + }, + { + "tier": 8.0, + "symbol": "ETH/USDT:USDT-250328", + "currency": "USDT", + "minNotional": 40000000.0, + "maxNotional": 120000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "120000000", + "notionalFloor": "40000000", + "maintMarginRatio": "0.5", + "cum": "12461750.0" + } + } + ], + "ETHFI/USDC:USDC": [ + { + "tier": 1.0, + "symbol": "ETHFI/USDC:USDC", + "currency": "USDC", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "ETHFI/USDC:USDC", + "currency": "USDC", + "minNotional": 5000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "ETHFI/USDC:USDC", + "currency": "USDC", + "minNotional": 50000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "600000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "300.0" + } + }, + { + "tier": 4.0, + "symbol": "ETHFI/USDC:USDC", + "currency": "USDC", + "minNotional": 600000.0, + "maxNotional": 1200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "1200000", + "notionalFloor": "600000", + "maintMarginRatio": "0.05", + "cum": "15300.0" + } + }, + { + "tier": 5.0, + "symbol": "ETHFI/USDC:USDC", + "currency": "USDC", + "minNotional": 1200000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "3000000", + "notionalFloor": "1200000", + "maintMarginRatio": "0.1", + "cum": "75300.0" + } + }, + { + "tier": 6.0, + "symbol": "ETHFI/USDC:USDC", + "currency": "USDC", + "minNotional": 3000000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "4000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.125", + "cum": "150300.0" + } + }, + { + "tier": 7.0, + "symbol": "ETHFI/USDC:USDC", + "currency": "USDC", + "minNotional": 4000000.0, + "maxNotional": 6000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "6000000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.25", + "cum": "650300.0" + } + }, + { + "tier": 8.0, + "symbol": "ETHFI/USDC:USDC", + "currency": "USDC", + "minNotional": 6000000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "10000000", + "notionalFloor": "6000000", + "maintMarginRatio": "0.5", + "cum": "2150300.0" + } + } + ], + "ETHFI/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "ETHFI/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "ETHFI/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 40000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "40000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "ETHFI/USDT:USDT", + "currency": "USDT", + "minNotional": 40000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "200000", + "notionalFloor": "40000", + "maintMarginRatio": "0.02", + "cum": "250.0" + } + }, + { + "tier": 4.0, + "symbol": "ETHFI/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "400000", + "notionalFloor": "200000", + "maintMarginRatio": "0.025", + "cum": "1250.0" + } + }, + { + "tier": 5.0, + "symbol": "ETHFI/USDT:USDT", + "currency": "USDT", + "minNotional": 400000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "2000000", + "notionalFloor": "400000", + "maintMarginRatio": "0.05", + "cum": "11250.0" + } + }, + { + "tier": 6.0, + "symbol": "ETHFI/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "4000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.1", + "cum": "111250.0" + } + }, + { + "tier": 7.0, + "symbol": "ETHFI/USDT:USDT", + "currency": "USDT", + "minNotional": 4000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.125", + "cum": "211250.0" + } + }, + { + "tier": 8.0, + "symbol": "ETHFI/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.25", + "cum": "836250.0" + } + }, + { + "tier": 9.0, + "symbol": "ETHFI/USDT:USDT", + "currency": "USDT", + "minNotional": 10000000.0, + "maxNotional": 20000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.5", + "cum": "3336250.0" + } + } + ], + "ETHW/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "ETHW/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "ETHW/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "ETHW/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "ETHW/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "ETHW/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "ETHW/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "16725.0" + } + }, + { + "tier": 7.0, + "symbol": "ETHW/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "ETHW/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "125475.0" + } + }, + { + "tier": 9.0, + "symbol": "ETHW/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "500475.0" + } + } + ], + "FARTCOIN/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "FARTCOIN/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "FARTCOIN/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "FARTCOIN/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "FARTCOIN/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "FARTCOIN/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "FARTCOIN/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "16725.0" + } + }, + { + "tier": 7.0, + "symbol": "FARTCOIN/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "FARTCOIN/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "125475.0" + } + }, + { + "tier": 9.0, + "symbol": "FARTCOIN/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "500475.0" + } + } + ], + "FET/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "FET/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "FET/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "100000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "FET/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "500000", + "notionalFloor": "100000", + "maintMarginRatio": "0.02", + "cum": "550.0" + } + }, + { + "tier": 4.0, + "symbol": "FET/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.025", + "cum": "3050.0" + } + }, + { + "tier": 5.0, + "symbol": "FET/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "5000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.05", + "cum": "28050.0" + } + }, + { + "tier": 6.0, + "symbol": "FET/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.1", + "cum": "278050.0" + } + }, + { + "tier": 7.0, + "symbol": "FET/USDT:USDT", + "currency": "USDT", + "minNotional": 10000000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "12500000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.125", + "cum": "528050.0" + } + }, + { + "tier": 8.0, + "symbol": "FET/USDT:USDT", + "currency": "USDT", + "minNotional": 12500000.0, + "maxNotional": 25000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "25000000", + "notionalFloor": "12500000", + "maintMarginRatio": "0.25", + "cum": "2090550.0" + } + }, + { + "tier": 9.0, + "symbol": "FET/USDT:USDT", + "currency": "USDT", + "minNotional": 25000000.0, + "maxNotional": 50000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "25000000", + "maintMarginRatio": "0.5", + "cum": "8340550.0" + } + } + ], + "FIDA/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "FIDA/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "FIDA/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "FIDA/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "FIDA/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "325.0" + } + }, + { + "tier": 5.0, + "symbol": "FIDA/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "500000", + "notionalFloor": "100000", + "maintMarginRatio": "0.05", + "cum": "2825.0" + } + }, + { + "tier": 6.0, + "symbol": "FIDA/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1", + "cum": "27825.0" + } + }, + { + "tier": 7.0, + "symbol": "FIDA/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 1250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "1250000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.125", + "cum": "52825.0" + } + }, + { + "tier": 8.0, + "symbol": "FIDA/USDT:USDT", + "currency": "USDT", + "minNotional": 1250000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "1250000", + "maintMarginRatio": "0.25", + "cum": "209075.0" + } + }, + { + "tier": 9.0, + "symbol": "FIDA/USDT:USDT", + "currency": "USDT", + "minNotional": 2500000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "5000000", + "notionalFloor": "2500000", + "maintMarginRatio": "0.5", + "cum": "834075.0" + } + } + ], + "FIL/USDC:USDC": [ + { + "tier": 1.0, + "symbol": "FIL/USDC:USDC", + "currency": "USDC", + "minNotional": 0.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.006, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.006", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "FIL/USDC:USDC", + "currency": "USDC", + "minNotional": 50000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 40.0, + "info": { + "bracket": "2", + "initialLeverage": "40", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.01", + "cum": "200.0" + } + }, + { + "tier": 3.0, + "symbol": "FIL/USDC:USDC", + "currency": "USDC", + "minNotional": 250000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "600000", + "notionalFloor": "250000", + "maintMarginRatio": "0.02", + "cum": "2700.0" + } + }, + { + "tier": 4.0, + "symbol": "FIL/USDC:USDC", + "currency": "USDC", + "minNotional": 600000.0, + "maxNotional": 1200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "1200000", + "notionalFloor": "600000", + "maintMarginRatio": "0.05", + "cum": "20700.0" + } + }, + { + "tier": 5.0, + "symbol": "FIL/USDC:USDC", + "currency": "USDC", + "minNotional": 1200000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "3000000", + "notionalFloor": "1200000", + "maintMarginRatio": "0.1", + "cum": "80700.0" + } + }, + { + "tier": 6.0, + "symbol": "FIL/USDC:USDC", + "currency": "USDC", + "minNotional": 3000000.0, + "maxNotional": 6000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "6000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.125", + "cum": "155700.0" + } + }, + { + "tier": 7.0, + "symbol": "FIL/USDC:USDC", + "currency": "USDC", + "minNotional": 6000000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.165, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "6000000", + "maintMarginRatio": "0.165", + "cum": "395700.0" + } + }, + { + "tier": 8.0, + "symbol": "FIL/USDC:USDC", + "currency": "USDC", + "minNotional": 10000000.0, + "maxNotional": 20000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1245700.0" + } + }, + { + "tier": 9.0, + "symbol": "FIL/USDC:USDC", + "currency": "USDC", + "minNotional": 20000000.0, + "maxNotional": 30000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.5", + "cum": "6245700.0" + } + } + ], + "FIL/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "FIL/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.006, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.006", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "FIL/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.01", + "cum": "200.0" + } + }, + { + "tier": 3.0, + "symbol": "FIL/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 350000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 40.0, + "info": { + "bracket": "3", + "initialLeverage": "40", + "notionalCap": "350000", + "notionalFloor": "250000", + "maintMarginRatio": "0.015", + "cum": "1450.0" + } + }, + { + "tier": 4.0, + "symbol": "FIL/USDT:USDT", + "currency": "USDT", + "minNotional": 350000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "4", + "initialLeverage": "25", + "notionalCap": "600000", + "notionalFloor": "350000", + "maintMarginRatio": "0.02", + "cum": "3200.0" + } + }, + { + "tier": 5.0, + "symbol": "FIL/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "5", + "initialLeverage": "20", + "notionalCap": "1000000", + "notionalFloor": "600000", + "maintMarginRatio": "0.025", + "cum": "6200.0" + } + }, + { + "tier": 6.0, + "symbol": "FIL/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "6", + "initialLeverage": "10", + "notionalCap": "5000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.05", + "cum": "31200.0" + } + }, + { + "tier": 7.0, + "symbol": "FIL/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "7", + "initialLeverage": "5", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.1", + "cum": "281200.0" + } + }, + { + "tier": 8.0, + "symbol": "FIL/USDT:USDT", + "currency": "USDT", + "minNotional": 10000000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "8", + "initialLeverage": "4", + "notionalCap": "12500000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.125", + "cum": "531200.0" + } + }, + { + "tier": 9.0, + "symbol": "FIL/USDT:USDT", + "currency": "USDT", + "minNotional": 12500000.0, + "maxNotional": 25000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "25000000", + "notionalFloor": "12500000", + "maintMarginRatio": "0.25", + "cum": "2093700.0" + } + }, + { + "tier": 10.0, + "symbol": "FIL/USDT:USDT", + "currency": "USDT", + "minNotional": 25000000.0, + "maxNotional": 50000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "50000000", + "notionalFloor": "25000000", + "maintMarginRatio": "0.5", + "cum": "8343700.0" + } + } + ], + "FIO/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "FIO/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "FIO/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "FIO/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "FIO/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "FIO/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "FIO/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "16725.0" + } + }, + { + "tier": 7.0, + "symbol": "FIO/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "FIO/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "125475.0" + } + }, + { + "tier": 9.0, + "symbol": "FIO/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "500475.0" + } + } + ], + "FLM/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "FLM/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": "FLM/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "20000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "FLM/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "20000", + "maintMarginRatio": "0.025", + "cum": "125.0" + } + }, + { + "tier": 4.0, + "symbol": "FLM/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "200000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "750.0" + } + }, + { + "tier": 5.0, + "symbol": "FLM/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "400000", + "notionalFloor": "200000", + "maintMarginRatio": "0.1", + "cum": "10750.0" + } + }, + { + "tier": 6.0, + "symbol": "FLM/USDT:USDT", + "currency": "USDT", + "minNotional": 400000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "400000", + "maintMarginRatio": "0.125", + "cum": "20750.0" + } + }, + { + "tier": 7.0, + "symbol": "FLM/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.25", + "cum": "83250.0" + } + }, + { + "tier": 8.0, + "symbol": "FLM/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "333250.0" + } + } + ], + "FLOW/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "FLOW/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "FLOW/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "FLOW/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "FLOW/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "325.0" + } + }, + { + "tier": 5.0, + "symbol": "FLOW/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "500000", + "notionalFloor": "100000", + "maintMarginRatio": "0.05", + "cum": "2825.0" + } + }, + { + "tier": 6.0, + "symbol": "FLOW/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1", + "cum": "27825.0" + } + }, + { + "tier": 7.0, + "symbol": "FLOW/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 1250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "1250000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.125", + "cum": "52825.0" + } + }, + { + "tier": 8.0, + "symbol": "FLOW/USDT:USDT", + "currency": "USDT", + "minNotional": 1250000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "1250000", + "maintMarginRatio": "0.25", + "cum": "209075.0" + } + }, + { + "tier": 9.0, + "symbol": "FLOW/USDT:USDT", + "currency": "USDT", + "minNotional": 2500000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "5000000", + "notionalFloor": "2500000", + "maintMarginRatio": "0.5", + "cum": "834075.0" + } + } + ], + "FLUX/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "FLUX/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "FLUX/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "FLUX/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "20000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "FLUX/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 40000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "40000", + "notionalFloor": "20000", + "maintMarginRatio": "0.025", + "cum": "175.0" + } + }, + { + "tier": 5.0, + "symbol": "FLUX/USDT:USDT", + "currency": "USDT", + "minNotional": 40000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "200000", + "notionalFloor": "40000", + "maintMarginRatio": "0.05", + "cum": "1175.0" + } + }, + { + "tier": 6.0, + "symbol": "FLUX/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "400000", + "notionalFloor": "200000", + "maintMarginRatio": "0.1", + "cum": "11175.0" + } + }, + { + "tier": 7.0, + "symbol": "FLUX/USDT:USDT", + "currency": "USDT", + "minNotional": 400000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "400000", + "maintMarginRatio": "0.125", + "cum": "21175.0" + } + }, + { + "tier": 8.0, + "symbol": "FLUX/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.25", + "cum": "83675.0" + } + }, + { + "tier": 9.0, + "symbol": "FLUX/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "333675.0" + } + } + ], + "FTM/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "FTM/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.006, + "maxLeverage": 10.0, + "info": { + "bracket": "1", + "initialLeverage": "10", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.006", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "FTM/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 9.0, + "info": { + "bracket": "2", + "initialLeverage": "9", + "notionalCap": "50000", + "notionalFloor": "5000", + "maintMarginRatio": "0.01", + "cum": "20.0" + } + }, + { + "tier": 3.0, + "symbol": "FTM/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 8.0, + "info": { + "bracket": "3", + "initialLeverage": "8", + "notionalCap": "80000", + "notionalFloor": "50000", + "maintMarginRatio": "0.015", + "cum": "270.0" + } + }, + { + "tier": 4.0, + "symbol": "FTM/USDT:USDT", + "currency": "USDT", + "minNotional": 80000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 7.0, + "info": { + "bracket": "4", + "initialLeverage": "7", + "notionalCap": "300000", + "notionalFloor": "80000", + "maintMarginRatio": "0.02", + "cum": "670.0" + } + }, + { + "tier": 5.0, + "symbol": "FTM/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 6.0, + "info": { + "bracket": "5", + "initialLeverage": "6", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.025", + "cum": "2170.0" + } + }, + { + "tier": 6.0, + "symbol": "FTM/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "3000000", + "notionalFloor": "600000", + "maintMarginRatio": "0.05", + "cum": "17170.0" + } + }, + { + "tier": 7.0, + "symbol": "FTM/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 6000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "6000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.1", + "cum": "167170.0" + } + }, + { + "tier": 8.0, + "symbol": "FTM/USDT:USDT", + "currency": "USDT", + "minNotional": 6000000.0, + "maxNotional": 7000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "7000000", + "notionalFloor": "6000000", + "maintMarginRatio": "0.125", + "cum": "317170.0" + } + }, + { + "tier": 9.0, + "symbol": "FTM/USDT:USDT", + "currency": "USDT", + "minNotional": 7000000.0, + "maxNotional": 7200000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "7200000", + "notionalFloor": "7000000", + "maintMarginRatio": "0.25", + "cum": "1192170.0" + } + }, + { + "tier": 10.0, + "symbol": "FTM/USDT:USDT", + "currency": "USDT", + "minNotional": 7200000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "7500000", + "notionalFloor": "7200000", + "maintMarginRatio": "0.5", + "cum": "2992170.0" + } + } + ], + "FTT/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "FTT/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 15000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 8.0, + "info": { + "bracket": "1", + "initialLeverage": "8", + "notionalCap": "15000", + "notionalFloor": "0", + "maintMarginRatio": "0.025", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "FTT/USDT:USDT", + "currency": "USDT", + "minNotional": 15000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, + "info": { + "bracket": "2", + "initialLeverage": "6", + "notionalCap": "50000", + "notionalFloor": "15000", + "maintMarginRatio": "0.05", + "cum": "375.0" + } + }, + { + "tier": 3.0, + "symbol": "FTT/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "200000", + "notionalFloor": "50000", + "maintMarginRatio": "0.1", + "cum": "2875.0" + } + }, + { + "tier": 4.0, + "symbol": "FTT/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 2.0, + "info": { + "bracket": "4", + "initialLeverage": "2", + "notionalCap": "800000", + "notionalFloor": "200000", + "maintMarginRatio": "0.125", + "cum": "7875.0" + } + }, + { + "tier": 5.0, + "symbol": "FTT/USDT:USDT", + "currency": "USDT", + "minNotional": 800000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "5", + "initialLeverage": "1", + "notionalCap": "1500000", + "notionalFloor": "800000", + "maintMarginRatio": "0.5", + "cum": "307875.0" + } + } + ], + "FXS/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "FXS/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 20.0, + "info": { + "bracket": "1", + "initialLeverage": "20", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.02", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "FXS/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 15.0, + "info": { + "bracket": "2", + "initialLeverage": "15", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "FXS/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "650.0" + } + }, + { + "tier": 4.0, + "symbol": "FXS/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5650.0" + } + }, + { + "tier": 5.0, + "symbol": "FXS/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 2.0, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11900.0" + } + }, + { + "tier": 6.0, + "symbol": "FXS/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "5000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386900.0" + } + } + ], + "G/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "G/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": "G/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "20000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "G/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "20000", + "maintMarginRatio": "0.025", + "cum": "125.0" + } + }, + { + "tier": 4.0, + "symbol": "G/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "200000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "750.0" + } + }, + { + "tier": 5.0, + "symbol": "G/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "400000", + "notionalFloor": "200000", + "maintMarginRatio": "0.1", + "cum": "10750.0" + } + }, + { + "tier": 6.0, + "symbol": "G/USDT:USDT", + "currency": "USDT", + "minNotional": 400000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "400000", + "maintMarginRatio": "0.125", + "cum": "20750.0" + } + }, + { + "tier": 7.0, + "symbol": "G/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.25", + "cum": "83250.0" + } + }, + { + "tier": 8.0, + "symbol": "G/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "333250.0" + } + } + ], + "GALA/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "GALA/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.006, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.006", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "GALA/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "40.0" + } + }, + { + "tier": 3.0, + "symbol": "GALA/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 40.0, + "info": { + "bracket": "3", + "initialLeverage": "40", + "notionalCap": "80000", + "notionalFloor": "50000", + "maintMarginRatio": "0.015", + "cum": "290.0" + } + }, + { + "tier": 4.0, + "symbol": "GALA/USDT:USDT", + "currency": "USDT", + "minNotional": 80000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "4", + "initialLeverage": "25", + "notionalCap": "200000", + "notionalFloor": "80000", + "maintMarginRatio": "0.02", + "cum": "690.0" + } + }, + { + "tier": 5.0, + "symbol": "GALA/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 900000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "5", + "initialLeverage": "20", + "notionalCap": "900000", + "notionalFloor": "200000", + "maintMarginRatio": "0.025", + "cum": "1690.0" + } + }, + { + "tier": 6.0, + "symbol": "GALA/USDT:USDT", + "currency": "USDT", + "minNotional": 900000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "6", + "initialLeverage": "10", + "notionalCap": "2000000", + "notionalFloor": "900000", + "maintMarginRatio": "0.05", + "cum": "24190.0" + } + }, + { + "tier": 7.0, + "symbol": "GALA/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "7", + "initialLeverage": "5", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.1", + "cum": "124190.0" + } + }, + { + "tier": 8.0, + "symbol": "GALA/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 6000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "8", + "initialLeverage": "4", + "notionalCap": "6000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.125", + "cum": "249190.0" + } + }, + { + "tier": 9.0, + "symbol": "GALA/USDT:USDT", + "currency": "USDT", + "minNotional": 6000000.0, + "maxNotional": 18000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "18000000", + "notionalFloor": "6000000", + "maintMarginRatio": "0.25", + "cum": "999190.0" + } + }, + { + "tier": 10.0, + "symbol": "GALA/USDT:USDT", + "currency": "USDT", + "minNotional": 18000000.0, + "maxNotional": 30000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "30000000", + "notionalFloor": "18000000", + "maintMarginRatio": "0.5", + "cum": "5499190.0" + } + } + ], + "GAS/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "GAS/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "GAS/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "GAS/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "GAS/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "GAS/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "GAS/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "16725.0" + } + }, + { + "tier": 7.0, + "symbol": "GAS/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "GAS/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "125475.0" + } + }, + { + "tier": 9.0, + "symbol": "GAS/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "500475.0" + } + } + ], + "GHST/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "GHST/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "GHST/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "GHST/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "20000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "GHST/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 40000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "40000", + "notionalFloor": "20000", + "maintMarginRatio": "0.025", + "cum": "175.0" + } + }, + { + "tier": 5.0, + "symbol": "GHST/USDT:USDT", + "currency": "USDT", + "minNotional": 40000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "200000", + "notionalFloor": "40000", + "maintMarginRatio": "0.05", + "cum": "1175.0" + } + }, + { + "tier": 6.0, + "symbol": "GHST/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "400000", + "notionalFloor": "200000", + "maintMarginRatio": "0.1", + "cum": "11175.0" + } + }, + { + "tier": 7.0, + "symbol": "GHST/USDT:USDT", + "currency": "USDT", + "minNotional": 400000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "400000", + "maintMarginRatio": "0.125", + "cum": "21175.0" + } + }, + { + "tier": 8.0, + "symbol": "GHST/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.25", + "cum": "83675.0" + } + }, + { + "tier": 9.0, + "symbol": "GHST/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "333675.0" + } + } + ], + "GLM/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "GLM/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": "GLM/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "20000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "GLM/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "30000", + "notionalFloor": "20000", + "maintMarginRatio": "0.025", + "cum": "125.0" + } + }, + { + "tier": 4.0, + "symbol": "GLM/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "30000", + "maintMarginRatio": "0.05", + "cum": "875.0" + } + }, + { + "tier": 5.0, + "symbol": "GLM/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "15875.0" + } + }, + { + "tier": 6.0, + "symbol": "GLM/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "30875.0" + } + }, + { + "tier": 7.0, + "symbol": "GLM/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "124625.0" + } + }, + { + "tier": 8.0, + "symbol": "GLM/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "499625.0" + } + } + ], + "GLMR/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "GLMR/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.03, + "maxLeverage": 20.0, + "info": { + "bracket": "1", + "initialLeverage": "20", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.03", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "GLMR/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "200000", + "notionalFloor": "10000", + "maintMarginRatio": "0.05", + "cum": "200.0" + } + }, + { + "tier": 3.0, + "symbol": "GLMR/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "200000", + "maintMarginRatio": "0.1", + "cum": "10200.0" + } + }, + { + "tier": 4.0, + "symbol": "GLMR/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "4", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "22700.0" + } + }, + { + "tier": 5.0, + "symbol": "GLMR/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "147700.0" + } + }, + { + "tier": 6.0, + "symbol": "GLMR/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 3500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "3500000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.5", + "cum": "897700.0" + } + } + ], + "GMT/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "GMT/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "0", + "maintMarginRatio": "0.015", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "GMT/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 150000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "500.0" + } + }, + { + "tier": 3.0, + "symbol": "GMT/USDT:USDT", + "currency": "USDT", + "minNotional": 150000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "600000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4250.0" + } + }, + { + "tier": 4.0, + "symbol": "GMT/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 1600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "1600000", + "notionalFloor": "600000", + "maintMarginRatio": "0.1", + "cum": "34250.0" + } + }, + { + "tier": 5.0, + "symbol": "GMT/USDT:USDT", + "currency": "USDT", + "minNotional": 1600000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "2000000", + "notionalFloor": "1600000", + "maintMarginRatio": "0.125", + "cum": "74250.0" + } + }, + { + "tier": 6.0, + "symbol": "GMT/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "4000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.25", + "cum": "324250.0" + } + }, + { + "tier": 7.0, + "symbol": "GMT/USDT:USDT", + "currency": "USDT", + "minNotional": 4000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "5000000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.5", + "cum": "1324250.0" + } + } + ], + "GMX/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "GMX/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.02", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "GMX/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "GMX/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 480000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "480000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "650.0" + } + }, + { + "tier": 4.0, + "symbol": "GMX/USDT:USDT", + "currency": "USDT", + "minNotional": 480000.0, + "maxNotional": 1280000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "1280000", + "notionalFloor": "480000", + "maintMarginRatio": "0.1", + "cum": "24650.0" + } + }, + { + "tier": 5.0, + "symbol": "GMX/USDT:USDT", + "currency": "USDT", + "minNotional": 1280000.0, + "maxNotional": 1600000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "1600000", + "notionalFloor": "1280000", + "maintMarginRatio": "0.125", + "cum": "56650.0" + } + }, + { + "tier": 6.0, + "symbol": "GMX/USDT:USDT", + "currency": "USDT", + "minNotional": 1600000.0, + "maxNotional": 4800000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "4800000", + "notionalFloor": "1600000", + "maintMarginRatio": "0.25", + "cum": "256650.0" + } + }, + { + "tier": 7.0, + "symbol": "GMX/USDT:USDT", + "currency": "USDT", + "minNotional": 4800000.0, + "maxNotional": 8000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "8000000", + "notionalFloor": "4800000", + "maintMarginRatio": "0.5", + "cum": "1456650.0" + } + } + ], + "GOAT/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "GOAT/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "GOAT/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "80000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "GOAT/USDT:USDT", + "currency": "USDT", + "minNotional": 80000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "400000", + "notionalFloor": "80000", + "maintMarginRatio": "0.02", + "cum": "450.0" + } + }, + { + "tier": 4.0, + "symbol": "GOAT/USDT:USDT", + "currency": "USDT", + "minNotional": 400000.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "800000", + "notionalFloor": "400000", + "maintMarginRatio": "0.025", + "cum": "2450.0" + } + }, + { + "tier": 5.0, + "symbol": "GOAT/USDT:USDT", + "currency": "USDT", + "minNotional": 800000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "4000000", + "notionalFloor": "800000", + "maintMarginRatio": "0.05", + "cum": "22450.0" + } + }, + { + "tier": 6.0, + "symbol": "GOAT/USDT:USDT", + "currency": "USDT", + "minNotional": 4000000.0, + "maxNotional": 8000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "8000000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.1", + "cum": "222450.0" + } + }, + { + "tier": 7.0, + "symbol": "GOAT/USDT:USDT", + "currency": "USDT", + "minNotional": 8000000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "10000000", + "notionalFloor": "8000000", + "maintMarginRatio": "0.125", + "cum": "422450.0" + } + }, + { + "tier": 8.0, + "symbol": "GOAT/USDT:USDT", + "currency": "USDT", + "minNotional": 10000000.0, + "maxNotional": 20000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1672450.0" + } + }, + { + "tier": 9.0, + "symbol": "GOAT/USDT:USDT", + "currency": "USDT", + "minNotional": 20000000.0, + "maxNotional": 40000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "40000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.5", + "cum": "6672450.0" + } + } + ], + "GRASS/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "GRASS/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "GRASS/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "GRASS/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 150000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "150000", + "notionalFloor": "30000", + "maintMarginRatio": "0.02", + "cum": "200.0" + } + }, + { + "tier": 4.0, + "symbol": "GRASS/USDT:USDT", + "currency": "USDT", + "minNotional": 150000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "300000", + "notionalFloor": "150000", + "maintMarginRatio": "0.025", + "cum": "950.0" + } + }, + { + "tier": 5.0, + "symbol": "GRASS/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "1500000", + "notionalFloor": "300000", + "maintMarginRatio": "0.05", + "cum": "8450.0" + } + }, + { + "tier": 6.0, + "symbol": "GRASS/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.1", + "cum": "83450.0" + } + }, + { + "tier": 7.0, + "symbol": "GRASS/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 3750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "3750000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.125", + "cum": "158450.0" + } + }, + { + "tier": 8.0, + "symbol": "GRASS/USDT:USDT", + "currency": "USDT", + "minNotional": 3750000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "3750000", + "maintMarginRatio": "0.25", + "cum": "627200.0" + } + }, + { + "tier": 9.0, + "symbol": "GRASS/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 15000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "15000000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "2502200.0" + } + } + ], + "GRT/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "GRT/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": "GRT/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "GRT/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "400000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1300.0" + } + }, + { + "tier": 4.0, + "symbol": "GRT/USDT:USDT", + "currency": "USDT", + "minNotional": 400000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "1000000", + "notionalFloor": "400000", + "maintMarginRatio": "0.1", + "cum": "21300.0" + } + }, + { + "tier": 5.0, + "symbol": "GRT/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.125", + "cum": "46300.0" + } + }, + { + "tier": 6.0, + "symbol": "GRT/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 6000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "6000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.25", + "cum": "296300.0" + } + }, + { + "tier": 7.0, + "symbol": "GRT/USDT:USDT", + "currency": "USDT", + "minNotional": 6000000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "10000000", + "notionalFloor": "6000000", + "maintMarginRatio": "0.5", + "cum": "1796300.0" + } + } + ], + "GTC/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "GTC/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "GTC/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "GTC/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "GTC/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "GTC/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "GTC/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "16725.0" + } + }, + { + "tier": 7.0, + "symbol": "GTC/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "GTC/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "125475.0" + } + }, + { + "tier": 9.0, + "symbol": "GTC/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "500475.0" + } + } + ], + "HBAR/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "HBAR/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "HBAR/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "80000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "HBAR/USDT:USDT", + "currency": "USDT", + "minNotional": 80000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "400000", + "notionalFloor": "80000", + "maintMarginRatio": "0.02", + "cum": "450.0" + } + }, + { + "tier": 4.0, + "symbol": "HBAR/USDT:USDT", + "currency": "USDT", + "minNotional": 400000.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "800000", + "notionalFloor": "400000", + "maintMarginRatio": "0.025", + "cum": "2450.0" + } + }, + { + "tier": 5.0, + "symbol": "HBAR/USDT:USDT", + "currency": "USDT", + "minNotional": 800000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "4000000", + "notionalFloor": "800000", + "maintMarginRatio": "0.05", + "cum": "22450.0" + } + }, + { + "tier": 6.0, + "symbol": "HBAR/USDT:USDT", + "currency": "USDT", + "minNotional": 4000000.0, + "maxNotional": 8000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "8000000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.1", + "cum": "222450.0" + } + }, + { + "tier": 7.0, + "symbol": "HBAR/USDT:USDT", + "currency": "USDT", + "minNotional": 8000000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "10000000", + "notionalFloor": "8000000", + "maintMarginRatio": "0.125", + "cum": "422450.0" + } + }, + { + "tier": 8.0, + "symbol": "HBAR/USDT:USDT", + "currency": "USDT", + "minNotional": 10000000.0, + "maxNotional": 20000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1672450.0" + } + }, + { + "tier": 9.0, + "symbol": "HBAR/USDT:USDT", + "currency": "USDT", + "minNotional": 20000000.0, + "maxNotional": 40000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "40000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.5", + "cum": "6672450.0" + } + } + ], + "HFT/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "HFT/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 20.0, + "info": { + "bracket": "1", + "initialLeverage": "20", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.02", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "HFT/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 15.0, + "info": { + "bracket": "2", + "initialLeverage": "15", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "HFT/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "200000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "650.0" + } + }, + { + "tier": 4.0, + "symbol": "HFT/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "200000", + "maintMarginRatio": "0.1", + "cum": "10650.0" + } + }, + { + "tier": 5.0, + "symbol": "HFT/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "23150.0" + } + }, + { + "tier": 6.0, + "symbol": "HFT/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "148150.0" + } + }, + { + "tier": 7.0, + "symbol": "HFT/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "5000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.5", + "cum": "898150.0" + } + } + ], + "HIFI/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "HIFI/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": "HIFI/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "HIFI/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "200000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "675.0" + } + }, + { + "tier": 4.0, + "symbol": "HIFI/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "200000", + "maintMarginRatio": "0.1", + "cum": "10675.0" + } + }, + { + "tier": 5.0, + "symbol": "HIFI/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "23175.0" + } + }, + { + "tier": 6.0, + "symbol": "HIFI/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "148175.0" + } + }, + { + "tier": 7.0, + "symbol": "HIFI/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 3500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "3500000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.5", + "cum": "898175.0" + } + } + ], + "HIGH/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "HIGH/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.02", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "HIGH/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "HIGH/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "400000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "650.0" + } + }, + { + "tier": 4.0, + "symbol": "HIGH/USDT:USDT", + "currency": "USDT", + "minNotional": 400000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "1000000", + "notionalFloor": "400000", + "maintMarginRatio": "0.1", + "cum": "20650.0" + } + }, + { + "tier": 5.0, + "symbol": "HIGH/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.125", + "cum": "45650.0" + } + }, + { + "tier": 6.0, + "symbol": "HIGH/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 6000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "6000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.25", + "cum": "295650.0" + } + }, + { + "tier": 7.0, + "symbol": "HIGH/USDT:USDT", + "currency": "USDT", + "minNotional": 6000000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "10000000", + "notionalFloor": "6000000", + "maintMarginRatio": "0.5", + "cum": "1795650.0" + } + } + ], + "HIPPO/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "HIPPO/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "HIPPO/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 16000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "16000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "HIPPO/USDT:USDT", + "currency": "USDT", + "minNotional": 16000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "80000", + "notionalFloor": "16000", + "maintMarginRatio": "0.02", + "cum": "105.0" + } + }, + { + "tier": 4.0, + "symbol": "HIPPO/USDT:USDT", + "currency": "USDT", + "minNotional": 80000.0, + "maxNotional": 160000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "160000", + "notionalFloor": "80000", + "maintMarginRatio": "0.025", + "cum": "505.0" + } + }, + { + "tier": 5.0, + "symbol": "HIPPO/USDT:USDT", + "currency": "USDT", + "minNotional": 160000.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "800000", + "notionalFloor": "160000", + "maintMarginRatio": "0.05", + "cum": "4505.0" + } + }, + { + "tier": 6.0, + "symbol": "HIPPO/USDT:USDT", + "currency": "USDT", + "minNotional": 800000.0, + "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "150000000", - "notionalFloor": "100000000", + "notionalCap": "1600000", + "notionalFloor": "800000", "maintMarginRatio": "0.1", - "cum": "6554300.0" + "cum": "44505.0" } }, { - "tier": 8.0, - "currency": "USDC", - "minNotional": 150000000.0, - "maxNotional": 300000000.0, + "tier": 7.0, + "symbol": "HIPPO/USDT:USDT", + "currency": "USDT", + "minNotional": 1600000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "300000000", - "notionalFloor": "150000000", + "notionalCap": "2000000", + "notionalFloor": "1600000", "maintMarginRatio": "0.125", - "cum": "10304300.0" - } - }, - { - "tier": 9.0, - "currency": "USDC", - "minNotional": 300000000.0, - "maxNotional": 400000000.0, - "maintenanceMarginRate": 0.15, - "maxLeverage": 3.0, - "info": { - "bracket": "9", - "initialLeverage": "3", - "notionalCap": "400000000", - "notionalFloor": "300000000", - "maintMarginRatio": "0.15", - "cum": "17804300.0" + "cum": "84505.0" } }, { - "tier": 10.0, - "currency": "USDC", - "minNotional": 400000000.0, - "maxNotional": 500000000.0, + "tier": 8.0, + "symbol": "HIPPO/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "10", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "500000000", - "notionalFloor": "400000000", + "notionalCap": "4000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.25", - "cum": "57804300.0" + "cum": "334505.0" } }, { - "tier": 11.0, - "currency": "USDC", - "minNotional": 500000000.0, - "maxNotional": 800000000.0, + "tier": 9.0, + "symbol": "HIPPO/USDT:USDT", + "currency": "USDT", + "minNotional": 4000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "11", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "800000000", - "notionalFloor": "500000000", + "notionalCap": "8000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "182804300.0" + "cum": "1334505.0" } } ], - "ETH/USDT:USDT": [ + "HIVE/USDT:USDT": [ { "tier": 1.0, + "symbol": "HIVE/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.004, - "maxLeverage": 125.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "125", - "notionalCap": "50000", + "initialLeverage": "75", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.004", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "HIVE/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 600000.0, - "maintenanceMarginRate": 0.005, - "maxLeverage": 100.0, - "info": { - "bracket": "2", - "initialLeverage": "100", - "notionalCap": "600000", - "notionalFloor": "50000", - "maintMarginRatio": "0.005", - "cum": "50.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 3000000.0, - "maintenanceMarginRate": 0.0065, - "maxLeverage": 75.0, - "info": { - "bracket": "3", - "initialLeverage": "75", - "notionalCap": "3000000", - "notionalFloor": "600000", - "maintMarginRatio": "0.0065", - "cum": "950.0" - } - }, - { - "tier": 4.0, - "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 12000000.0, - "maintenanceMarginRate": 0.01, + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "50", - "notionalCap": "12000000", - "notionalFloor": "3000000", - "maintMarginRatio": "0.01", - "cum": "11450.0" + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" } }, { - "tier": 5.0, + "tier": 3.0, + "symbol": "HIVE/USDT:USDT", "currency": "USDT", - "minNotional": 12000000.0, - "maxNotional": 50000000.0, + "minNotional": 10000.0, + "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "25", - "notionalCap": "50000000", - "notionalFloor": "12000000", + "notionalCap": "30000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "131450.0" + "cum": "75.0" } }, { - "tier": 6.0, + "tier": 4.0, + "symbol": "HIVE/USDT:USDT", "currency": "USDT", - "minNotional": 50000000.0, - "maxNotional": 65000000.0, + "minNotional": 30000.0, + "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "65000000", - "notionalFloor": "50000000", + "notionalCap": "60000", + "notionalFloor": "30000", "maintMarginRatio": "0.025", - "cum": "381450.0" + "cum": "225.0" } }, { - "tier": 7.0, + "tier": 5.0, + "symbol": "HIVE/USDT:USDT", "currency": "USDT", - "minNotional": 65000000.0, - "maxNotional": 150000000.0, + "minNotional": 60000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "150000000", - "notionalFloor": "65000000", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.05", - "cum": "2006450.0" + "cum": "1725.0" } }, { - "tier": 8.0, + "tier": 6.0, + "symbol": "HIVE/USDT:USDT", "currency": "USDT", - "minNotional": 150000000.0, - "maxNotional": 320000000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "320000000", - "notionalFloor": "150000000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "9506450.0" + "cum": "16725.0" } }, { - "tier": 9.0, + "tier": 7.0, + "symbol": "HIVE/USDT:USDT", "currency": "USDT", - "minNotional": 320000000.0, - "maxNotional": 400000000.0, + "minNotional": 600000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "9", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "400000000", - "notionalFloor": "320000000", + "notionalCap": "750000", + "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "17506450.0" - } - }, - { - "tier": 10.0, - "currency": "USDT", - "minNotional": 400000000.0, - "maxNotional": 530000000.0, - "maintenanceMarginRate": 0.15, - "maxLeverage": 3.0, - "info": { - "bracket": "10", - "initialLeverage": "3", - "notionalCap": "530000000", - "notionalFloor": "400000000", - "maintMarginRatio": "0.15", - "cum": "27506450.0" + "cum": "31725.0" } }, { - "tier": 11.0, + "tier": 8.0, + "symbol": "HIVE/USDT:USDT", "currency": "USDT", - "minNotional": 530000000.0, - "maxNotional": 800000000.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "11", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "800000000", - "notionalFloor": "530000000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "80506450.0" + "cum": "125475.0" } }, { - "tier": 12.0, + "tier": 9.0, + "symbol": "HIVE/USDT:USDT", "currency": "USDT", - "minNotional": 800000000.0, - "maxNotional": 1200000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "12", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "1200000000", - "notionalFloor": "800000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "280506450.0" + "cum": "500475.0" } } ], - "ETH/USDT:USDT-241227": [ + "HMSTR/USDT:USDT": [ { "tier": 1.0, + "symbol": "HMSTR/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 50000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 50.0, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "50000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -16748,258 +26217,257 @@ }, { "tier": 2.0, + "symbol": "HMSTR/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 375000.0, + "minNotional": 10000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "20000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "HMSTR/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "2", + "bracket": "3", "initialLeverage": "25", - "notionalCap": "375000", - "notionalFloor": "50000", + "notionalCap": "100000", + "notionalFloor": "20000", "maintMarginRatio": "0.02", - "cum": "500.0" + "cum": "150.0" } }, { - "tier": 3.0, + "tier": 4.0, + "symbol": "HMSTR/USDT:USDT", "currency": "USDT", - "minNotional": 375000.0, - "maxNotional": 2000000.0, + "minNotional": 100000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "200000", + "notionalFloor": "100000", + "maintMarginRatio": "0.025", + "cum": "650.0" + } + }, + { + "tier": 5.0, + "symbol": "HMSTR/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "2000000", - "notionalFloor": "375000", + "notionalCap": "1000000", + "notionalFloor": "200000", "maintMarginRatio": "0.05", - "cum": "11750.0" + "cum": "5650.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "HMSTR/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "4000000", - "notionalFloor": "2000000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.1", - "cum": "111750.0" + "cum": "55650.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "HMSTR/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 10000000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "10000000", - "notionalFloor": "4000000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "211750.0" - } - }, - { - "tier": 6.0, - "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, - "maintenanceMarginRate": 0.15, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "20000000", - "notionalFloor": "10000000", - "maintMarginRatio": "0.15", - "cum": "461750.0" + "cum": "105650.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "HMSTR/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 40000000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "40000000", - "notionalFloor": "20000000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.25", - "cum": "2461750.0" + "cum": "418150.0" } }, { - "tier": 8.0, + "tier": 9.0, + "symbol": "HMSTR/USDT:USDT", "currency": "USDT", - "minNotional": 40000000.0, - "maxNotional": 120000000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "120000000", - "notionalFloor": "40000000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "12461750.0" + "cum": "1668150.0" } } ], - "ETH/USDT:USDT-250328": [ + "HOOK/USDT:USDT": [ { "tier": 1.0, + "symbol": "HOOK/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 50.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "50000", + "initialLeverage": "20", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.02", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "HOOK/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 375000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 5000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "375000", - "notionalFloor": "50000", - "maintMarginRatio": "0.02", - "cum": "500.0" + "initialLeverage": "15", + "notionalCap": "50000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "HOOK/USDT:USDT", "currency": "USDT", - "minNotional": 375000.0, - "maxNotional": 2000000.0, + "minNotional": 50000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "2000000", - "notionalFloor": "375000", + "notionalCap": "200000", + "notionalFloor": "50000", "maintMarginRatio": "0.05", - "cum": "11750.0" + "cum": "1275.0" } }, { "tier": 4.0, + "symbol": "HOOK/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, + "minNotional": 200000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "4", "initialLeverage": "5", - "notionalCap": "4000000", - "notionalFloor": "2000000", + "notionalCap": "500000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "111750.0" + "cum": "11275.0" } }, { "tier": 5.0, + "symbol": "HOOK/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 10000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "10000000", - "notionalFloor": "4000000", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "211750.0" + "cum": "23775.0" } }, { "tier": 6.0, + "symbol": "HOOK/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, - "maintenanceMarginRate": 0.15, - "maxLeverage": 3.0, - "info": { - "bracket": "6", - "initialLeverage": "3", - "notionalCap": "20000000", - "notionalFloor": "10000000", - "maintMarginRatio": "0.15", - "cum": "461750.0" - } - }, - { - "tier": 7.0, - "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 40000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "40000000", - "notionalFloor": "20000000", - "maintMarginRatio": "0.25", - "cum": "2461750.0" - } - }, - { - "tier": 8.0, - "currency": "USDT", - "minNotional": 40000000.0, - "maxNotional": 120000000.0, + "minNotional": 1000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "120000000", - "notionalFloor": "40000000", + "notionalCap": "5000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "12461750.0" + "cum": "398775.0" } } ], - "ETHFI/USDC:USDC": [ + "HOT/USDT:USDT": [ { "tier": 1.0, - "currency": "USDC", + "symbol": "HOT/USDT:USDT", + "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 50.0, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -17008,120 +26476,145 @@ }, { "tier": 2.0, - "currency": "USDC", + "symbol": "HOT/USDT:USDT", + "currency": "USDT", "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "HOT/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "2", + "bracket": "3", "initialLeverage": "25", "notionalCap": "50000", - "notionalFloor": "5000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "50.0" + "cum": "75.0" } }, { - "tier": 3.0, - "currency": "USDC", + "tier": 4.0, + "symbol": "HOT/USDT:USDT", + "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 600000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "600000", + "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "300.0" + "cum": "325.0" } }, { - "tier": 4.0, - "currency": "USDC", - "minNotional": 600000.0, - "maxNotional": 1200000.0, + "tier": 5.0, + "symbol": "HOT/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "1200000", - "notionalFloor": "600000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.05", - "cum": "15300.0" + "cum": "2825.0" } }, { - "tier": 5.0, - "currency": "USDC", - "minNotional": 1200000.0, - "maxNotional": 3000000.0, + "tier": 6.0, + "symbol": "HOT/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "1200000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "75300.0" + "cum": "27825.0" } }, { - "tier": 6.0, - "currency": "USDC", - "minNotional": 3000000.0, - "maxNotional": 4000000.0, + "tier": 7.0, + "symbol": "HOT/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "4000000", - "notionalFloor": "3000000", + "notionalCap": "1250000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "150300.0" + "cum": "52825.0" } }, { - "tier": 7.0, - "currency": "USDC", - "minNotional": 4000000.0, - "maxNotional": 6000000.0, + "tier": 8.0, + "symbol": "HOT/USDT:USDT", + "currency": "USDT", + "minNotional": 1250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "6000000", - "notionalFloor": "4000000", + "notionalCap": "2500000", + "notionalFloor": "1250000", "maintMarginRatio": "0.25", - "cum": "650300.0" + "cum": "209075.0" } }, { - "tier": 8.0, - "currency": "USDC", - "minNotional": 6000000.0, - "maxNotional": 10000000.0, + "tier": 9.0, + "symbol": "HOT/USDT:USDT", + "currency": "USDT", + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "2150300.0" + "cum": "834075.0" } } ], - "ETHFI/USDT:USDT": [ + "ICP/USDT:USDT": [ { "tier": 1.0, + "symbol": "ICP/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -17138,6 +26631,7 @@ }, { "tier": 2.0, + "symbol": "ICP/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 20000.0, @@ -17154,6 +26648,7 @@ }, { "tier": 3.0, + "symbol": "ICP/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 100000.0, @@ -17170,6 +26665,7 @@ }, { "tier": 4.0, + "symbol": "ICP/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 200000.0, @@ -17186,6 +26682,7 @@ }, { "tier": 5.0, + "symbol": "ICP/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 1000000.0, @@ -17202,6 +26699,7 @@ }, { "tier": 6.0, + "symbol": "ICP/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -17218,6 +26716,7 @@ }, { "tier": 7.0, + "symbol": "ICP/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 2500000.0, @@ -17234,15 +26733,16 @@ }, { "tier": 8.0, + "symbol": "ICP/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "5000000", + "notionalCap": "6000000", "notionalFloor": "2500000", "maintMarginRatio": "0.25", "cum": "418150.0" @@ -17250,8 +26750,9 @@ }, { "tier": 9.0, + "symbol": "ICP/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, + "minNotional": 6000000.0, "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, @@ -17259,170 +26760,163 @@ "bracket": "9", "initialLeverage": "1", "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalFloor": "6000000", "maintMarginRatio": "0.5", - "cum": "1668150.0" + "cum": "1918150.0" } } ], - "ETHW/USDT:USDT": [ + "ICX/USDT:USDT": [ { "tier": 1.0, + "symbol": "ICX/USDT:USDT", "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" } }, { "tier": 2.0, + "symbol": "ICX/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, - "info": { - "bracket": "2", - "initialLeverage": "50", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.015", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 30000.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "3", + "bracket": "2", "initialLeverage": "25", - "notionalCap": "30000", - "notionalFloor": "10000", + "notionalCap": "20000", + "notionalFloor": "5000", "maintMarginRatio": "0.02", - "cum": "75.0" + "cum": "25.0" } }, { - "tier": 4.0, + "tier": 3.0, + "symbol": "ICX/USDT:USDT", "currency": "USDT", - "minNotional": 30000.0, - "maxNotional": 60000.0, + "minNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "20", - "notionalCap": "60000", - "notionalFloor": "30000", + "notionalCap": "25000", + "notionalFloor": "20000", "maintMarginRatio": "0.025", - "cum": "225.0" + "cum": "125.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "ICX/USDT:USDT", "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 300000.0, + "minNotional": 25000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "10", - "notionalCap": "300000", - "notionalFloor": "60000", + "notionalCap": "200000", + "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "1725.0" + "cum": "750.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "ICX/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 200000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "5", - "notionalCap": "600000", - "notionalFloor": "300000", + "notionalCap": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "16725.0" + "cum": "10750.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "ICX/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 750000.0, + "minNotional": 400000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "4", - "notionalCap": "750000", - "notionalFloor": "600000", + "notionalCap": "500000", + "notionalFloor": "400000", "maintMarginRatio": "0.125", - "cum": "31725.0" + "cum": "20750.0" } }, { - "tier": 8.0, + "tier": 7.0, + "symbol": "ICX/USDT:USDT", "currency": "USDT", - "minNotional": 750000.0, - "maxNotional": 1500000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", - "notionalCap": "1500000", - "notionalFloor": "750000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "125475.0" + "cum": "83250.0" } }, { - "tier": 9.0, + "tier": 8.0, + "symbol": "ICX/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "500475.0" + "cum": "333250.0" } } ], - "FET/USDT:USDT": [ + "ID/USDT:USDT": [ { "tier": 1.0, + "symbol": "ID/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, + "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "10000", + "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -17430,599 +26924,517 @@ }, { "tier": 2.0, + "symbol": "ID/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 60000.0, + "minNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "60000", - "notionalFloor": "10000", + "notionalCap": "10000", + "notionalFloor": "5000", "maintMarginRatio": "0.015", - "cum": "50.0" + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "ID/USDT:USDT", "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 300000.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "300000", - "notionalFloor": "60000", + "notionalCap": "50000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "350.0" + "cum": "75.0" } }, { "tier": 4.0, + "symbol": "ID/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "300000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "1850.0" + "cum": "325.0" } }, { "tier": 5.0, + "symbol": "ID/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 3000000.0, + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "3000000", - "notionalFloor": "600000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.05", - "cum": "16850.0" + "cum": "2825.0" } }, { "tier": 6.0, + "symbol": "ID/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "166850.0" + "cum": "27825.0" } }, { "tier": 7.0, + "symbol": "ID/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "7500000", - "notionalFloor": "6000000", + "notionalCap": "1250000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "316850.0" + "cum": "52825.0" } }, { "tier": 8.0, + "symbol": "ID/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 1250000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "3000000", + "notionalFloor": "1250000", "maintMarginRatio": "0.25", - "cum": "1254350.0" + "cum": "209075.0" } }, { "tier": 9.0, + "symbol": "ID/USDT:USDT", "currency": "USDT", - "minNotional": 15000000.0, - "maxNotional": 30000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "15000000", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "5004350.0" + "cum": "959075.0" } } ], - "FIDA/USDT:USDT": [ + "IDEX/USDT:USDT": [ { "tier": 1.0, + "symbol": "IDEX/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.02", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "IDEX/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", - "notionalCap": "10000", + "initialLeverage": "15", + "notionalCap": "25000", "notionalFloor": "5000", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.025", "cum": "25.0" } }, { "tier": 3.0, + "symbol": "IDEX/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, - "info": { - "bracket": "3", - "initialLeverage": "25", - "notionalCap": "50000", - "notionalFloor": "10000", - "maintMarginRatio": "0.02", - "cum": "75.0" - } - }, - { - "tier": 4.0, - "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, - "info": { - "bracket": "4", - "initialLeverage": "20", - "notionalCap": "100000", - "notionalFloor": "50000", - "maintMarginRatio": "0.025", - "cum": "325.0" - } - }, - { - "tier": 5.0, - "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 500000.0, + "minNotional": 25000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "10", - "notionalCap": "500000", - "notionalFloor": "100000", + "notionalCap": "200000", + "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "2825.0" + "cum": "650.0" } }, { - "tier": 6.0, + "tier": 4.0, + "symbol": "IDEX/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 200000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "5", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "500000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "27825.0" + "cum": "10650.0" } }, { - "tier": 7.0, + "tier": 5.0, + "symbol": "IDEX/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 1250000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "4", - "notionalCap": "1250000", - "notionalFloor": "1000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "52825.0" + "cum": "23150.0" } }, { - "tier": 8.0, + "tier": 6.0, + "symbol": "IDEX/USDT:USDT", "currency": "USDT", - "minNotional": 1250000.0, - "maxNotional": 2500000.0, + "minNotional": 1000000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "2", - "notionalCap": "2500000", - "notionalFloor": "1250000", + "notionalCap": "3000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.25", - "cum": "209075.0" + "cum": "148150.0" } }, { - "tier": 9.0, + "tier": 7.0, + "symbol": "IDEX/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "minNotional": 3000000.0, + "maxNotional": 3500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "2500000", + "notionalCap": "3500000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "834075.0" + "cum": "898150.0" } } ], - "FIL/USDC:USDC": [ + "ILV/USDT:USDT": [ { "tier": 1.0, - "currency": "USDC", + "symbol": "ILV/USDT:USDT", + "currency": "USDT", "minNotional": 0.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.006, - "maxLeverage": 75.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "75", - "notionalCap": "50000", + "initialLeverage": "50", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.006", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, - "currency": "USDC", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 40.0, - "info": { - "bracket": "2", - "initialLeverage": "40", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.01", - "cum": "200.0" - } - }, - { - "tier": 3.0, - "currency": "USDC", - "minNotional": 250000.0, - "maxNotional": 600000.0, - "maintenanceMarginRate": 0.02, + "symbol": "ILV/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "2", "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "250000", - "maintMarginRatio": "0.02", - "cum": "2700.0" - } - }, - { - "tier": 4.0, - "currency": "USDC", - "minNotional": 600000.0, - "maxNotional": 1200000.0, + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "ILV/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "10", - "notionalCap": "1200000", - "notionalFloor": "600000", + "notionalCap": "100000", + "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "20700.0" + "cum": "675.0" } }, { - "tier": 5.0, - "currency": "USDC", - "minNotional": 1200000.0, - "maxNotional": 3000000.0, + "tier": 4.0, + "symbol": "ILV/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "1200000", + "notionalCap": "200000", + "notionalFloor": "100000", "maintMarginRatio": "0.1", - "cum": "80700.0" + "cum": "5675.0" } }, { - "tier": 6.0, - "currency": "USDC", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "tier": 5.0, + "symbol": "ILV/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "500000", + "notionalFloor": "200000", "maintMarginRatio": "0.125", - "cum": "155700.0" - } - }, - { - "tier": 7.0, - "currency": "USDC", - "minNotional": 6000000.0, - "maxNotional": 10000000.0, - "maintenanceMarginRate": 0.165, - "maxLeverage": 3.0, - "info": { - "bracket": "7", - "initialLeverage": "3", - "notionalCap": "10000000", - "notionalFloor": "6000000", - "maintMarginRatio": "0.165", - "cum": "395700.0" + "cum": "10675.0" } }, { - "tier": 8.0, - "currency": "USDC", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "tier": 6.0, + "symbol": "ILV/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "2", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "1245700.0" + "cum": "73175.0" } }, { - "tier": 9.0, - "currency": "USDC", - "minNotional": 20000000.0, - "maxNotional": 30000000.0, + "tier": 7.0, + "symbol": "ILV/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "20000000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "6245700.0" + "cum": "323175.0" } } ], - "FIL/USDT:USDT": [ + "IMX/USDT:USDT": [ { "tier": 1.0, + "symbol": "IMX/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.006, - "maxLeverage": 75.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "75", - "notionalCap": "50000", + "initialLeverage": "50", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.006", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "IMX/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 50.0, - "info": { - "bracket": "2", - "initialLeverage": "50", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.01", - "cum": "200.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 350000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 40.0, - "info": { - "bracket": "3", - "initialLeverage": "40", - "notionalCap": "350000", - "notionalFloor": "250000", - "maintMarginRatio": "0.015", - "cum": "1450.0" - } - }, - { - "tier": 4.0, - "currency": "USDT", - "minNotional": 350000.0, - "maxNotional": 600000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, - "info": { - "bracket": "4", - "initialLeverage": "25", - "notionalCap": "600000", - "notionalFloor": "350000", - "maintMarginRatio": "0.02", - "cum": "3200.0" - } - }, - { - "tier": 5.0, - "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 800000.0, + "minNotional": 5000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "5", + "bracket": "2", "initialLeverage": "20", - "notionalCap": "800000", - "notionalFloor": "600000", + "notionalCap": "50000", + "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "6200.0" + "cum": "50.0" } }, { - "tier": 6.0, + "tier": 3.0, + "symbol": "IMX/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 3000000.0, + "minNotional": 50000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "6", + "bracket": "3", "initialLeverage": "10", - "notionalCap": "3000000", - "notionalFloor": "800000", + "notionalCap": "600000", + "notionalFloor": "50000", "maintMarginRatio": "0.05", - "cum": "26200.0" + "cum": "1300.0" } }, { - "tier": 7.0, + "tier": 4.0, + "symbol": "IMX/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "minNotional": 600000.0, + "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "7", + "bracket": "4", "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "1600000", + "notionalFloor": "600000", "maintMarginRatio": "0.1", - "cum": "176200.0" + "cum": "31300.0" } }, { - "tier": 8.0, + "tier": 5.0, + "symbol": "IMX/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 10000000.0, + "minNotional": 1600000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "8", + "bracket": "5", "initialLeverage": "4", - "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalCap": "2000000", + "notionalFloor": "1600000", "maintMarginRatio": "0.125", - "cum": "326200.0" + "cum": "71300.0" } }, { - "tier": 9.0, + "tier": 6.0, + "symbol": "IMX/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "minNotional": 2000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "6", "initialLeverage": "2", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "4000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.25", - "cum": "1576200.0" + "cum": "321300.0" } }, { - "tier": 10.0, + "tier": 7.0, + "symbol": "IMX/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 30000000.0, + "minNotional": 4000000.0, + "maxNotional": 4500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "20000000", + "notionalCap": "4500000", + "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "6576200.0" + "cum": "1321300.0" } } ], - "FIO/USDT:USDT": [ + "INJ/USDT:USDT": [ { "tier": 1.0, + "symbol": "INJ/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -18030,373 +27442,430 @@ }, { "tier": 2.0, + "symbol": "INJ/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, + "minNotional": 10000.0, + "maxNotional": 80000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "10000", - "notionalFloor": "5000", + "notionalCap": "80000", + "notionalFloor": "10000", "maintMarginRatio": "0.015", - "cum": "25.0" + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "INJ/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 30000.0, + "minNotional": 80000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "30000", - "notionalFloor": "10000", + "notionalCap": "400000", + "notionalFloor": "80000", "maintMarginRatio": "0.02", - "cum": "75.0" + "cum": "450.0" } }, { "tier": 4.0, + "symbol": "INJ/USDT:USDT", "currency": "USDT", - "minNotional": 30000.0, - "maxNotional": 60000.0, + "minNotional": 400000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "60000", - "notionalFloor": "30000", + "notionalCap": "800000", + "notionalFloor": "400000", "maintMarginRatio": "0.025", - "cum": "225.0" + "cum": "2450.0" } }, { "tier": 5.0, + "symbol": "INJ/USDT:USDT", "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 300000.0, + "minNotional": 800000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "300000", - "notionalFloor": "60000", + "notionalCap": "4000000", + "notionalFloor": "800000", "maintMarginRatio": "0.05", - "cum": "1725.0" + "cum": "22450.0" } }, { "tier": 6.0, + "symbol": "INJ/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 4000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "600000", - "notionalFloor": "300000", + "notionalCap": "8000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.1", - "cum": "16725.0" + "cum": "222450.0" } }, { "tier": 7.0, + "symbol": "INJ/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 750000.0, + "minNotional": 8000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "750000", - "notionalFloor": "600000", + "notionalCap": "10000000", + "notionalFloor": "8000000", "maintMarginRatio": "0.125", - "cum": "31725.0" + "cum": "422450.0" } }, { "tier": 8.0, + "symbol": "INJ/USDT:USDT", "currency": "USDT", - "minNotional": 750000.0, - "maxNotional": 1500000.0, + "minNotional": 10000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "1500000", - "notionalFloor": "750000", + "notionalCap": "20000000", + "notionalFloor": "10000000", "maintMarginRatio": "0.25", - "cum": "125475.0" + "cum": "1672450.0" } }, { "tier": 9.0, + "symbol": "INJ/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 20000000.0, + "maxNotional": 40000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "40000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.5", - "cum": "500475.0" + "cum": "6672450.0" } } ], - "FLM/USDT:USDT": [ + "IO/USDT:USDT": [ { "tier": 1.0, + "symbol": "IO/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "IO/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 20000.0, + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "IO/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 150000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "2", + "bracket": "3", "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "5000", + "notionalCap": "150000", + "notionalFloor": "30000", "maintMarginRatio": "0.02", - "cum": "25.0" + "cum": "200.0" } }, { - "tier": 3.0, + "tier": 4.0, + "symbol": "IO/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 25000.0, + "minNotional": 150000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "20000", + "notionalCap": "300000", + "notionalFloor": "150000", "maintMarginRatio": "0.025", - "cum": "125.0" + "cum": "950.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "IO/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 300000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "1500000", + "notionalFloor": "300000", "maintMarginRatio": "0.05", - "cum": "750.0" + "cum": "8450.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "IO/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.1", - "cum": "10750.0" + "cum": "83450.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "IO/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 3000000.0, + "maxNotional": 3750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "3750000", + "notionalFloor": "3000000", "maintMarginRatio": "0.125", - "cum": "20750.0" + "cum": "158450.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "IO/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 3750000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "7500000", + "notionalFloor": "3750000", "maintMarginRatio": "0.25", - "cum": "83250.0" + "cum": "627200.0" } }, { - "tier": 8.0, + "tier": 9.0, + "symbol": "IO/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 7500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "15000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "333250.0" + "cum": "2502200.0" } } ], - "FLOW/USDT:USDT": [ + "IOST/USDT:USDT": [ { "tier": 1.0, + "symbol": "IOST/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "20", + "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "IOST/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "10", + "initialLeverage": "20", "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "75.0" + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "IOST/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "8", - "notionalCap": "100000", + "initialLeverage": "10", + "notionalCap": "200000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "700.0" + "cum": "675.0" } }, { "tier": 4.0, + "symbol": "IOST/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 250000.0, + "minNotional": 200000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "4", "initialLeverage": "5", - "notionalCap": "250000", - "notionalFloor": "100000", + "notionalCap": "500000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "5700.0" + "cum": "10675.0" } }, { "tier": 5.0, + "symbol": "IOST/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, + "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 2.0, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "2", + "initialLeverage": "4", "notionalCap": "1000000", - "notionalFloor": "250000", + "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "11950.0" + "cum": "23175.0" } }, { "tier": 6.0, + "symbol": "IOST/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "148175.0" + } + }, + { + "tier": 7.0, + "symbol": "IOST/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "1", "notionalCap": "5000000", - "notionalFloor": "1000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "386950.0" + "cum": "898175.0" } } ], - "FLUX/USDT:USDT": [ + "IOTA/USDT:USDT": [ { "tier": 1.0, + "symbol": "IOTA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -18404,770 +27873,886 @@ }, { "tier": 2.0, + "symbol": "IOTA/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, + "minNotional": 10000.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "10000", - "notionalFloor": "5000", + "notionalCap": "20000", + "notionalFloor": "10000", "maintMarginRatio": "0.015", - "cum": "25.0" + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "IOTA/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, + "minNotional": 20000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "10000", + "notionalCap": "100000", + "notionalFloor": "20000", "maintMarginRatio": "0.02", - "cum": "75.0" + "cum": "150.0" } }, { "tier": 4.0, + "symbol": "IOTA/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 40000.0, + "minNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "40000", - "notionalFloor": "20000", + "notionalCap": "200000", + "notionalFloor": "100000", "maintMarginRatio": "0.025", - "cum": "175.0" + "cum": "650.0" } }, { "tier": 5.0, + "symbol": "IOTA/USDT:USDT", "currency": "USDT", - "minNotional": 40000.0, - "maxNotional": 200000.0, + "minNotional": 200000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "40000", + "notionalCap": "1000000", + "notionalFloor": "200000", "maintMarginRatio": "0.05", - "cum": "1175.0" + "cum": "5650.0" } }, { "tier": 6.0, + "symbol": "IOTA/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.1", - "cum": "11175.0" + "cum": "55650.0" } }, { "tier": 7.0, + "symbol": "IOTA/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "21175.0" + "cum": "105650.0" } }, { "tier": 8.0, + "symbol": "IOTA/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.25", - "cum": "83675.0" + "cum": "418150.0" } }, { "tier": 9.0, + "symbol": "IOTA/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "333675.0" + "cum": "1668150.0" } } ], - "FTM/USDT:USDT": [ + "IOTX/USDT:USDT": [ { "tier": 1.0, + "symbol": "IOTX/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.006, - "maxLeverage": 75.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.006", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "IOTX/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 50.0, - "info": { - "bracket": "2", - "initialLeverage": "50", - "notionalCap": "50000", - "notionalFloor": "5000", - "maintMarginRatio": "0.01", - "cum": "20.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 80000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 40.0, - "info": { - "bracket": "3", - "initialLeverage": "40", - "notionalCap": "80000", - "notionalFloor": "50000", - "maintMarginRatio": "0.015", - "cum": "270.0" - } - }, - { - "tier": 4.0, - "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 300000.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "25", - "notionalCap": "300000", - "notionalFloor": "80000", + "notionalCap": "20000", + "notionalFloor": "5000", "maintMarginRatio": "0.02", - "cum": "670.0" + "cum": "25.0" } }, { - "tier": 5.0, + "tier": 3.0, + "symbol": "IOTX/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "300000", + "notionalCap": "25000", + "notionalFloor": "20000", "maintMarginRatio": "0.025", - "cum": "2170.0" + "cum": "125.0" } }, { - "tier": 6.0, + "tier": 4.0, + "symbol": "IOTX/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 3000000.0, + "minNotional": 25000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "10", - "notionalCap": "3000000", - "notionalFloor": "600000", + "notionalCap": "200000", + "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "17170.0" + "cum": "750.0" } }, { - "tier": 7.0, + "tier": 5.0, + "symbol": "IOTX/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "minNotional": 200000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "167170.0" + "cum": "10750.0" } }, { - "tier": 8.0, + "tier": 6.0, + "symbol": "IOTX/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "minNotional": 400000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "4", - "notionalCap": "7500000", - "notionalFloor": "6000000", + "notionalCap": "500000", + "notionalFloor": "400000", "maintMarginRatio": "0.125", - "cum": "317170.0" + "cum": "20750.0" } }, { - "tier": 9.0, + "tier": 7.0, + "symbol": "IOTX/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "7", "initialLeverage": "2", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "1254670.0" + "cum": "83250.0" } }, { - "tier": 10.0, + "tier": 8.0, + "symbol": "IOTX/USDT:USDT", "currency": "USDT", - "minNotional": 15000000.0, - "maxNotional": 30000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "15000000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "5004670.0" + "cum": "333250.0" } } ], - "FTT/USDT:USDT": [ + "JASMY/USDT:USDT": [ { "tier": 1.0, + "symbol": "JASMY/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 15000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "8", - "notionalCap": "15000", + "initialLeverage": "50", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "JASMY/USDT:USDT", "currency": "USDT", - "minNotional": 15000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "2", - "initialLeverage": "6", - "notionalCap": "50000", - "notionalFloor": "15000", - "maintMarginRatio": "0.05", - "cum": "375.0" + "initialLeverage": "25", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "JASMY/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 200000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 25000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "3", - "initialLeverage": "5", - "notionalCap": "200000", - "notionalFloor": "50000", - "maintMarginRatio": "0.1", - "cum": "2875.0" + "initialLeverage": "20", + "notionalCap": "80000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "150.0" } }, { "tier": 4.0, + "symbol": "JASMY/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, + "minNotional": 80000.0, "maxNotional": 800000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 2.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "2", + "initialLeverage": "10", "notionalCap": "800000", - "notionalFloor": "200000", - "maintMarginRatio": "0.125", - "cum": "7875.0" + "notionalFloor": "80000", + "maintMarginRatio": "0.05", + "cum": "2150.0" } }, { "tier": 5.0, + "symbol": "JASMY/USDT:USDT", "currency": "USDT", "minNotional": 800000.0, - "maxNotional": 1500000.0, + "maxNotional": 1600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "1600000", + "notionalFloor": "800000", + "maintMarginRatio": "0.1", + "cum": "42150.0" + } + }, + { + "tier": 6.0, + "symbol": "JASMY/USDT:USDT", + "currency": "USDT", + "minNotional": 1600000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "2000000", + "notionalFloor": "1600000", + "maintMarginRatio": "0.125", + "cum": "82150.0" + } + }, + { + "tier": 7.0, + "symbol": "JASMY/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "4000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.25", + "cum": "332150.0" + } + }, + { + "tier": 8.0, + "symbol": "JASMY/USDT:USDT", + "currency": "USDT", + "minNotional": 4000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "5", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "1500000", - "notionalFloor": "800000", + "notionalCap": "8000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "307875.0" + "cum": "1332150.0" } } ], - "FXS/USDT:USDT": [ + "JOE/USDT:USDT": [ { "tier": 1.0, + "symbol": "JOE/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "20", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "JOE/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "15", - "notionalCap": "25000", + "initialLeverage": "50", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.015", "cum": "25.0" } }, { "tier": 3.0, + "symbol": "JOE/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "JOE/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, "maxNotional": 100000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "325.0" + } + }, + { + "tier": 5.0, + "symbol": "JOE/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "100000", - "notionalFloor": "25000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "2825.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "JOE/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 250000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "250000", - "notionalFloor": "100000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "5650.0" + "cum": "27825.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "JOE/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 1000000.0, + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "1250000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.125", + "cum": "52825.0" + } + }, + { + "tier": 8.0, + "symbol": "JOE/USDT:USDT", + "currency": "USDT", + "minNotional": 1250000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "5", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "11900.0" + "notionalCap": "3000000", + "notionalFloor": "1250000", + "maintMarginRatio": "0.25", + "cum": "209075.0" } }, { - "tier": 6.0, + "tier": 9.0, + "symbol": "JOE/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, + "minNotional": 3000000.0, "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "9", "initialLeverage": "1", "notionalCap": "5000000", - "notionalFloor": "1000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "386900.0" + "cum": "959075.0" } } ], - "G/USDT:USDT": [ + "JTO/USDT:USDT": [ { "tier": 1.0, + "symbol": "JTO/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "JTO/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 20000.0, + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "JTO/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 150000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "2", + "bracket": "3", "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "5000", + "notionalCap": "150000", + "notionalFloor": "30000", "maintMarginRatio": "0.02", - "cum": "25.0" + "cum": "200.0" } }, { - "tier": 3.0, + "tier": 4.0, + "symbol": "JTO/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 25000.0, + "minNotional": 150000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "20000", + "notionalCap": "300000", + "notionalFloor": "150000", "maintMarginRatio": "0.025", - "cum": "125.0" + "cum": "950.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "JTO/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 300000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "1500000", + "notionalFloor": "300000", "maintMarginRatio": "0.05", - "cum": "750.0" + "cum": "8450.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "JTO/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.1", - "cum": "10750.0" + "cum": "83450.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "JTO/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 3000000.0, + "maxNotional": 3750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "3750000", + "notionalFloor": "3000000", "maintMarginRatio": "0.125", - "cum": "20750.0" + "cum": "158450.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "JTO/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 3750000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "7500000", + "notionalFloor": "3750000", "maintMarginRatio": "0.25", - "cum": "83250.0" + "cum": "627200.0" } }, { - "tier": 8.0, + "tier": 9.0, + "symbol": "JTO/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 7500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "15000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "333250.0" + "cum": "2502200.0" } } ], - "GALA/USDT:USDT": [ + "JUP/USDT:USDT": [ { "tier": 1.0, + "symbol": "JUP/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.006, + "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.006", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "JUP/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.01, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "50000", + "notionalCap": "60000", "notionalFloor": "10000", - "maintMarginRatio": "0.01", - "cum": "40.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 80000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 40.0, - "info": { - "bracket": "3", - "initialLeverage": "40", - "notionalCap": "80000", - "notionalFloor": "50000", "maintMarginRatio": "0.015", - "cum": "290.0" + "cum": "50.0" } }, { - "tier": 4.0, + "tier": 3.0, + "symbol": "JUP/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 200000.0, + "minNotional": 60000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "25", - "notionalCap": "200000", - "notionalFloor": "80000", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.02", - "cum": "690.0" + "cum": "350.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "JUP/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 900000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "900000", - "notionalFloor": "200000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.025", - "cum": "1690.0" + "cum": "1850.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "JUP/USDT:USDT", "currency": "USDT", - "minNotional": 900000.0, - "maxNotional": 2000000.0, + "minNotional": 600000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "2000000", - "notionalFloor": "900000", + "notionalCap": "3000000", + "notionalFloor": "600000", "maintMarginRatio": "0.05", - "cum": "24190.0" + "cum": "16850.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "JUP/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 5000000.0, + "minNotional": 3000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "5000000", - "notionalFloor": "2000000", + "notionalCap": "6000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.1", - "cum": "124190.0" + "cum": "166850.0" } }, { - "tier": 8.0, + "tier": 7.0, + "symbol": "JUP/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 6000000.0, + "minNotional": 6000000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "6000000", - "notionalFloor": "5000000", + "notionalCap": "7500000", + "notionalFloor": "6000000", "maintMarginRatio": "0.125", - "cum": "249190.0" + "cum": "316850.0" } }, { - "tier": 9.0, + "tier": 8.0, + "symbol": "JUP/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 18000000.0, + "minNotional": 7500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "18000000", - "notionalFloor": "6000000", + "notionalCap": "15000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.25", - "cum": "999190.0" + "cum": "1254350.0" } }, { - "tier": 10.0, + "tier": 9.0, + "symbol": "JUP/USDT:USDT", "currency": "USDT", - "minNotional": 18000000.0, + "minNotional": 15000000.0, "maxNotional": 30000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "9", "initialLeverage": "1", "notionalCap": "30000000", - "notionalFloor": "18000000", + "notionalFloor": "15000000", "maintMarginRatio": "0.5", - "cum": "5499190.0" + "cum": "5004350.0" } } ], - "GAS/USDT:USDT": [ + "KAIA/USDT:USDT": [ { "tier": 1.0, + "symbol": "KAIA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -19184,6 +28769,7 @@ }, { "tier": 2.0, + "symbol": "KAIA/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -19200,6 +28786,7 @@ }, { "tier": 3.0, + "symbol": "KAIA/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 30000.0, @@ -19216,6 +28803,7 @@ }, { "tier": 4.0, + "symbol": "KAIA/USDT:USDT", "currency": "USDT", "minNotional": 30000.0, "maxNotional": 60000.0, @@ -19232,6 +28820,7 @@ }, { "tier": 5.0, + "symbol": "KAIA/USDT:USDT", "currency": "USDT", "minNotional": 60000.0, "maxNotional": 300000.0, @@ -19248,6 +28837,7 @@ }, { "tier": 6.0, + "symbol": "KAIA/USDT:USDT", "currency": "USDT", "minNotional": 300000.0, "maxNotional": 600000.0, @@ -19264,6 +28854,7 @@ }, { "tier": 7.0, + "symbol": "KAIA/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, "maxNotional": 750000.0, @@ -19280,6 +28871,7 @@ }, { "tier": 8.0, + "symbol": "KAIA/USDT:USDT", "currency": "USDT", "minNotional": 750000.0, "maxNotional": 1500000.0, @@ -19296,6 +28888,7 @@ }, { "tier": 9.0, + "symbol": "KAIA/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, "maxNotional": 3000000.0, @@ -19311,9 +28904,10 @@ } } ], - "GHST/USDT:USDT": [ + "KAS/USDT:USDT": [ { "tier": 1.0, + "symbol": "KAS/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -19330,6 +28924,7 @@ }, { "tier": 2.0, + "symbol": "KAS/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -19346,15 +28941,16 @@ }, { "tier": 3.0, + "symbol": "KAS/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "20000", + "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -19362,104 +28958,111 @@ }, { "tier": 4.0, + "symbol": "KAS/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 40000.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "40000", - "notionalFloor": "20000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "175.0" + "cum": "325.0" } }, { "tier": 5.0, + "symbol": "KAS/USDT:USDT", "currency": "USDT", - "minNotional": 40000.0, - "maxNotional": 200000.0, + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "40000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.05", - "cum": "1175.0" + "cum": "2825.0" } }, { "tier": 6.0, + "symbol": "KAS/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "11175.0" + "cum": "27825.0" } }, { "tier": 7.0, + "symbol": "KAS/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "1250000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "21175.0" + "cum": "52825.0" } }, { "tier": 8.0, + "symbol": "KAS/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 1250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "2500000", + "notionalFloor": "1250000", "maintMarginRatio": "0.25", - "cum": "83675.0" + "cum": "209075.0" } }, { "tier": 9.0, + "symbol": "KAS/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "333675.0" + "cum": "834075.0" } } ], - "GLM/USDT:USDT": [ + "KAVA/USDT:USDT": [ { "tier": 1.0, + "symbol": "KAVA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -19476,6 +29079,7 @@ }, { "tier": 2.0, + "symbol": "KAVA/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 20000.0, @@ -19492,15 +29096,16 @@ }, { "tier": 3.0, + "symbol": "KAVA/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, - "maxNotional": 30000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "3", "initialLeverage": "20", - "notionalCap": "30000", + "notionalCap": "25000", "notionalFloor": "20000", "maintMarginRatio": "0.025", "cum": "125.0" @@ -19508,195 +29113,379 @@ }, { "tier": 4.0, + "symbol": "KAVA/USDT:USDT", "currency": "USDT", - "minNotional": 30000.0, - "maxNotional": 300000.0, + "minNotional": 25000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "4", "initialLeverage": "10", - "notionalCap": "300000", - "notionalFloor": "30000", + "notionalCap": "200000", + "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "875.0" + "cum": "750.0" } }, { "tier": 5.0, + "symbol": "KAVA/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 200000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "5", "initialLeverage": "5", - "notionalCap": "600000", - "notionalFloor": "300000", + "notionalCap": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "15875.0" + "cum": "10750.0" } }, { "tier": 6.0, + "symbol": "KAVA/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 750000.0, + "minNotional": 400000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "6", "initialLeverage": "4", - "notionalCap": "750000", - "notionalFloor": "600000", + "notionalCap": "500000", + "notionalFloor": "400000", "maintMarginRatio": "0.125", - "cum": "30875.0" + "cum": "20750.0" } }, { "tier": 7.0, + "symbol": "KAVA/USDT:USDT", "currency": "USDT", - "minNotional": 750000.0, - "maxNotional": 1500000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "1500000", - "notionalFloor": "750000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "124625.0" + "cum": "83250.0" } }, { "tier": 8.0, + "symbol": "KAVA/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "499625.0" + "cum": "333250.0" } } ], - "GLMR/USDT:USDT": [ + "KDA/USDT:USDT": [ { "tier": 1.0, + "symbol": "KDA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.03, - "maxLeverage": 20.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "20", - "notionalCap": "10000", + "initialLeverage": "75", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.03", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "KDA/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "KDA/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "20000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "KDA/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 40000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "40000", + "notionalFloor": "20000", + "maintMarginRatio": "0.025", + "cum": "175.0" + } + }, + { + "tier": 5.0, + "symbol": "KDA/USDT:USDT", + "currency": "USDT", + "minNotional": 40000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "2", + "bracket": "5", "initialLeverage": "10", "notionalCap": "200000", - "notionalFloor": "10000", + "notionalFloor": "40000", "maintMarginRatio": "0.05", - "cum": "200.0" + "cum": "1175.0" + } + }, + { + "tier": 6.0, + "symbol": "KDA/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "400000", + "notionalFloor": "200000", + "maintMarginRatio": "0.1", + "cum": "11175.0" + } + }, + { + "tier": 7.0, + "symbol": "KDA/USDT:USDT", + "currency": "USDT", + "minNotional": 400000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "400000", + "maintMarginRatio": "0.125", + "cum": "21175.0" + } + }, + { + "tier": 8.0, + "symbol": "KDA/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.25", + "cum": "83675.0" + } + }, + { + "tier": 9.0, + "symbol": "KDA/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "333675.0" + } + } + ], + "KEY/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "KEY/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 10.0, + "info": { + "bracket": "1", + "initialLeverage": "10", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.02", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "KEY/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 8.0, + "info": { + "bracket": "2", + "initialLeverage": "8", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "KEY/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, + "info": { + "bracket": "3", + "initialLeverage": "6", + "notionalCap": "200000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "650.0" + } + }, + { + "tier": 4.0, + "symbol": "KEY/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "5", "notionalCap": "500000", "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "10200.0" + "cum": "10650.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "KEY/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "4", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "22700.0" + "cum": "23150.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "KEY/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "2", - "notionalCap": "3000000", + "notionalCap": "2000000", "notionalFloor": "1000000", "maintMarginRatio": "0.25", - "cum": "147700.0" + "cum": "148150.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "KEY/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3500000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "3500000", - "notionalFloor": "3000000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.5", - "cum": "897700.0" + "cum": "648150.0" } } ], - "GMT/USDT:USDT": [ + "KLAY/USDT:USDT": [ { "tier": 1.0, + "symbol": "KLAY/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 50000.0, + "maxNotional": 5000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "1", "initialLeverage": "50", - "notionalCap": "50000", + "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.015", "cum": "0.0" @@ -19704,56 +29493,60 @@ }, { "tier": 2.0, + "symbol": "KLAY/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 150000.0, + "minNotional": 5000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "2", "initialLeverage": "20", - "notionalCap": "150000", - "notionalFloor": "50000", + "notionalCap": "50000", + "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "500.0" + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "KLAY/USDT:USDT", "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 600000.0, + "minNotional": 50000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "600000", - "notionalFloor": "150000", + "notionalCap": "400000", + "notionalFloor": "50000", "maintMarginRatio": "0.05", - "cum": "4250.0" + "cum": "1300.0" } }, { "tier": 4.0, + "symbol": "KLAY/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 1600000.0, + "minNotional": 400000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "4", "initialLeverage": "5", - "notionalCap": "1600000", - "notionalFloor": "600000", + "notionalCap": "1000000", + "notionalFloor": "400000", "maintMarginRatio": "0.1", - "cum": "34250.0" + "cum": "21300.0" } }, { "tier": 5.0, + "symbol": "KLAY/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, + "minNotional": 1000000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, @@ -19761,161 +29554,205 @@ "bracket": "5", "initialLeverage": "4", "notionalCap": "2000000", - "notionalFloor": "1600000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "74250.0" + "cum": "46300.0" } }, { "tier": 6.0, + "symbol": "KLAY/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, - "maxNotional": 4000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "6", "initialLeverage": "2", - "notionalCap": "4000000", + "notionalCap": "6000000", "notionalFloor": "2000000", "maintMarginRatio": "0.25", - "cum": "324250.0" + "cum": "296300.0" } }, { "tier": 7.0, + "symbol": "KLAY/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 5000000.0, + "minNotional": 6000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "7", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "4000000", + "notionalCap": "10000000", + "notionalFloor": "6000000", "maintMarginRatio": "0.5", - "cum": "1324250.0" + "cum": "1796300.0" } } ], - "GMX/USDT:USDT": [ + "KMNO/USDT:USDT": [ { "tier": 1.0, + "symbol": "KMNO/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "KMNO/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "50", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.015", "cum": "25.0" } }, { "tier": 3.0, + "symbol": "KMNO/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 480000.0, + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "KMNO/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "KMNO/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "480000", - "notionalFloor": "25000", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "1725.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "KMNO/USDT:USDT", "currency": "USDT", - "minNotional": 480000.0, - "maxNotional": 1280000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "1280000", - "notionalFloor": "480000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "24650.0" + "cum": "16725.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "KMNO/USDT:USDT", "currency": "USDT", - "minNotional": 1280000.0, - "maxNotional": 1600000.0, + "minNotional": 600000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "1600000", - "notionalFloor": "1280000", + "notionalCap": "750000", + "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "56650.0" + "cum": "31725.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "KMNO/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 4800000.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "4800000", - "notionalFloor": "1600000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "256650.0" + "cum": "125475.0" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "KMNO/USDT:USDT", "currency": "USDT", - "minNotional": 4800000.0, - "maxNotional": 8000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "8000000", - "notionalFloor": "4800000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "1456650.0" + "cum": "500475.0" } } ], - "GRT/USDT:USDT": [ + "KNC/USDT:USDT": [ { "tier": 1.0, + "symbol": "KNC/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -19932,104 +29769,128 @@ }, { "tier": 2.0, + "symbol": "KNC/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 50000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "20000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "KNC/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "2", + "bracket": "3", "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "5000", + "notionalCap": "25000", + "notionalFloor": "20000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "125.0" } }, { - "tier": 3.0, + "tier": 4.0, + "symbol": "KNC/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 400000.0, + "minNotional": 25000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "10", - "notionalCap": "400000", - "notionalFloor": "50000", + "notionalCap": "200000", + "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "1300.0" + "cum": "750.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "KNC/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 1000000.0, + "minNotional": 200000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "5", - "notionalCap": "1000000", - "notionalFloor": "400000", + "notionalCap": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "21300.0" + "cum": "10750.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "KNC/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 400000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "500000", + "notionalFloor": "400000", "maintMarginRatio": "0.125", - "cum": "46300.0" + "cum": "20750.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "KNC/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 6000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "2", - "notionalCap": "6000000", - "notionalFloor": "2000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "296300.0" + "cum": "83250.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "KNC/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 10000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "1796300.0" + "cum": "333250.0" } } ], - "GTC/USDT:USDT": [ + "KOMA/USDT:USDT": [ { "tier": 1.0, + "symbol": "KOMA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -20046,6 +29907,7 @@ }, { "tier": 2.0, + "symbol": "KOMA/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -20062,6 +29924,7 @@ }, { "tier": 3.0, + "symbol": "KOMA/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 30000.0, @@ -20078,6 +29941,7 @@ }, { "tier": 4.0, + "symbol": "KOMA/USDT:USDT", "currency": "USDT", "minNotional": 30000.0, "maxNotional": 60000.0, @@ -20094,6 +29958,7 @@ }, { "tier": 5.0, + "symbol": "KOMA/USDT:USDT", "currency": "USDT", "minNotional": 60000.0, "maxNotional": 300000.0, @@ -20110,6 +29975,7 @@ }, { "tier": 6.0, + "symbol": "KOMA/USDT:USDT", "currency": "USDT", "minNotional": 300000.0, "maxNotional": 600000.0, @@ -20126,6 +29992,7 @@ }, { "tier": 7.0, + "symbol": "KOMA/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, "maxNotional": 750000.0, @@ -20142,6 +30009,7 @@ }, { "tier": 8.0, + "symbol": "KOMA/USDT:USDT", "currency": "USDT", "minNotional": 750000.0, "maxNotional": 1500000.0, @@ -20158,6 +30026,7 @@ }, { "tier": 9.0, + "symbol": "KOMA/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, "maxNotional": 3000000.0, @@ -20173,9 +30042,10 @@ } } ], - "HBAR/USDT:USDT": [ + "KSM/USDT:USDT": [ { "tier": 1.0, + "symbol": "KSM/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -20192,250 +30062,334 @@ }, { "tier": 2.0, + "symbol": "KSM/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 50000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "20000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "KSM/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "2", + "bracket": "3", "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "5000", + "notionalCap": "25000", + "notionalFloor": "20000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "125.0" } }, { - "tier": 3.0, + "tier": 4.0, + "symbol": "KSM/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, + "minNotional": 25000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "10", "notionalCap": "200000", - "notionalFloor": "50000", + "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "1300.0" + "cum": "750.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "KSM/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, - "maxNotional": 500000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "5", - "notionalCap": "500000", + "notionalCap": "400000", "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "11300.0" + "cum": "10750.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "KSM/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 400000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "500000", + "notionalFloor": "400000", "maintMarginRatio": "0.125", - "cum": "23800.0" + "cum": "20750.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "KSM/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "148800.0" + "cum": "83250.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "KSM/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 5000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "3000000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "898800.0" + "cum": "333250.0" } } ], - "HFT/USDT:USDT": [ + "LDO/USDT:USDT": [ { "tier": 1.0, + "symbol": "LDO/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.006, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "20", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.006", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "LDO/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "15", - "notionalCap": "25000", + "initialLeverage": "50", + "notionalCap": "50000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" + "maintMarginRatio": "0.01", + "cum": "20.0" } }, { "tier": 3.0, + "symbol": "LDO/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, + "minNotional": 50000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 40.0, + "info": { + "bracket": "3", + "initialLeverage": "40", + "notionalCap": "80000", + "notionalFloor": "50000", + "maintMarginRatio": "0.015", + "cum": "270.0" + } + }, + { + "tier": 4.0, + "symbol": "LDO/USDT:USDT", + "currency": "USDT", + "minNotional": 80000.0, "maxNotional": 200000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "4", + "initialLeverage": "25", + "notionalCap": "200000", + "notionalFloor": "80000", + "maintMarginRatio": "0.02", + "cum": "670.0" + } + }, + { + "tier": 5.0, + "symbol": "LDO/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "5", + "initialLeverage": "20", + "notionalCap": "400000", + "notionalFloor": "200000", + "maintMarginRatio": "0.025", + "cum": "1670.0" + } + }, + { + "tier": 6.0, + "symbol": "LDO/USDT:USDT", + "currency": "USDT", + "minNotional": 400000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "6", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "2000000", + "notionalFloor": "400000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "11670.0" } }, { - "tier": 4.0, + "tier": 7.0, + "symbol": "LDO/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 2000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "7", "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "4000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.1", - "cum": "10650.0" + "cum": "111670.0" } }, { - "tier": 5.0, + "tier": 8.0, + "symbol": "LDO/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 4000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "8", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "5000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.125", - "cum": "23150.0" + "cum": "211670.0" } }, { - "tier": 6.0, + "tier": 9.0, + "symbol": "LDO/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "minNotional": 5000000.0, + "maxNotional": 12000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "9", "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalCap": "12000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.25", - "cum": "148150.0" + "cum": "836670.0" } }, { - "tier": 7.0, + "tier": 10.0, + "symbol": "LDO/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 5000000.0, + "minNotional": 12000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "3000000", + "notionalCap": "20000000", + "notionalFloor": "12000000", "maintMarginRatio": "0.5", - "cum": "898150.0" + "cum": "3836670.0" } } ], - "HIFI/USDT:USDT": [ + "LEVER/USDT:USDT": [ { "tier": 1.0, + "symbol": "LEVER/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "LEVER/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "15", "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "LEVER/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 200000.0, @@ -20447,11 +30401,12 @@ "notionalCap": "200000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "675.0" + "cum": "650.0" } }, { "tier": 4.0, + "symbol": "LEVER/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, @@ -20463,11 +30418,12 @@ "notionalCap": "500000", "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "10675.0" + "cum": "10650.0" } }, { "tier": 5.0, + "symbol": "LEVER/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -20479,11 +30435,12 @@ "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "23175.0" + "cum": "23150.0" } }, { "tier": 6.0, + "symbol": "LEVER/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 3000000.0, @@ -20495,37 +30452,39 @@ "notionalCap": "3000000", "notionalFloor": "1000000", "maintMarginRatio": "0.25", - "cum": "148175.0" + "cum": "148150.0" } }, { "tier": 7.0, + "symbol": "LEVER/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, - "maxNotional": 3500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "7", "initialLeverage": "1", - "notionalCap": "3500000", + "notionalCap": "5000000", "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "898175.0" + "cum": "898150.0" } } ], - "HIGH/USDT:USDT": [ + "LINA/USDT:USDT": [ { "tier": 1.0, + "symbol": "LINA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -20534,14 +30493,15 @@ }, { "tier": 2.0, + "symbol": "LINA/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "15", "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -20550,15 +30510,16 @@ }, { "tier": 3.0, + "symbol": "LINA/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 400000.0, + "maxNotional": 900000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "400000", + "notionalCap": "900000", "notionalFloor": "25000", "maintMarginRatio": "0.05", "cum": "650.0" @@ -20566,138 +30527,147 @@ }, { "tier": 4.0, + "symbol": "LINA/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 1000000.0, + "minNotional": 900000.0, + "maxNotional": 2400000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "4", "initialLeverage": "5", - "notionalCap": "1000000", - "notionalFloor": "400000", + "notionalCap": "2400000", + "notionalFloor": "900000", "maintMarginRatio": "0.1", - "cum": "20650.0" + "cum": "45650.0" } }, { "tier": 5.0, + "symbol": "LINA/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 2400000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "3000000", + "notionalFloor": "2400000", "maintMarginRatio": "0.125", - "cum": "45650.0" + "cum": "105650.0" } }, { "tier": 6.0, + "symbol": "LINA/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 6000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "6", "initialLeverage": "2", - "notionalCap": "6000000", - "notionalFloor": "2000000", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.25", - "cum": "295650.0" + "cum": "480650.0" } }, { "tier": 7.0, + "symbol": "LINA/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 10000000.0, + "minNotional": 5000000.0, + "maxNotional": 7000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "7", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalCap": "7000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1795650.0" + "cum": "1730650.0" } } ], - "HMSTR/USDT:USDT": [ + "LINK/USDC:USDC": [ { "tier": 1.0, - "currency": "USDT", + "symbol": "LINK/USDC:USDC", + "currency": "USDC", "minNotional": 0.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.01, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.005, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "10000", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.005", "cum": "0.0" } }, { "tier": 2.0, - "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.015, + "symbol": "LINK/USDC:USDC", + "currency": "USDC", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.006, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.015", - "cum": "50.0" + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.006", + "cum": "5.0" } }, { "tier": 3.0, - "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "symbol": "LINK/USDC:USDC", + "currency": "USDC", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 40.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "100000", - "notionalFloor": "20000", - "maintMarginRatio": "0.02", - "cum": "150.0" + "initialLeverage": "40", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "45.0" } }, { "tier": 4.0, - "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 200000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "symbol": "LINK/USDC:USDC", + "currency": "USDC", + "minNotional": 50000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "200000", - "notionalFloor": "100000", - "maintMarginRatio": "0.025", - "cum": "650.0" + "initialLeverage": "25", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "545.0" } }, { "tier": 5.0, - "currency": "USDT", - "minNotional": 200000.0, + "symbol": "LINK/USDC:USDC", + "currency": "USDC", + "minNotional": 250000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, @@ -20705,389 +30675,411 @@ "bracket": "5", "initialLeverage": "10", "notionalCap": "1000000", - "notionalFloor": "200000", + "notionalFloor": "250000", "maintMarginRatio": "0.05", - "cum": "5650.0" + "cum": "8045.0" } }, { "tier": 6.0, - "currency": "USDT", + "symbol": "LINK/USDC:USDC", + "currency": "USDC", "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "2000000", + "notionalCap": "5000000", "notionalFloor": "1000000", "maintMarginRatio": "0.1", - "cum": "55650.0" + "cum": "58045.0" } }, { "tier": 7.0, - "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 2500000.0, + "symbol": "LINK/USDC:USDC", + "currency": "USDC", + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "2500000", - "notionalFloor": "2000000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.125", - "cum": "105650.0" + "cum": "183045.0" } }, { "tier": 8.0, - "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "symbol": "LINK/USDC:USDC", + "currency": "USDC", + "minNotional": 10000000.0, + "maxNotional": 20000000.0, + "maintenanceMarginRate": 0.15, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.15", + "cum": "433045.0" + } + }, + { + "tier": 9.0, + "symbol": "LINK/USDC:USDC", + "currency": "USDC", + "minNotional": 20000000.0, + "maxNotional": 30000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "2", - "notionalCap": "5000000", - "notionalFloor": "2500000", + "notionalCap": "30000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.25", - "cum": "418150.0" + "cum": "2433045.0" } }, { - "tier": 9.0, - "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "tier": 10.0, + "symbol": "LINK/USDC:USDC", + "currency": "USDC", + "minNotional": 30000000.0, + "maxNotional": 50000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "50000000", + "notionalFloor": "30000000", "maintMarginRatio": "0.5", - "cum": "1668150.0" + "cum": "9933045.0" } } ], - "HOOK/USDT:USDT": [ + "LINK/USDT:USDT": [ { "tier": 1.0, + "symbol": "LINK/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.005, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "20", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.005", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "LINK/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, + "minNotional": 10000.0, "maxNotional": 50000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "15", + "initialLeverage": "50", "notionalCap": "50000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "LINK/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 200000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxNotional": 160000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 40.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "200000", + "initialLeverage": "40", + "notionalCap": "160000", "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1275.0" + "maintMarginRatio": "0.015", + "cum": "300.0" } }, { "tier": 4.0, + "symbol": "LINK/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "4", - "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", - "maintMarginRatio": "0.1", - "cum": "11275.0" - } - }, - { - "tier": 5.0, - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 2.0, - "info": { - "bracket": "5", - "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", - "maintMarginRatio": "0.125", - "cum": "23775.0" - } - }, - { - "tier": 6.0, - "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.5, - "maxLeverage": 1.0, - "info": { - "bracket": "6", - "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "1000000", - "maintMarginRatio": "0.5", - "cum": "398775.0" - } - } - ], - "HOT/USDT:USDT": [ - { - "tier": 1.0, - "currency": "USDT", - "minNotional": 0.0, - "maxNotional": 5000.0, + "minNotional": 160000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "1", + "bracket": "4", "initialLeverage": "25", - "notionalCap": "5000", - "notionalFloor": "0", + "notionalCap": "800000", + "notionalFloor": "160000", "maintMarginRatio": "0.02", - "cum": "0.0" + "cum": "1100.0" } }, { - "tier": 2.0, + "tier": 5.0, + "symbol": "LINK/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, + "minNotional": 800000.0, + "maxNotional": 1600000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "2", + "bracket": "5", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "5000", + "notionalCap": "1600000", + "notionalFloor": "800000", "maintMarginRatio": "0.025", - "cum": "25.0" + "cum": "5100.0" } }, { - "tier": 3.0, + "tier": 6.0, + "symbol": "LINK/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 100000.0, + "minNotional": 1600000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "6", "initialLeverage": "10", - "notionalCap": "100000", - "notionalFloor": "25000", + "notionalCap": "8000000", + "notionalFloor": "1600000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "45100.0" } }, { - "tier": 4.0, + "tier": 7.0, + "symbol": "LINK/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 250000.0, + "minNotional": 8000000.0, + "maxNotional": 16000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "7", "initialLeverage": "5", - "notionalCap": "250000", - "notionalFloor": "100000", + "notionalCap": "16000000", + "notionalFloor": "8000000", "maintMarginRatio": "0.1", - "cum": "5650.0" + "cum": "445100.0" } }, { - "tier": 5.0, + "tier": 8.0, + "symbol": "LINK/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 1000000.0, + "minNotional": 16000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "8", + "initialLeverage": "4", + "notionalCap": "20000000", + "notionalFloor": "16000000", + "maintMarginRatio": "0.125", + "cum": "845100.0" + } + }, + { + "tier": 9.0, + "symbol": "LINK/USDT:USDT", + "currency": "USDT", + "minNotional": 20000000.0, + "maxNotional": 40000000.0, + "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "5", + "bracket": "9", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "11900.0" + "notionalCap": "40000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.25", + "cum": "3345100.0" } }, { - "tier": 6.0, + "tier": 10.0, + "symbol": "LINK/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 5000000.0, + "minNotional": 40000000.0, + "maxNotional": 80000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "1000000", + "notionalCap": "80000000", + "notionalFloor": "40000000", "maintMarginRatio": "0.5", - "cum": "386900.0" + "cum": "13345100.0" } } ], - "ICP/USDT:USDT": [ + "LISTA/USDT:USDT": [ { "tier": 1.0, + "symbol": "LISTA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "LISTA/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "25", "notionalCap": "25000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.02", + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "LISTA/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 600000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "150.0" + } + }, + { + "tier": 4.0, + "symbol": "LISTA/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "10", - "notionalCap": "600000", - "notionalFloor": "25000", + "notionalCap": "500000", + "notionalFloor": "50000", "maintMarginRatio": "0.05", - "cum": "700.0" + "cum": "1400.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "LISTA/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 1600000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "5", - "notionalCap": "1600000", - "notionalFloor": "600000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "30700.0" + "cum": "26400.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "LISTA/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 2000000.0, + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1600000", + "notionalCap": "1250000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "70700.0" + "cum": "51400.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "LISTA/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 6000000.0, + "minNotional": 1250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "2", - "notionalCap": "6000000", - "notionalFloor": "2000000", + "notionalCap": "2500000", + "notionalFloor": "1250000", "maintMarginRatio": "0.25", - "cum": "320700.0" + "cum": "207650.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "LISTA/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 10000000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1820700.0" + "cum": "832650.0" } } ], - "ICX/USDT:USDT": [ + "LIT/USDT:USDT": [ { "tier": 1.0, + "symbol": "LIT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -21104,6 +31096,7 @@ }, { "tier": 2.0, + "symbol": "LIT/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 20000.0, @@ -21120,6 +31113,7 @@ }, { "tier": 3.0, + "symbol": "LIT/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 25000.0, @@ -21136,6 +31130,7 @@ }, { "tier": 4.0, + "symbol": "LIT/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 200000.0, @@ -21152,6 +31147,7 @@ }, { "tier": 5.0, + "symbol": "LIT/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 400000.0, @@ -21168,6 +31164,7 @@ }, { "tier": 6.0, + "symbol": "LIT/USDT:USDT", "currency": "USDT", "minNotional": 400000.0, "maxNotional": 500000.0, @@ -21184,6 +31181,7 @@ }, { "tier": 7.0, + "symbol": "LIT/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -21200,6 +31198,7 @@ }, { "tier": 8.0, + "symbol": "LIT/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -21215,385 +31214,460 @@ } } ], - "ID/USDT:USDT": [ + "LOKA/USDT:USDT": [ { "tier": 1.0, + "symbol": "LOKA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "20", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "LOKA/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "15", - "notionalCap": "25000", + "initialLeverage": "50", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.015", "cum": "25.0" } }, { "tier": 3.0, + "symbol": "LOKA/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, + "minNotional": 10000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "20000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "LOKA/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 40000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "40000", + "notionalFloor": "20000", + "maintMarginRatio": "0.025", + "cum": "175.0" + } + }, + { + "tier": 5.0, + "symbol": "LOKA/USDT:USDT", + "currency": "USDT", + "minNotional": 40000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", "notionalCap": "200000", - "notionalFloor": "25000", + "notionalFloor": "40000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "1175.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "LOKA/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, - "maxNotional": 500000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "500000", + "notionalCap": "400000", "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "10650.0" + "cum": "11175.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "LOKA/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 400000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "500000", + "notionalFloor": "400000", "maintMarginRatio": "0.125", - "cum": "23150.0" + "cum": "21175.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "LOKA/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "148150.0" + "cum": "83675.0" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "LOKA/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 5000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "3000000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "898150.0" + "cum": "333675.0" } } ], - "IDEX/USDT:USDT": [ + "LOOM/USDT:USDT": [ { "tier": 1.0, + "symbol": "LOOM/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.03, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "20", - "notionalCap": "5000", + "initialLeverage": "10", + "notionalCap": "25000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.03", "cum": "0.0" } }, { "tier": 2.0, - "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, - "info": { - "bracket": "2", - "initialLeverage": "15", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" - } - }, - { - "tier": 3.0, + "symbol": "LOOM/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { - "bracket": "3", - "initialLeverage": "10", + "bracket": "2", + "initialLeverage": "8", "notionalCap": "200000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "500.0" } }, { - "tier": 4.0, + "tier": 3.0, + "symbol": "LOOM/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "5", "notionalCap": "500000", "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "10650.0" + "cum": "10500.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "LOOM/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "4", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "23150.0" + "cum": "23000.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "LOOM/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "2", - "notionalCap": "3000000", + "notionalCap": "1500000", "notionalFloor": "1000000", "maintMarginRatio": "0.25", - "cum": "148150.0" + "cum": "148000.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "LOOM/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3500000.0, + "minNotional": 1500000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "3500000", - "notionalFloor": "3000000", + "notionalCap": "2000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "898150.0" + "cum": "523000.0" } } ], - "ILV/USDT:USDT": [ + "LPT/USDT:USDT": [ { "tier": 1.0, + "symbol": "LPT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "LPT/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, + "maxNotional": 16000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "16000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "LPT/USDT:USDT", + "currency": "USDT", + "minNotional": 16000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "80000", + "notionalFloor": "16000", + "maintMarginRatio": "0.02", + "cum": "105.0" + } + }, + { + "tier": 4.0, + "symbol": "LPT/USDT:USDT", + "currency": "USDT", + "minNotional": 80000.0, + "maxNotional": 160000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "2", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "5000", + "notionalCap": "160000", + "notionalFloor": "80000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "505.0" } }, { - "tier": 3.0, + "tier": 5.0, + "symbol": "LPT/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 100000.0, + "minNotional": 160000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "100000", - "notionalFloor": "25000", + "notionalCap": "800000", + "notionalFloor": "160000", "maintMarginRatio": "0.05", - "cum": "675.0" + "cum": "4505.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "LPT/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 200000.0, + "minNotional": 800000.0, + "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "200000", - "notionalFloor": "100000", + "notionalCap": "1600000", + "notionalFloor": "800000", "maintMarginRatio": "0.1", - "cum": "5675.0" + "cum": "44505.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "LPT/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 1600000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "2000000", + "notionalFloor": "1600000", "maintMarginRatio": "0.125", - "cum": "10675.0" + "cum": "84505.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "LPT/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 2000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "4000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.25", - "cum": "73175.0" + "cum": "334505.0" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "LPT/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 4000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "8000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "323175.0" + "cum": "1334505.0" } } ], - "IMX/USDT:USDT": [ + "LQTY/USDT:USDT": [ { "tier": 1.0, + "symbol": "LQTY/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "LQTY/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 50000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "50000", + "initialLeverage": "15", + "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "LQTY/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, + "minNotional": 25000.0, "maxNotional": 600000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, @@ -21601,13 +31675,14 @@ "bracket": "3", "initialLeverage": "10", "notionalCap": "600000", - "notionalFloor": "50000", + "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "1300.0" + "cum": "650.0" } }, { "tier": 4.0, + "symbol": "LQTY/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, "maxNotional": 1600000.0, @@ -21619,11 +31694,12 @@ "notionalCap": "1600000", "notionalFloor": "600000", "maintMarginRatio": "0.1", - "cum": "31300.0" + "cum": "30650.0" } }, { "tier": 5.0, + "symbol": "LQTY/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, "maxNotional": 2000000.0, @@ -21635,971 +31711,1254 @@ "notionalCap": "2000000", "notionalFloor": "1600000", "maintMarginRatio": "0.125", - "cum": "71300.0" + "cum": "70650.0" } }, { "tier": 6.0, + "symbol": "LQTY/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, - "maxNotional": 4000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "6", "initialLeverage": "2", - "notionalCap": "4000000", + "notionalCap": "6000000", "notionalFloor": "2000000", "maintMarginRatio": "0.25", - "cum": "321300.0" + "cum": "320650.0" } }, { "tier": 7.0, + "symbol": "LQTY/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 4500000.0, + "minNotional": 6000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "7", "initialLeverage": "1", - "notionalCap": "4500000", - "notionalFloor": "4000000", + "notionalCap": "10000000", + "notionalFloor": "6000000", "maintMarginRatio": "0.5", - "cum": "1321300.0" + "cum": "1820650.0" } } ], - "INJ/USDT:USDT": [ + "LRC/USDT:USDT": [ { "tier": 1.0, + "symbol": "LRC/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "75", - "notionalCap": "10000", + "initialLeverage": "50", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "LRC/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 40000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", - "notionalCap": "40000", - "notionalFloor": "10000", - "maintMarginRatio": "0.015", + "initialLeverage": "10", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", "cum": "50.0" } }, { "tier": 3.0, + "symbol": "LRC/USDT:USDT", "currency": "USDT", - "minNotional": 40000.0, - "maxNotional": 200000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 25000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "200000", - "notionalFloor": "40000", - "maintMarginRatio": "0.02", - "cum": "250.0" + "initialLeverage": "8", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "675.0" } }, { "tier": 4.0, + "symbol": "LRC/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "5675.0" + } + }, + { + "tier": 5.0, + "symbol": "LRC/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 2.0, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11925.0" + } + }, + { + "tier": 6.0, + "symbol": "LRC/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "5000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386925.0" + } + } + ], + "LSK/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "LSK/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": "LSK/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "20", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "25000", + "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "1250.0" + "cum": "50.0" } }, { - "tier": 5.0, + "tier": 3.0, + "symbol": "LSK/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 2000000.0, + "minNotional": 25000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "10", - "notionalCap": "2000000", - "notionalFloor": "400000", + "notionalCap": "100000", + "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "11250.0" + "cum": "675.0" } }, { - "tier": 6.0, + "tier": 4.0, + "symbol": "LSK/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, + "minNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "5", - "notionalCap": "4000000", - "notionalFloor": "2000000", + "notionalCap": "200000", + "notionalFloor": "100000", "maintMarginRatio": "0.1", - "cum": "111250.0" + "cum": "5675.0" } }, { - "tier": 7.0, + "tier": 5.0, + "symbol": "LSK/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 5000000.0, + "minNotional": 200000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "4", - "notionalCap": "5000000", - "notionalFloor": "4000000", + "notionalCap": "500000", + "notionalFloor": "200000", "maintMarginRatio": "0.125", - "cum": "211250.0" + "cum": "10675.0" } }, { - "tier": 8.0, + "tier": 6.0, + "symbol": "LSK/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 12000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "2", - "notionalCap": "12000000", - "notionalFloor": "5000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "836250.0" + "cum": "73175.0" } }, { - "tier": 9.0, + "tier": 7.0, + "symbol": "LSK/USDT:USDT", "currency": "USDT", - "minNotional": 12000000.0, - "maxNotional": 20000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "20000000", - "notionalFloor": "12000000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "3836250.0" + "cum": "323175.0" } } ], - "IO/USDT:USDT": [ + "LTC/USDC:USDC": [ { "tier": 1.0, - "currency": "USDT", + "symbol": "LTC/USDC:USDC", + "currency": "USDC", "minNotional": 0.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.01, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.005, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "10000", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.005", "cum": "0.0" } }, { "tier": 2.0, - "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 30000.0, - "maintenanceMarginRate": 0.015, + "symbol": "LTC/USDC:USDC", + "currency": "USDC", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.006, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "30000", - "notionalFloor": "10000", - "maintMarginRatio": "0.015", - "cum": "50.0" + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.006", + "cum": "5.0" } }, { "tier": 3.0, - "currency": "USDT", - "minNotional": 30000.0, - "maxNotional": 150000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "symbol": "LTC/USDC:USDC", + "currency": "USDC", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 40.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "150000", - "notionalFloor": "30000", - "maintMarginRatio": "0.02", - "cum": "200.0" + "initialLeverage": "40", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "45.0" } }, { "tier": 4.0, - "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 300000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "symbol": "LTC/USDC:USDC", + "currency": "USDC", + "minNotional": 50000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "300000", - "notionalFloor": "150000", - "maintMarginRatio": "0.025", - "cum": "950.0" + "initialLeverage": "25", + "notionalCap": "750000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "545.0" } }, { "tier": 5.0, - "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 1500000.0, + "symbol": "LTC/USDC:USDC", + "currency": "USDC", + "minNotional": 750000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "1500000", - "notionalFloor": "300000", + "notionalCap": "3000000", + "notionalFloor": "750000", "maintMarginRatio": "0.05", - "cum": "8450.0" + "cum": "23045.0" } }, { "tier": 6.0, - "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "symbol": "LTC/USDC:USDC", + "currency": "USDC", + "minNotional": 3000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "10000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.1", - "cum": "83450.0" + "cum": "173045.0" } }, { "tier": 7.0, - "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3750000.0, + "symbol": "LTC/USDC:USDC", + "currency": "USDC", + "minNotional": 10000000.0, + "maxNotional": 12000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "3750000", - "notionalFloor": "3000000", + "notionalCap": "12000000", + "notionalFloor": "10000000", "maintMarginRatio": "0.125", - "cum": "158450.0" + "cum": "423045.0" } }, { "tier": 8.0, - "currency": "USDT", - "minNotional": 3750000.0, - "maxNotional": 7500000.0, + "symbol": "LTC/USDC:USDC", + "currency": "USDC", + "minNotional": 12000000.0, + "maxNotional": 20000000.0, + "maintenanceMarginRate": 0.15, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "20000000", + "notionalFloor": "12000000", + "maintMarginRatio": "0.15", + "cum": "723045.0" + } + }, + { + "tier": 9.0, + "symbol": "LTC/USDC:USDC", + "currency": "USDC", + "minNotional": 20000000.0, + "maxNotional": 30000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "3750000", + "notionalCap": "30000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.25", - "cum": "627200.0" + "cum": "2723045.0" } }, { - "tier": 9.0, - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "tier": 10.0, + "symbol": "LTC/USDC:USDC", + "currency": "USDC", + "minNotional": 30000000.0, + "maxNotional": 50000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "50000000", + "notionalFloor": "30000000", "maintMarginRatio": "0.5", - "cum": "2502200.0" + "cum": "10223045.0" } } ], - "IOST/USDT:USDT": [ + "LTC/USDT:USDT": [ { "tier": 1.0, + "symbol": "LTC/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.005, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.005", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "LTC/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "LTC/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 160000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 40.0, + "info": { + "bracket": "3", + "initialLeverage": "40", + "notionalCap": "160000", + "notionalFloor": "50000", + "maintMarginRatio": "0.015", + "cum": "300.0" + } + }, + { + "tier": 4.0, + "symbol": "LTC/USDT:USDT", + "currency": "USDT", + "minNotional": 160000.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "4", + "initialLeverage": "25", + "notionalCap": "800000", + "notionalFloor": "160000", + "maintMarginRatio": "0.02", + "cum": "1100.0" + } + }, + { + "tier": 5.0, + "symbol": "LTC/USDT:USDT", + "currency": "USDT", + "minNotional": 800000.0, + "maxNotional": 1600000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "2", + "bracket": "5", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "5000", + "notionalCap": "1600000", + "notionalFloor": "800000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "5100.0" } }, { - "tier": 3.0, + "tier": 6.0, + "symbol": "LTC/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 1600000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "6", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "8000000", + "notionalFloor": "1600000", "maintMarginRatio": "0.05", - "cum": "675.0" + "cum": "45100.0" } }, { - "tier": 4.0, + "tier": 7.0, + "symbol": "LTC/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 8000000.0, + "maxNotional": 16000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "7", "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "16000000", + "notionalFloor": "8000000", "maintMarginRatio": "0.1", - "cum": "10675.0" + "cum": "445100.0" } }, { - "tier": 5.0, + "tier": 8.0, + "symbol": "LTC/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 16000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "8", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "20000000", + "notionalFloor": "16000000", "maintMarginRatio": "0.125", - "cum": "23175.0" + "cum": "845100.0" } }, { - "tier": 6.0, + "tier": 9.0, + "symbol": "LTC/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "minNotional": 20000000.0, + "maxNotional": 40000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "9", "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalCap": "40000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.25", - "cum": "148175.0" + "cum": "3345100.0" } }, { - "tier": 7.0, + "tier": 10.0, + "symbol": "LTC/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 5000000.0, + "minNotional": 40000000.0, + "maxNotional": 80000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "3000000", + "notionalCap": "80000000", + "notionalFloor": "40000000", "maintMarginRatio": "0.5", - "cum": "898175.0" + "cum": "13345100.0" } } ], - "IOTA/USDT:USDT": [ + "LUMIA/USDT:USDT": [ { "tier": 1.0, + "symbol": "LUMIA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "LUMIA/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "20000", + "initialLeverage": "50", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.015", "cum": "25.0" } }, { "tier": 3.0, + "symbol": "LUMIA/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 25000.0, + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "LUMIA/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "20000", + "notionalCap": "60000", + "notionalFloor": "30000", "maintMarginRatio": "0.025", - "cum": "125.0" + "cum": "225.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "LUMIA/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 60000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.05", - "cum": "750.0" + "cum": "1725.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "LUMIA/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "10750.0" + "cum": "16725.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "LUMIA/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 600000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "750000", + "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "20750.0" + "cum": "31725.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "LUMIA/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "83250.0" + "cum": "125475.0" } }, { - "tier": 8.0, + "tier": 9.0, + "symbol": "LUMIA/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "333250.0" + "cum": "500475.0" } } ], - "IOTX/USDT:USDT": [ + "LUNA2/USDT:USDT": [ { "tier": 1.0, + "symbol": "LUNA2/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "LUNA2/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "20000", + "initialLeverage": "50", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.015", "cum": "25.0" } }, { "tier": 3.0, + "symbol": "LUNA2/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 25000.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "LUNA2/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "20000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "125.0" + "cum": "325.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "LUNA2/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.05", - "cum": "750.0" + "cum": "2825.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "LUNA2/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "10750.0" + "cum": "27825.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "LUNA2/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "1250000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "20750.0" + "cum": "52825.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "LUNA2/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 1250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "2500000", + "notionalFloor": "1250000", "maintMarginRatio": "0.25", - "cum": "83250.0" + "cum": "209075.0" } }, { - "tier": 8.0, + "tier": 9.0, + "symbol": "LUNA2/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "333250.0" + "cum": "834075.0" } } ], - "JASMY/USDT:USDT": [ + "MAGIC/USDT:USDT": [ { "tier": 1.0, + "symbol": "MAGIC/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "MAGIC/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "25000", + "initialLeverage": "50", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.015", "cum": "25.0" } }, { "tier": 3.0, + "symbol": "MAGIC/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 80000.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "MAGIC/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "80000", - "notionalFloor": "25000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "150.0" + "cum": "325.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "MAGIC/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 800000.0, + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "800000", - "notionalFloor": "80000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.05", - "cum": "2150.0" + "cum": "2825.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "MAGIC/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 1600000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "1600000", - "notionalFloor": "800000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "42150.0" + "cum": "27825.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "MAGIC/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 2000000.0, + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1600000", + "notionalCap": "1250000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "82150.0" + "cum": "52825.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "MAGIC/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, + "minNotional": 1250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "4000000", - "notionalFloor": "2000000", + "notionalCap": "2500000", + "notionalFloor": "1250000", "maintMarginRatio": "0.25", - "cum": "332150.0" + "cum": "209075.0" } }, { - "tier": 8.0, + "tier": 9.0, + "symbol": "MAGIC/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "8000000", - "notionalFloor": "4000000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1332150.0" + "cum": "834075.0" } } ], - "JOE/USDT:USDT": [ + "MANA/USDT:USDT": [ { "tier": 1.0, + "symbol": "MANA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.0065, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "20", + "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.0065", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "MANA/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "maintenanceMarginRate": 0.0075, + "maxLeverage": 40.0, "info": { "bracket": "2", - "initialLeverage": "15", + "initialLeverage": "40", "notionalCap": "25000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" + "maintMarginRatio": "0.0075", + "cum": "5.0" } }, { "tier": 3.0, + "symbol": "MANA/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 200000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "25000", + "maintMarginRatio": "0.01", + "cum": "67.5" + } + }, + { + "tier": 4.0, + "symbol": "MANA/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 150000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "817.5" + } + }, + { + "tier": 5.0, + "symbol": "MANA/USDT:USDT", + "currency": "USDT", + "minNotional": 150000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "250000", + "notionalFloor": "150000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "4567.5" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "MANA/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, + "minNotional": 250000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", "notionalCap": "500000", - "notionalFloor": "200000", + "notionalFloor": "250000", "maintMarginRatio": "0.1", - "cum": "10650.0" + "cum": "17067.5" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "MANA/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "4", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "23150.0" + "cum": "29567.5" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "MANA/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "3000000", + "notionalCap": "5000000", "notionalFloor": "1000000", "maintMarginRatio": "0.25", - "cum": "148150.0" + "cum": "154567.5" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "MANA/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 5000000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "3000000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "898150.0" + "cum": "1404567.5" } } ], - "JTO/USDT:USDT": [ + "MANTA/USDT:USDT": [ { "tier": 1.0, + "symbol": "MANTA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, + "maintenanceMarginRate": 0.01, "maxLeverage": 50.0, "info": { "bracket": "1", "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "MANTA/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 50000.0, @@ -22611,11 +32970,12 @@ "notionalCap": "50000", "notionalFloor": "5000", "maintMarginRatio": "0.02", - "cum": "25.0" + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "MANTA/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, "maxNotional": 100000.0, @@ -22627,11 +32987,12 @@ "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "275.0" + "cum": "300.0" } }, { "tier": 4.0, + "symbol": "MANTA/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 1000000.0, @@ -22643,11 +33004,12 @@ "notionalCap": "1000000", "notionalFloor": "100000", "maintMarginRatio": "0.05", - "cum": "2775.0" + "cum": "2800.0" } }, { "tier": 5.0, + "symbol": "MANTA/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -22659,11 +33021,12 @@ "notionalCap": "2000000", "notionalFloor": "1000000", "maintMarginRatio": "0.1", - "cum": "52775.0" + "cum": "52800.0" } }, { "tier": 6.0, + "symbol": "MANTA/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 2500000.0, @@ -22675,11 +33038,12 @@ "notionalCap": "2500000", "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "102775.0" + "cum": "102800.0" } }, { "tier": 7.0, + "symbol": "MANTA/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, "maxNotional": 5000000.0, @@ -22691,11 +33055,12 @@ "notionalCap": "5000000", "notionalFloor": "2500000", "maintMarginRatio": "0.25", - "cum": "415275.0" + "cum": "415300.0" } }, { "tier": 8.0, + "symbol": "MANTA/USDT:USDT", "currency": "USDT", "minNotional": 5000000.0, "maxNotional": 10000000.0, @@ -22707,22 +33072,23 @@ "notionalCap": "10000000", "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1665275.0" + "cum": "1665300.0" } } ], - "JUP/USDT:USDT": [ + "MASK/USDT:USDT": [ { "tier": 1.0, + "symbol": "MASK/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, + "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "75", - "notionalCap": "10000", + "initialLeverage": "50", + "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -22730,136 +33096,128 @@ }, { "tier": 2.0, + "symbol": "MASK/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 30000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, - "info": { - "bracket": "2", - "initialLeverage": "50", - "notionalCap": "30000", - "notionalFloor": "10000", - "maintMarginRatio": "0.015", - "cum": "50.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 30000.0, - "maxNotional": 150000.0, + "minNotional": 5000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "3", + "bracket": "2", "initialLeverage": "25", - "notionalCap": "150000", - "notionalFloor": "30000", + "notionalCap": "25000", + "notionalFloor": "5000", "maintMarginRatio": "0.02", - "cum": "200.0" + "cum": "50.0" } }, { - "tier": 4.0, + "tier": 3.0, + "symbol": "MASK/USDT:USDT", "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 300000.0, + "minNotional": 25000.0, + "maxNotional": 900000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "20", - "notionalCap": "300000", - "notionalFloor": "150000", + "notionalCap": "900000", + "notionalFloor": "25000", "maintMarginRatio": "0.025", - "cum": "950.0" + "cum": "175.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "MASK/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 1500000.0, + "minNotional": 900000.0, + "maxNotional": 1800000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "10", - "notionalCap": "1500000", - "notionalFloor": "300000", + "notionalCap": "1800000", + "notionalFloor": "900000", "maintMarginRatio": "0.05", - "cum": "8450.0" + "cum": "22675.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "MASK/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 1800000.0, + "maxNotional": 4800000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "4800000", + "notionalFloor": "1800000", "maintMarginRatio": "0.1", - "cum": "83450.0" + "cum": "112675.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "MASK/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3750000.0, + "minNotional": 4800000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "4", - "notionalCap": "3750000", - "notionalFloor": "3000000", + "notionalCap": "6000000", + "notionalFloor": "4800000", "maintMarginRatio": "0.125", - "cum": "158450.0" + "cum": "232675.0" } }, { - "tier": 8.0, + "tier": 7.0, + "symbol": "MASK/USDT:USDT", "currency": "USDT", - "minNotional": 3750000.0, - "maxNotional": 7500000.0, + "minNotional": 6000000.0, + "maxNotional": 18000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "3750000", + "notionalCap": "18000000", + "notionalFloor": "6000000", "maintMarginRatio": "0.25", - "cum": "627200.0" + "cum": "982675.0" } }, { - "tier": 9.0, + "tier": 8.0, + "symbol": "MASK/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 18000000.0, + "maxNotional": 30000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "30000000", + "notionalFloor": "18000000", "maintMarginRatio": "0.5", - "cum": "2502200.0" + "cum": "5482675.0" } } ], - "KAS/USDT:USDT": [ + "MAV/USDT:USDT": [ { "tier": 1.0, + "symbol": "MAV/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -22876,6 +33234,7 @@ }, { "tier": 2.0, + "symbol": "MAV/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -22892,6 +33251,7 @@ }, { "tier": 3.0, + "symbol": "MAV/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 50000.0, @@ -22908,6 +33268,7 @@ }, { "tier": 4.0, + "symbol": "MAV/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, "maxNotional": 100000.0, @@ -22924,6 +33285,7 @@ }, { "tier": 5.0, + "symbol": "MAV/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 500000.0, @@ -22940,6 +33302,7 @@ }, { "tier": 6.0, + "symbol": "MAV/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -22956,6 +33319,7 @@ }, { "tier": 7.0, + "symbol": "MAV/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 1250000.0, @@ -22972,15 +33336,16 @@ }, { "tier": 8.0, + "symbol": "MAV/USDT:USDT", "currency": "USDT", "minNotional": 1250000.0, - "maxNotional": 2500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "2500000", + "notionalCap": "3000000", "notionalFloor": "1250000", "maintMarginRatio": "0.25", "cum": "209075.0" @@ -22988,8 +33353,9 @@ }, { "tier": 9.0, + "symbol": "MAV/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, + "minNotional": 3000000.0, "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, @@ -22997,23 +33363,24 @@ "bracket": "9", "initialLeverage": "1", "notionalCap": "5000000", - "notionalFloor": "2500000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "834075.0" + "cum": "959075.0" } } ], - "KAVA/USDT:USDT": [ + "MAVIA/USDT:USDT": [ { "tier": 1.0, + "symbol": "MAVIA/USDT:USDT", "currency": "USDT", "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", @@ -23022,120 +33389,111 @@ }, { "tier": 2.0, + "symbol": "MAVIA/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, - "info": { - "bracket": "2", - "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 20000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { - "bracket": "3", - "initialLeverage": "20", + "bracket": "2", + "initialLeverage": "8", "notionalCap": "25000", - "notionalFloor": "20000", + "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "125.0" + "cum": "50.0" } }, { - "tier": 4.0, + "tier": 3.0, + "symbol": "MAVIA/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 200000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { - "bracket": "4", - "initialLeverage": "10", - "notionalCap": "200000", + "bracket": "3", + "initialLeverage": "6", + "notionalCap": "100000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "750.0" + "cum": "675.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "MAVIA/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "200000", + "notionalFloor": "100000", "maintMarginRatio": "0.1", - "cum": "10750.0" + "cum": "5675.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "MAVIA/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, + "minNotional": 200000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "500000", - "notionalFloor": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.125", - "cum": "20750.0" + "cum": "10675.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "MAVIA/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "2", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "83250.0" + "cum": "73175.0" } }, { - "tier": 8.0, + "tier": 7.0, + "symbol": "MAVIA/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "1", "notionalCap": "2000000", "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "333250.0" + "cum": "323175.0" } } ], - "KDA/USDT:USDT": [ + "MBOX/USDT:USDT": [ { "tier": 1.0, + "symbol": "MBOX/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -23152,6 +33510,7 @@ }, { "tier": 2.0, + "symbol": "MBOX/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -23168,6 +33527,7 @@ }, { "tier": 3.0, + "symbol": "MBOX/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 20000.0, @@ -23184,6 +33544,7 @@ }, { "tier": 4.0, + "symbol": "MBOX/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 40000.0, @@ -23200,6 +33561,7 @@ }, { "tier": 5.0, + "symbol": "MBOX/USDT:USDT", "currency": "USDT", "minNotional": 40000.0, "maxNotional": 200000.0, @@ -23216,6 +33578,7 @@ }, { "tier": 6.0, + "symbol": "MBOX/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 400000.0, @@ -23232,6 +33595,7 @@ }, { "tier": 7.0, + "symbol": "MBOX/USDT:USDT", "currency": "USDT", "minNotional": 400000.0, "maxNotional": 500000.0, @@ -23248,6 +33612,7 @@ }, { "tier": 8.0, + "symbol": "MBOX/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -23264,6 +33629,7 @@ }, { "tier": 9.0, + "symbol": "MBOX/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -23279,9 +33645,10 @@ } } ], - "KEY/USDT:USDT": [ + "MDT/USDT:USDT": [ { "tier": 1.0, + "symbol": "MDT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -23298,6 +33665,7 @@ }, { "tier": 2.0, + "symbol": "MDT/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -23314,6 +33682,7 @@ }, { "tier": 3.0, + "symbol": "MDT/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 200000.0, @@ -23330,6 +33699,7 @@ }, { "tier": 4.0, + "symbol": "MDT/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, @@ -23346,6 +33716,7 @@ }, { "tier": 5.0, + "symbol": "MDT/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -23362,6 +33733,7 @@ }, { "tier": 6.0, + "symbol": "MDT/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 3000000.0, @@ -23378,984 +33750,769 @@ }, { "tier": 7.0, + "symbol": "MDT/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, - "maxNotional": 5000000.0, + "maxNotional": 3500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "7", "initialLeverage": "1", - "notionalCap": "5000000", + "notionalCap": "3500000", "notionalFloor": "3000000", "maintMarginRatio": "0.5", "cum": "898150.0" } } ], - "KLAY/USDT:USDT": [ + "ME/USDT:USDT": [ { "tier": 1.0, + "symbol": "ME/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "ME/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, - "info": { - "bracket": "2", - "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 400000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, - "info": { - "bracket": "3", - "initialLeverage": "10", - "notionalCap": "400000", - "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1300.0" - } - }, - { - "tier": 4.0, - "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "4", - "initialLeverage": "5", - "notionalCap": "1000000", - "notionalFloor": "400000", - "maintMarginRatio": "0.1", - "cum": "21300.0" - } - }, - { - "tier": 5.0, - "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "5", - "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1000000", - "maintMarginRatio": "0.125", - "cum": "46300.0" - } - }, - { - "tier": 6.0, - "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 6000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "6", - "initialLeverage": "2", - "notionalCap": "6000000", - "notionalFloor": "2000000", - "maintMarginRatio": "0.25", - "cum": "296300.0" - } - }, - { - "tier": 7.0, - "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 10000000.0, - "maintenanceMarginRate": 0.5, - "maxLeverage": 1.0, - "info": { - "bracket": "7", - "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "6000000", - "maintMarginRatio": "0.5", - "cum": "1796300.0" - } - } - ], - "KNC/USDT:USDT": [ - { - "tier": 1.0, - "currency": "USDT", - "minNotional": 0.0, - "maxNotional": 5000.0, + "minNotional": 10000.0, + "maxNotional": 30000.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, - "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, - "info": { - "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "20000", - "maintMarginRatio": "0.025", - "cum": "125.0" - } - }, - { - "tier": 4.0, - "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, - "info": { - "bracket": "4", - "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "750.0" - } - }, - { - "tier": 5.0, - "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", - "maintMarginRatio": "0.1", - "cum": "10750.0" - } - }, - { - "tier": 6.0, - "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "6", - "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", - "maintMarginRatio": "0.125", - "cum": "20750.0" - } - }, - { - "tier": 7.0, - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "83250.0" - } - }, - { - "tier": 8.0, - "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, - "maintenanceMarginRate": 0.5, - "maxLeverage": 1.0, - "info": { - "bracket": "8", - "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", - "maintMarginRatio": "0.5", - "cum": "333250.0" - } - } - ], - "KSM/USDT:USDT": [ - { - "tier": 1.0, - "currency": "USDT", - "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, - "info": { - "bracket": "1", "initialLeverage": "50", - "notionalCap": "5000", - "notionalFloor": "0", + "notionalCap": "30000", + "notionalFloor": "10000", "maintMarginRatio": "0.015", - "cum": "0.0" + "cum": "50.0" } }, { - "tier": 2.0, + "tier": 3.0, + "symbol": "ME/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 20000.0, + "minNotional": 30000.0, + "maxNotional": 150000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "2", + "bracket": "3", "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "5000", + "notionalCap": "150000", + "notionalFloor": "30000", "maintMarginRatio": "0.02", - "cum": "25.0" + "cum": "200.0" } }, { - "tier": 3.0, + "tier": 4.0, + "symbol": "ME/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 25000.0, + "minNotional": 150000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "20000", + "notionalCap": "300000", + "notionalFloor": "150000", "maintMarginRatio": "0.025", - "cum": "125.0" + "cum": "950.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "ME/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 300000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "1500000", + "notionalFloor": "300000", "maintMarginRatio": "0.05", - "cum": "750.0" + "cum": "8450.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "ME/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.1", - "cum": "10750.0" + "cum": "83450.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "ME/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 3000000.0, + "maxNotional": 3750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "3750000", + "notionalFloor": "3000000", "maintMarginRatio": "0.125", - "cum": "20750.0" + "cum": "158450.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "ME/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 3750000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "7500000", + "notionalFloor": "3750000", "maintMarginRatio": "0.25", - "cum": "83250.0" + "cum": "627200.0" } }, { - "tier": 8.0, + "tier": 9.0, + "symbol": "ME/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 7500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "15000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "333250.0" + "cum": "2502200.0" } } ], - "LDO/USDT:USDT": [ + "MEME/USDT:USDT": [ { "tier": 1.0, + "symbol": "MEME/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.006, + "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.006", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "MEME/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.01, + "maxNotional": 16000.0, + "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "50000", + "notionalCap": "16000", "notionalFloor": "5000", - "maintMarginRatio": "0.01", - "cum": "20.0" + "maintMarginRatio": "0.015", + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "MEME/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, + "minNotional": 16000.0, "maxNotional": 80000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 40.0, - "info": { - "bracket": "3", - "initialLeverage": "40", - "notionalCap": "80000", - "notionalFloor": "50000", - "maintMarginRatio": "0.015", - "cum": "270.0" - } - }, - { - "tier": 4.0, - "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 200000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "25", - "notionalCap": "200000", - "notionalFloor": "80000", + "notionalCap": "80000", + "notionalFloor": "16000", "maintMarginRatio": "0.02", - "cum": "670.0" + "cum": "105.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "MEME/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 80000.0, + "maxNotional": 160000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "160000", + "notionalFloor": "80000", "maintMarginRatio": "0.025", - "cum": "1670.0" + "cum": "505.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "MEME/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 2000000.0, + "minNotional": 160000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "2000000", - "notionalFloor": "400000", + "notionalCap": "800000", + "notionalFloor": "160000", "maintMarginRatio": "0.05", - "cum": "11670.0" + "cum": "4505.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "MEME/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, + "minNotional": 800000.0, + "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "4000000", - "notionalFloor": "2000000", + "notionalCap": "1600000", + "notionalFloor": "800000", "maintMarginRatio": "0.1", - "cum": "111670.0" + "cum": "44505.0" } }, { - "tier": 8.0, + "tier": 7.0, + "symbol": "MEME/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 5000000.0, + "minNotional": 1600000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "5000000", - "notionalFloor": "4000000", + "notionalCap": "2000000", + "notionalFloor": "1600000", "maintMarginRatio": "0.125", - "cum": "211670.0" + "cum": "84505.0" } }, { - "tier": 9.0, + "tier": 8.0, + "symbol": "MEME/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 12000000.0, + "minNotional": 2000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "12000000", - "notionalFloor": "5000000", + "notionalCap": "4000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.25", - "cum": "836670.0" + "cum": "334505.0" } }, { - "tier": 10.0, + "tier": 9.0, + "symbol": "MEME/USDT:USDT", "currency": "USDT", - "minNotional": 12000000.0, - "maxNotional": 20000000.0, + "minNotional": 4000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "20000000", - "notionalFloor": "12000000", + "notionalCap": "8000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "3836670.0" + "cum": "1334505.0" } } ], - "LEVER/USDT:USDT": [ + "METIS/USDT:USDT": [ { "tier": 1.0, + "symbol": "METIS/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "20", + "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "METIS/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "15", + "initialLeverage": "20", "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "25.0" + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "METIS/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 200000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "200000", + "notionalCap": "100000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "675.0" } }, { "tier": 4.0, + "symbol": "METIS/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "4", "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "200000", + "notionalFloor": "100000", "maintMarginRatio": "0.1", - "cum": "10650.0" + "cum": "5675.0" } }, { "tier": 5.0, + "symbol": "METIS/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 200000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "500000", + "notionalFloor": "200000", "maintMarginRatio": "0.125", - "cum": "23150.0" + "cum": "10675.0" } }, { "tier": 6.0, + "symbol": "METIS/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "6", "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "148150.0" + "cum": "73175.0" } }, { "tier": 7.0, + "symbol": "METIS/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 5000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "7", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "3000000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "898150.0" + "cum": "323175.0" } } ], - "LINA/USDT:USDT": [ + "MEW/USDT:USDT": [ { "tier": 1.0, + "symbol": "MEW/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "20", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "MEW/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "minNotional": 10000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "15", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" + "initialLeverage": "50", + "notionalCap": "60000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "MEW/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 900000.0, + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.02", + "cum": "350.0" + } + }, + { + "tier": 4.0, + "symbol": "MEW/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.025", + "cum": "1850.0" + } + }, + { + "tier": 5.0, + "symbol": "MEW/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "900000", - "notionalFloor": "25000", + "notionalCap": "3000000", + "notionalFloor": "600000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "16850.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "MEW/USDT:USDT", "currency": "USDT", - "minNotional": 900000.0, - "maxNotional": 2400000.0, + "minNotional": 3000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "2400000", - "notionalFloor": "900000", + "notionalCap": "6000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.1", - "cum": "45650.0" + "cum": "166850.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "MEW/USDT:USDT", "currency": "USDT", - "minNotional": 2400000.0, - "maxNotional": 3000000.0, + "minNotional": 6000000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "3000000", - "notionalFloor": "2400000", + "notionalCap": "7500000", + "notionalFloor": "6000000", "maintMarginRatio": "0.125", - "cum": "105650.0" + "cum": "316850.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "MEW/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 5000000.0, + "minNotional": 7500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "5000000", - "notionalFloor": "3000000", + "notionalCap": "15000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.25", - "cum": "480650.0" + "cum": "1254350.0" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "MEW/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 7000000.0, + "minNotional": 15000000.0, + "maxNotional": 30000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "7000000", - "notionalFloor": "5000000", + "notionalCap": "30000000", + "notionalFloor": "15000000", "maintMarginRatio": "0.5", - "cum": "1730650.0" + "cum": "5004350.0" } } ], - "LINK/USDC:USDC": [ + "MINA/USDT:USDT": [ { "tier": 1.0, - "currency": "USDC", + "symbol": "MINA/USDT:USDT", + "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.005, - "maxLeverage": 75.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.005", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, - "currency": "USDC", + "symbol": "MINA/USDT:USDT", + "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.006, - "maxLeverage": 50.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", - "notionalCap": "10000", + "initialLeverage": "20", + "notionalCap": "50000", "notionalFloor": "5000", - "maintMarginRatio": "0.006", - "cum": "5.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { "tier": 3.0, - "currency": "USDC", - "minNotional": 10000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 40.0, - "info": { - "bracket": "3", - "initialLeverage": "40", - "notionalCap": "50000", - "notionalFloor": "10000", - "maintMarginRatio": "0.01", - "cum": "45.0" - } - }, - { - "tier": 4.0, - "currency": "USDC", + "symbol": "MINA/USDT:USDT", + "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, - "info": { - "bracket": "4", - "initialLeverage": "25", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.02", - "cum": "545.0" - } - }, - { - "tier": 5.0, - "currency": "USDC", - "minNotional": 250000.0, - "maxNotional": 1000000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "10", - "notionalCap": "1000000", - "notionalFloor": "250000", + "notionalCap": "400000", + "notionalFloor": "50000", "maintMarginRatio": "0.05", - "cum": "8045.0" + "cum": "1300.0" } }, { - "tier": 6.0, - "currency": "USDC", - "minNotional": 1000000.0, - "maxNotional": 5000000.0, + "tier": 4.0, + "symbol": "MINA/USDT:USDT", + "currency": "USDT", + "minNotional": 400000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "5", - "notionalCap": "5000000", - "notionalFloor": "1000000", + "notionalCap": "1000000", + "notionalFloor": "400000", "maintMarginRatio": "0.1", - "cum": "58045.0" + "cum": "21300.0" } }, { - "tier": 7.0, - "currency": "USDC", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "tier": 5.0, + "symbol": "MINA/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "4", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "183045.0" - } - }, - { - "tier": 8.0, - "currency": "USDC", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, - "maintenanceMarginRate": 0.15, - "maxLeverage": 3.0, - "info": { - "bracket": "8", - "initialLeverage": "3", - "notionalCap": "20000000", - "notionalFloor": "10000000", - "maintMarginRatio": "0.15", - "cum": "433045.0" + "cum": "46300.0" } }, { - "tier": 9.0, - "currency": "USDC", - "minNotional": 20000000.0, - "maxNotional": 30000000.0, + "tier": 6.0, + "symbol": "MINA/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "6", "initialLeverage": "2", - "notionalCap": "30000000", - "notionalFloor": "20000000", + "notionalCap": "6000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.25", - "cum": "2433045.0" + "cum": "296300.0" } }, { - "tier": 10.0, - "currency": "USDC", - "minNotional": 30000000.0, - "maxNotional": 50000000.0, + "tier": 7.0, + "symbol": "MINA/USDT:USDT", + "currency": "USDT", + "minNotional": 6000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "30000000", + "notionalCap": "10000000", + "notionalFloor": "6000000", "maintMarginRatio": "0.5", - "cum": "9933045.0" + "cum": "1796300.0" } } ], - "LINK/USDT:USDT": [ + "MKR/USDT:USDT": [ { "tier": 1.0, + "symbol": "MKR/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.005, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.006, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "10000", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.005", + "maintMarginRatio": "0.006", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "MKR/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 50000.0, + "minNotional": 5000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "50000", - "notionalFloor": "10000", + "notionalCap": "25000", + "notionalFloor": "5000", "maintMarginRatio": "0.01", - "cum": "50.0" + "cum": "20.0" } }, { "tier": 3.0, + "symbol": "MKR/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, + "minNotional": 25000.0, "maxNotional": 80000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 40.0, @@ -24363,13 +34520,14 @@ "bracket": "3", "initialLeverage": "40", "notionalCap": "80000", - "notionalFloor": "50000", + "notionalFloor": "25000", "maintMarginRatio": "0.015", - "cum": "300.0" + "cum": "145.0" } }, { "tier": 4.0, + "symbol": "MKR/USDT:USDT", "currency": "USDT", "minNotional": 80000.0, "maxNotional": 400000.0, @@ -24381,11 +34539,12 @@ "notionalCap": "400000", "notionalFloor": "80000", "maintMarginRatio": "0.02", - "cum": "700.0" + "cum": "545.0" } }, { "tier": 5.0, + "symbol": "MKR/USDT:USDT", "currency": "USDT", "minNotional": 400000.0, "maxNotional": 800000.0, @@ -24397,11 +34556,12 @@ "notionalCap": "800000", "notionalFloor": "400000", "maintMarginRatio": "0.025", - "cum": "2700.0" + "cum": "2545.0" } }, { "tier": 6.0, + "symbol": "MKR/USDT:USDT", "currency": "USDT", "minNotional": 800000.0, "maxNotional": 4000000.0, @@ -24413,11 +34573,12 @@ "notionalCap": "4000000", "notionalFloor": "800000", "maintMarginRatio": "0.05", - "cum": "22700.0" + "cum": "22545.0" } }, { "tier": 7.0, + "symbol": "MKR/USDT:USDT", "currency": "USDT", "minNotional": 4000000.0, "maxNotional": 8000000.0, @@ -24429,321 +34590,375 @@ "notionalCap": "8000000", "notionalFloor": "4000000", "maintMarginRatio": "0.1", - "cum": "222700.0" + "cum": "222545.0" } }, { "tier": 8.0, + "symbol": "MKR/USDT:USDT", "currency": "USDT", "minNotional": 8000000.0, - "maxNotional": 20000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "8", "initialLeverage": "4", - "notionalCap": "20000000", + "notionalCap": "10000000", "notionalFloor": "8000000", "maintMarginRatio": "0.125", - "cum": "422700.0" + "cum": "422545.0" } }, { "tier": 9.0, + "symbol": "MKR/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 30000000.0, + "minNotional": 10000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "30000000", - "notionalFloor": "20000000", + "notionalCap": "20000000", + "notionalFloor": "10000000", "maintMarginRatio": "0.25", - "cum": "2922700.0" + "cum": "1672545.0" } }, { "tier": 10.0, + "symbol": "MKR/USDT:USDT", "currency": "USDT", - "minNotional": 30000000.0, - "maxNotional": 50000000.0, + "minNotional": 20000000.0, + "maxNotional": 40000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "30000000", + "notionalCap": "40000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.5", - "cum": "10422700.0" + "cum": "6672545.0" } } ], - "LISTA/USDT:USDT": [ + "MOCA/USDT:USDT": [ { "tier": 1.0, + "symbol": "MOCA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "MOCA/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, + "minNotional": 10000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "20000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "MOCA/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "2", + "bracket": "3", "initialLeverage": "25", - "notionalCap": "25000", - "notionalFloor": "5000", + "notionalCap": "100000", + "notionalFloor": "20000", "maintMarginRatio": "0.02", - "cum": "25.0" + "cum": "150.0" } }, { - "tier": 3.0, + "tier": 4.0, + "symbol": "MOCA/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, + "minNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "25000", + "notionalCap": "200000", + "notionalFloor": "100000", "maintMarginRatio": "0.025", - "cum": "150.0" + "cum": "650.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "MOCA/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 500000.0, + "minNotional": 200000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "500000", - "notionalFloor": "50000", + "notionalCap": "1000000", + "notionalFloor": "200000", "maintMarginRatio": "0.05", - "cum": "1400.0" + "cum": "5650.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "MOCA/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.1", - "cum": "26400.0" + "cum": "55650.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "MOCA/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 1250000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "1250000", - "notionalFloor": "1000000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "51400.0" + "cum": "105650.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "MOCA/USDT:USDT", "currency": "USDT", - "minNotional": 1250000.0, - "maxNotional": 2500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "2500000", - "notionalFloor": "1250000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.25", - "cum": "207650.0" + "cum": "418150.0" } }, { - "tier": 8.0, + "tier": 9.0, + "symbol": "MOCA/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "2500000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "832650.0" + "cum": "1668150.0" } } ], - "LIT/USDT:USDT": [ + "MOODENG/USDT:USDT": [ { "tier": 1.0, + "symbol": "MOODENG/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "MOODENG/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 20000.0, + "minNotional": 10000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "80000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "MOODENG/USDT:USDT", + "currency": "USDT", + "minNotional": 80000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "2", + "bracket": "3", "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "5000", + "notionalCap": "400000", + "notionalFloor": "80000", "maintMarginRatio": "0.02", - "cum": "25.0" + "cum": "450.0" } }, { - "tier": 3.0, + "tier": 4.0, + "symbol": "MOODENG/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 25000.0, + "minNotional": 400000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "20000", + "notionalCap": "800000", + "notionalFloor": "400000", "maintMarginRatio": "0.025", - "cum": "125.0" + "cum": "2450.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "MOODENG/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 800000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "4000000", + "notionalFloor": "800000", "maintMarginRatio": "0.05", - "cum": "750.0" + "cum": "22450.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "MOODENG/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 4000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "8000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.1", - "cum": "10750.0" + "cum": "222450.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "MOODENG/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 8000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "10000000", + "notionalFloor": "8000000", "maintMarginRatio": "0.125", - "cum": "20750.0" + "cum": "422450.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "MOODENG/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 10000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "20000000", + "notionalFloor": "10000000", "maintMarginRatio": "0.25", - "cum": "83250.0" + "cum": "1672450.0" } }, { - "tier": 8.0, + "tier": 9.0, + "symbol": "MOODENG/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 20000000.0, + "maxNotional": 40000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "40000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.5", - "cum": "333250.0" + "cum": "6672450.0" } } ], - "LOKA/USDT:USDT": [ + "MORPHO/USDT:USDT": [ { "tier": 1.0, + "symbol": "MORPHO/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -24760,6 +34975,7 @@ }, { "tier": 2.0, + "symbol": "MORPHO/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -24776,15 +34992,16 @@ }, { "tier": 3.0, + "symbol": "MORPHO/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "20000", + "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -24792,202 +35009,266 @@ }, { "tier": 4.0, + "symbol": "MORPHO/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 40000.0, + "minNotional": 30000.0, + "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "40000", - "notionalFloor": "20000", + "notionalCap": "60000", + "notionalFloor": "30000", "maintMarginRatio": "0.025", - "cum": "175.0" + "cum": "225.0" } }, { "tier": 5.0, + "symbol": "MORPHO/USDT:USDT", "currency": "USDT", - "minNotional": 40000.0, - "maxNotional": 200000.0, + "minNotional": 60000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "40000", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.05", - "cum": "1175.0" + "cum": "1725.0" } }, { "tier": 6.0, + "symbol": "MORPHO/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "11175.0" + "cum": "16725.0" } }, { "tier": 7.0, + "symbol": "MORPHO/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 600000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "750000", + "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "21175.0" + "cum": "31725.0" } }, { "tier": 8.0, + "symbol": "MORPHO/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "83675.0" + "cum": "125475.0" } }, { "tier": 9.0, + "symbol": "MORPHO/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "333675.0" + "cum": "500475.0" } } ], - "LOOM/USDT:USDT": [ + "MOVE/USDT:USDT": [ { "tier": 1.0, + "symbol": "MOVE/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.03, - "maxLeverage": 20.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.03", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "MOVE/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "MOVE/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 150000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "150000", + "notionalFloor": "30000", + "maintMarginRatio": "0.02", + "cum": "200.0" + } + }, + { + "tier": 4.0, + "symbol": "MOVE/USDT:USDT", + "currency": "USDT", + "minNotional": 150000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "300000", + "notionalFloor": "150000", + "maintMarginRatio": "0.025", + "cum": "950.0" + } + }, + { + "tier": 5.0, + "symbol": "MOVE/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "2", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "1500000", + "notionalFloor": "300000", "maintMarginRatio": "0.05", - "cum": "500.0" + "cum": "8450.0" } }, { - "tier": 3.0, + "tier": 6.0, + "symbol": "MOVE/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "3", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.1", - "cum": "10500.0" + "cum": "83450.0" } }, { - "tier": 4.0, + "tier": 7.0, + "symbol": "MOVE/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 3000000.0, + "maxNotional": 3750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "4", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "3750000", + "notionalFloor": "3000000", "maintMarginRatio": "0.125", - "cum": "23000.0" + "cum": "158450.0" } }, { - "tier": 5.0, + "tier": 8.0, + "symbol": "MOVE/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "minNotional": 3750000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "5", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalCap": "7500000", + "notionalFloor": "3750000", "maintMarginRatio": "0.25", - "cum": "148000.0" + "cum": "627200.0" } }, { - "tier": 6.0, + "tier": 9.0, + "symbol": "MOVE/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3500000.0, + "minNotional": 7500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "3500000", - "notionalFloor": "3000000", + "notionalCap": "15000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "898000.0" + "cum": "2502200.0" } } ], - "LPT/USDT:USDT": [ + "MOVR/USDT:USDT": [ { "tier": 1.0, + "symbol": "MOVR/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -25004,6 +35285,7 @@ }, { "tier": 2.0, + "symbol": "MOVR/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -25020,6 +35302,7 @@ }, { "tier": 3.0, + "symbol": "MOVR/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 100000.0, @@ -25036,15 +35319,16 @@ }, { "tier": 4.0, + "symbol": "MOVR/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, - "maxNotional": 250000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "4", "initialLeverage": "5", - "notionalCap": "250000", + "notionalCap": "200000", "notionalFloor": "100000", "maintMarginRatio": "0.1", "cum": "5675.0" @@ -25052,48 +35336,68 @@ }, { "tier": 5.0, + "symbol": "MOVR/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 1000000.0, + "minNotional": 200000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 2.0, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "250000", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "200000", "maintMarginRatio": "0.125", - "cum": "11925.0" + "cum": "10675.0" } }, { "tier": 6.0, + "symbol": "MOVR/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.25", + "cum": "73175.0" + } + }, + { + "tier": 7.0, + "symbol": "MOVR/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "3000000", + "notionalCap": "2000000", "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "386925.0" + "cum": "323175.0" } } ], - "LQTY/USDT:USDT": [ + "MTL/USDT:USDT": [ { "tier": 1.0, + "symbol": "MTL/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "20", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -25102,14 +35406,15 @@ }, { "tier": 2.0, + "symbol": "MTL/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "15", + "initialLeverage": "20", "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -25118,6 +35423,7 @@ }, { "tier": 3.0, + "symbol": "MTL/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 600000.0, @@ -25134,6 +35440,7 @@ }, { "tier": 4.0, + "symbol": "MTL/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, "maxNotional": 1600000.0, @@ -25150,6 +35457,7 @@ }, { "tier": 5.0, + "symbol": "MTL/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, "maxNotional": 2000000.0, @@ -25166,6 +35474,7 @@ }, { "tier": 6.0, + "symbol": "MTL/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 6000000.0, @@ -25182,6 +35491,7 @@ }, { "tier": 7.0, + "symbol": "MTL/USDT:USDT", "currency": "USDT", "minNotional": 6000000.0, "maxNotional": 10000000.0, @@ -25197,116 +35507,174 @@ } } ], - "LRC/USDT:USDT": [ + "MYRO/USDT:USDT": [ { "tier": 1.0, + "symbol": "MYRO/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "MYRO/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "10", - "notionalCap": "25000", + "initialLeverage": "50", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "maintMarginRatio": "0.015", + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "MYRO/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "8", - "notionalCap": "100000", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "675.0" + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" } }, { "tier": 4.0, + "symbol": "MYRO/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "325.0" + } + }, + { + "tier": 5.0, + "symbol": "MYRO/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, - "maxNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "500000", + "notionalFloor": "100000", + "maintMarginRatio": "0.05", + "cum": "2825.0" + } + }, + { + "tier": 6.0, + "symbol": "MYRO/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "250000", - "notionalFloor": "100000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "5675.0" + "cum": "27825.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "MYRO/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 1000000.0, + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "1250000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.125", + "cum": "52825.0" + } + }, + { + "tier": 8.0, + "symbol": "MYRO/USDT:USDT", + "currency": "USDT", + "minNotional": 1250000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "5", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "11925.0" + "notionalCap": "2500000", + "notionalFloor": "1250000", + "maintMarginRatio": "0.25", + "cum": "209075.0" } }, { - "tier": 6.0, + "tier": 9.0, + "symbol": "MYRO/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, + "minNotional": 2500000.0, "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "9", "initialLeverage": "1", "notionalCap": "5000000", - "notionalFloor": "1000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "386925.0" + "cum": "834075.0" } } ], - "LSK/USDT:USDT": [ + "NEAR/USDC:USDC": [ { "tier": 1.0, - "currency": "USDT", + "symbol": "NEAR/USDC:USDC", + "currency": "USDC", "minNotional": 0.0, - "maxNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "1", "initialLeverage": "50", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.015", "cum": "0.0" @@ -25314,1144 +35682,1387 @@ }, { "tier": 2.0, - "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, + "symbol": "NEAR/USDC:USDC", + "currency": "USDC", + "minNotional": 10000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "2", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "5000", + "notionalCap": "250000", + "notionalFloor": "10000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "100.0" } }, { "tier": 3.0, - "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 100000.0, + "symbol": "NEAR/USDC:USDC", + "currency": "USDC", + "minNotional": 250000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.03, + "maxLeverage": 15.0, + "info": { + "bracket": "3", + "initialLeverage": "15", + "notionalCap": "750000", + "notionalFloor": "250000", + "maintMarginRatio": "0.03", + "cum": "1350.0" + } + }, + { + "tier": 4.0, + "symbol": "NEAR/USDC:USDC", + "currency": "USDC", + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "10", - "notionalCap": "100000", - "notionalFloor": "25000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.05", - "cum": "675.0" + "cum": "16350.0" } }, { - "tier": 4.0, - "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 200000.0, + "tier": 5.0, + "symbol": "NEAR/USDC:USDC", + "currency": "USDC", + "minNotional": 1500000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "5", - "notionalCap": "200000", - "notionalFloor": "100000", + "notionalCap": "4000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.1", - "cum": "5675.0" + "cum": "91350.0" } }, { - "tier": 5.0, - "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "tier": 6.0, + "symbol": "NEAR/USDC:USDC", + "currency": "USDC", + "minNotional": 4000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "5000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.125", - "cum": "10675.0" + "cum": "191350.0" } }, { - "tier": 6.0, - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "tier": 7.0, + "symbol": "NEAR/USDC:USDC", + "currency": "USDC", + "minNotional": 5000000.0, + "maxNotional": 12000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "12000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.25", - "cum": "73175.0" + "cum": "816350.0" } }, { - "tier": 7.0, - "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "tier": 8.0, + "symbol": "NEAR/USDC:USDC", + "currency": "USDC", + "minNotional": 12000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "20000000", + "notionalFloor": "12000000", "maintMarginRatio": "0.5", - "cum": "323175.0" + "cum": "3816350.0" } } ], - "LTC/USDC:USDC": [ + "NEAR/USDT:USDT": [ { "tier": 1.0, - "currency": "USDC", + "symbol": "NEAR/USDT:USDT", + "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.005, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "5000", + "notionalCap": "20000", "notionalFloor": "0", - "maintMarginRatio": "0.005", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, - "currency": "USDC", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.006, + "symbol": "NEAR/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.006", - "cum": "5.0" + "notionalCap": "200000", + "notionalFloor": "20000", + "maintMarginRatio": "0.015", + "cum": "100.0" } }, { "tier": 3.0, - "currency": "USDC", - "minNotional": 10000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 40.0, + "symbol": "NEAR/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "40", - "notionalCap": "50000", - "notionalFloor": "10000", - "maintMarginRatio": "0.01", - "cum": "45.0" + "initialLeverage": "25", + "notionalCap": "1000000", + "notionalFloor": "200000", + "maintMarginRatio": "0.02", + "cum": "1100.0" } }, { "tier": 4.0, - "currency": "USDC", - "minNotional": 50000.0, - "maxNotional": 750000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "symbol": "NEAR/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "4", - "initialLeverage": "25", - "notionalCap": "750000", - "notionalFloor": "50000", - "maintMarginRatio": "0.02", - "cum": "545.0" + "initialLeverage": "20", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.025", + "cum": "6100.0" } }, { "tier": 5.0, - "currency": "USDC", - "minNotional": 750000.0, - "maxNotional": 3000000.0, + "symbol": "NEAR/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "3000000", - "notionalFloor": "750000", + "notionalCap": "10000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.05", - "cum": "23045.0" + "cum": "56100.0" } }, { "tier": 6.0, - "currency": "USDC", - "minNotional": 3000000.0, - "maxNotional": 10000000.0, + "symbol": "NEAR/USDT:USDT", + "currency": "USDT", + "minNotional": 10000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "10000000", - "notionalFloor": "3000000", + "notionalCap": "20000000", + "notionalFloor": "10000000", "maintMarginRatio": "0.1", - "cum": "173045.0" + "cum": "556100.0" } }, { "tier": 7.0, - "currency": "USDC", - "minNotional": 10000000.0, - "maxNotional": 12000000.0, + "symbol": "NEAR/USDT:USDT", + "currency": "USDT", + "minNotional": 20000000.0, + "maxNotional": 25000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "12000000", - "notionalFloor": "10000000", + "notionalCap": "25000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.125", - "cum": "423045.0" + "cum": "1056100.0" } }, { "tier": 8.0, - "currency": "USDC", - "minNotional": 12000000.0, - "maxNotional": 20000000.0, - "maintenanceMarginRate": 0.15, - "maxLeverage": 3.0, - "info": { - "bracket": "8", - "initialLeverage": "3", - "notionalCap": "20000000", - "notionalFloor": "12000000", - "maintMarginRatio": "0.15", - "cum": "723045.0" - } - }, - { - "tier": 9.0, - "currency": "USDC", - "minNotional": 20000000.0, - "maxNotional": 30000000.0, + "symbol": "NEAR/USDT:USDT", + "currency": "USDT", + "minNotional": 25000000.0, + "maxNotional": 50000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "30000000", - "notionalFloor": "20000000", + "notionalCap": "50000000", + "notionalFloor": "25000000", "maintMarginRatio": "0.25", - "cum": "2723045.0" + "cum": "4181100.0" } }, { - "tier": 10.0, - "currency": "USDC", - "minNotional": 30000000.0, - "maxNotional": 50000000.0, + "tier": 9.0, + "symbol": "NEAR/USDT:USDT", + "currency": "USDT", + "minNotional": 50000000.0, + "maxNotional": 100000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "30000000", + "notionalCap": "100000000", + "notionalFloor": "50000000", "maintMarginRatio": "0.5", - "cum": "10223045.0" + "cum": "16681100.0" } } ], - "LTC/USDT:USDT": [ + "NEIRO/USDT:USDT": [ { "tier": 1.0, + "symbol": "NEIRO/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.005, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "10000", + "notionalCap": "20000", "notionalFloor": "0", - "maintMarginRatio": "0.005", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "NEIRO/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.01, + "minNotional": 20000.0, + "maxNotional": 160000.0, + "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "50000", - "notionalFloor": "10000", - "maintMarginRatio": "0.01", - "cum": "50.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 40.0, - "info": { - "bracket": "3", - "initialLeverage": "40", - "notionalCap": "100000", - "notionalFloor": "50000", + "notionalCap": "160000", + "notionalFloor": "20000", "maintMarginRatio": "0.015", - "cum": "300.0" + "cum": "100.0" } }, { - "tier": 4.0, + "tier": 3.0, + "symbol": "NEIRO/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 750000.0, + "minNotional": 160000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "25", - "notionalCap": "750000", - "notionalFloor": "100000", + "notionalCap": "800000", + "notionalFloor": "160000", "maintMarginRatio": "0.02", - "cum": "800.0" + "cum": "900.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "NEIRO/USDT:USDT", "currency": "USDT", - "minNotional": 750000.0, - "maxNotional": 1000000.0, + "minNotional": 800000.0, + "maxNotional": 1600000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "1000000", - "notionalFloor": "750000", + "notionalCap": "1600000", + "notionalFloor": "800000", "maintMarginRatio": "0.025", - "cum": "4550.0" + "cum": "4900.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "NEIRO/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 5000000.0, + "minNotional": 1600000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "5000000", - "notionalFloor": "1000000", + "notionalCap": "8000000", + "notionalFloor": "1600000", "maintMarginRatio": "0.05", - "cum": "29550.0" + "cum": "44900.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "NEIRO/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 8000000.0, + "maxNotional": 16000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "16000000", + "notionalFloor": "8000000", "maintMarginRatio": "0.1", - "cum": "279550.0" + "cum": "444900.0" } }, { - "tier": 8.0, + "tier": 7.0, + "symbol": "NEIRO/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, + "minNotional": 16000000.0, "maxNotional": 20000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "4", "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalFloor": "16000000", "maintMarginRatio": "0.125", - "cum": "529550.0" + "cum": "844900.0" } }, { - "tier": 9.0, + "tier": 8.0, + "symbol": "NEIRO/USDT:USDT", "currency": "USDT", "minNotional": 20000000.0, - "maxNotional": 30000000.0, + "maxNotional": 40000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "30000000", + "notionalCap": "40000000", "notionalFloor": "20000000", "maintMarginRatio": "0.25", - "cum": "3029550.0" + "cum": "3344900.0" } }, { - "tier": 10.0, + "tier": 9.0, + "symbol": "NEIRO/USDT:USDT", "currency": "USDT", - "minNotional": 30000000.0, - "maxNotional": 50000000.0, + "minNotional": 40000000.0, + "maxNotional": 80000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "30000000", + "notionalCap": "80000000", + "notionalFloor": "40000000", "maintMarginRatio": "0.5", - "cum": "10529550.0" + "cum": "13344900.0" } } ], - "LUNA2/USDT:USDT": [ + "NEIROETH/USDT:USDT": [ { "tier": 1.0, + "symbol": "NEIROETH/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "20", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "NEIROETH/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "10", - "notionalCap": "25000", + "initialLeverage": "50", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "maintMarginRatio": "0.015", + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "NEIROETH/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "minNotional": 10000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "8", - "notionalCap": "100000", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "675.0" + "initialLeverage": "25", + "notionalCap": "20000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" } }, { "tier": 4.0, + "symbol": "NEIROETH/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 250000.0, + "minNotional": 20000.0, + "maxNotional": 40000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "40000", + "notionalFloor": "20000", + "maintMarginRatio": "0.025", + "cum": "175.0" + } + }, + { + "tier": 5.0, + "symbol": "NEIROETH/USDT:USDT", + "currency": "USDT", + "minNotional": 40000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "200000", + "notionalFloor": "40000", + "maintMarginRatio": "0.05", + "cum": "1175.0" + } + }, + { + "tier": 6.0, + "symbol": "NEIROETH/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "250000", - "notionalFloor": "100000", + "notionalCap": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "5675.0" + "cum": "11175.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "NEIROETH/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 1000000.0, + "minNotional": 400000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "400000", + "maintMarginRatio": "0.125", + "cum": "21175.0" + } + }, + { + "tier": 8.0, + "symbol": "NEIROETH/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "5", + "bracket": "8", "initialLeverage": "2", "notionalCap": "1000000", - "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "11925.0" + "notionalFloor": "500000", + "maintMarginRatio": "0.25", + "cum": "83675.0" } }, { - "tier": 6.0, + "tier": 9.0, + "symbol": "NEIROETH/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 5000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "5000000", + "notionalCap": "2000000", "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "386925.0" + "cum": "333675.0" } } ], - "MAGIC/USDT:USDT": [ + "NEO/USDC:USDC": [ { "tier": 1.0, - "currency": "USDT", + "symbol": "NEO/USDC:USDC", + "currency": "USDC", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.006, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "20", + "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.006", "cum": "0.0" } }, { "tier": 2.0, - "currency": "USDT", + "symbol": "NEO/USDC:USDC", + "currency": "USDC", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 25.0, "info": { "bracket": "2", - "initialLeverage": "15", - "notionalCap": "25000", + "initialLeverage": "25", + "notionalCap": "50000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" + "maintMarginRatio": "0.01", + "cum": "20.0" } }, { "tier": 3.0, - "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 100000.0, + "symbol": "NEO/USDC:USDC", + "currency": "USDC", + "minNotional": 50000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "400000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "770.0" + } + }, + { + "tier": 4.0, + "symbol": "NEO/USDC:USDC", + "currency": "USDC", + "minNotional": 400000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "10", - "notionalCap": "100000", - "notionalFloor": "25000", + "notionalCap": "800000", + "notionalFloor": "400000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "10770.0" } }, { - "tier": 4.0, - "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 250000.0, + "tier": 5.0, + "symbol": "NEO/USDC:USDC", + "currency": "USDC", + "minNotional": 800000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "5", - "notionalCap": "250000", - "notionalFloor": "100000", + "notionalCap": "2000000", + "notionalFloor": "800000", "maintMarginRatio": "0.1", - "cum": "5650.0" + "cum": "50770.0" } }, { - "tier": 5.0, - "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 1000000.0, + "tier": 6.0, + "symbol": "NEO/USDC:USDC", + "currency": "USDC", + "minNotional": 2000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "100770.0" + } + }, + { + "tier": 7.0, + "symbol": "NEO/USDC:USDC", + "currency": "USDC", + "minNotional": 5000000.0, + "maxNotional": 12000000.0, + "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "11900.0" + "notionalCap": "12000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.25", + "cum": "725770.0" } }, { - "tier": 6.0, - "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 5000000.0, + "tier": 8.0, + "symbol": "NEO/USDC:USDC", + "currency": "USDC", + "minNotional": 12000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "1000000", + "notionalCap": "20000000", + "notionalFloor": "12000000", "maintMarginRatio": "0.5", - "cum": "386900.0" + "cum": "3725770.0" } } ], - "MANA/USDT:USDT": [ + "NEO/USDT:USDT": [ { "tier": 1.0, + "symbol": "NEO/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.0065, + "maintenanceMarginRate": 0.006, "maxLeverage": 50.0, "info": { "bracket": "1", "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.0065", + "maintMarginRatio": "0.006", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "NEO/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.0075, - "maxLeverage": 40.0, - "info": { - "bracket": "2", - "initialLeverage": "40", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.0075", - "cum": "5.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 25.0, "info": { - "bracket": "3", + "bracket": "2", "initialLeverage": "25", "notionalCap": "50000", - "notionalFloor": "25000", + "notionalFloor": "5000", "maintMarginRatio": "0.01", - "cum": "67.5" + "cum": "20.0" } }, { - "tier": 4.0, + "tier": 3.0, + "symbol": "NEO/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 150000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "20", - "notionalCap": "150000", + "notionalCap": "400000", "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "817.5" + "cum": "770.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "NEO/USDT:USDT", "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 250000.0, + "minNotional": 400000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "10", - "notionalCap": "250000", - "notionalFloor": "150000", + "notionalCap": "800000", + "notionalFloor": "400000", "maintMarginRatio": "0.05", - "cum": "4567.5" + "cum": "10770.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "NEO/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, + "minNotional": 800000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "250000", + "notionalCap": "2000000", + "notionalFloor": "800000", "maintMarginRatio": "0.1", - "cum": "17067.5" + "cum": "50770.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "NEO/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 2000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "5000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "29567.5" + "cum": "100770.0" } }, { - "tier": 8.0, + "tier": 7.0, + "symbol": "NEO/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 5000000.0, + "minNotional": 5000000.0, + "maxNotional": 12000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", - "notionalCap": "5000000", - "notionalFloor": "1000000", + "notionalCap": "12000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.25", - "cum": "154567.5" + "cum": "725770.0" } }, { - "tier": 9.0, + "tier": 8.0, + "symbol": "NEO/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 12000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "20000000", + "notionalFloor": "12000000", "maintMarginRatio": "0.5", - "cum": "1404567.5" + "cum": "3725770.0" } } ], - "MANTA/USDT:USDT": [ + "NFP/USDT:USDT": [ { "tier": 1.0, + "symbol": "NFP/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.01, + "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "1", "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "NFP/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 50000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "2", "initialLeverage": "25", - "notionalCap": "50000", + "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.02", - "cum": "50.0" + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "NFP/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "3", "initialLeverage": "20", - "notionalCap": "100000", - "notionalFloor": "50000", + "notionalCap": "50000", + "notionalFloor": "25000", "maintMarginRatio": "0.025", - "cum": "300.0" + "cum": "150.0" } }, { "tier": 4.0, + "symbol": "NFP/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 1000000.0, + "minNotional": 50000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "4", "initialLeverage": "10", - "notionalCap": "1000000", - "notionalFloor": "100000", + "notionalCap": "500000", + "notionalFloor": "50000", "maintMarginRatio": "0.05", - "cum": "2800.0" + "cum": "1400.0" } }, { "tier": 5.0, + "symbol": "NFP/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "5", "initialLeverage": "5", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "52800.0" + "cum": "26400.0" } }, { "tier": 6.0, + "symbol": "NFP/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 2500000.0, + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "6", "initialLeverage": "4", - "notionalCap": "2500000", - "notionalFloor": "2000000", + "notionalCap": "1250000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "102800.0" + "cum": "51400.0" } }, { "tier": 7.0, + "symbol": "NFP/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "minNotional": 1250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "5000000", - "notionalFloor": "2500000", + "notionalCap": "2500000", + "notionalFloor": "1250000", "maintMarginRatio": "0.25", - "cum": "415300.0" + "cum": "207650.0" } }, { "tier": 8.0, + "symbol": "NFP/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1665300.0" + "cum": "832650.0" } } ], - "MASK/USDT:USDT": [ + "NKN/USDT:USDT": [ { "tier": 1.0, + "symbol": "NKN/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.02", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "NKN/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "50000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "50.0" + "maintMarginRatio": "0.025", + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "NKN/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 900000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 50000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 8.0, "info": { "bracket": "3", + "initialLeverage": "8", + "notionalCap": "200000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1275.0" + } + }, + { + "tier": 4.0, + "symbol": "NKN/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "200000", + "maintMarginRatio": "0.1", + "cum": "11275.0" + } + }, + { + "tier": 5.0, + "symbol": "NKN/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 2.0, + "info": { + "bracket": "5", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "23775.0" + } + }, + { + "tier": 6.0, + "symbol": "NKN/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "398775.0" + } + } + ], + "NMR/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "NMR/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 20.0, + "info": { + "bracket": "1", "initialLeverage": "20", - "notionalCap": "900000", - "notionalFloor": "25000", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.02", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "NMR/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 15.0, + "info": { + "bracket": "2", + "initialLeverage": "15", + "notionalCap": "25000", + "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "175.0" + "cum": "25.0" } }, { - "tier": 4.0, + "tier": 3.0, + "symbol": "NMR/USDT:USDT", "currency": "USDT", - "minNotional": 900000.0, - "maxNotional": 1800000.0, + "minNotional": 25000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "10", - "notionalCap": "1800000", - "notionalFloor": "900000", + "notionalCap": "200000", + "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "22675.0" + "cum": "650.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "NMR/USDT:USDT", "currency": "USDT", - "minNotional": 1800000.0, - "maxNotional": 4800000.0, + "minNotional": 200000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "5", - "notionalCap": "4800000", - "notionalFloor": "1800000", + "notionalCap": "500000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "112675.0" + "cum": "10650.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "NMR/USDT:USDT", "currency": "USDT", - "minNotional": 4800000.0, - "maxNotional": 6000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", - "notionalCap": "6000000", - "notionalFloor": "4800000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "232675.0" + "cum": "23150.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "NMR/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 18000000.0, + "minNotional": 1000000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "2", - "notionalCap": "18000000", - "notionalFloor": "6000000", + "notionalCap": "3000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.25", - "cum": "982675.0" + "cum": "148150.0" } }, { - "tier": 8.0, + "tier": 7.0, + "symbol": "NMR/USDT:USDT", "currency": "USDT", - "minNotional": 18000000.0, - "maxNotional": 30000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "18000000", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "5482675.0" + "cum": "898150.0" + } + } + ], + "NOT/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "NOT/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "NOT/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "60000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" } - } - ], - "MAV/USDT:USDT": [ + }, { - "tier": 1.0, + "tier": 3.0, + "symbol": "NOT/USDT:USDT", "currency": "USDT", - "minNotional": 0.0, - "maxNotional": 5000.0, + "minNotional": 60000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maxLeverage": 25.0, "info": { - "bracket": "1", - "initialLeverage": "20", - "notionalCap": "5000", - "notionalFloor": "0", + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.02", - "cum": "0.0" + "cum": "350.0" } }, { - "tier": 2.0, + "tier": 4.0, + "symbol": "NOT/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "maxLeverage": 20.0, "info": { - "bracket": "2", - "initialLeverage": "15", - "notionalCap": "25000", - "notionalFloor": "5000", + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.025", - "cum": "25.0" + "cum": "1850.0" } }, { - "tier": 3.0, + "tier": 5.0, + "symbol": "NOT/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 600000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "3000000", + "notionalFloor": "600000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "16850.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "NOT/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 3000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "6000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.1", - "cum": "10650.0" + "cum": "166850.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "NOT/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 6000000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "7500000", + "notionalFloor": "6000000", "maintMarginRatio": "0.125", - "cum": "23150.0" + "cum": "316850.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "NOT/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "minNotional": 7500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalCap": "15000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.25", - "cum": "148150.0" + "cum": "1254350.0" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "NOT/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 5000000.0, + "minNotional": 15000000.0, + "maxNotional": 30000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "3000000", + "notionalCap": "30000000", + "notionalFloor": "15000000", "maintMarginRatio": "0.5", - "cum": "898150.0" + "cum": "5004350.0" } } ], - "MAVIA/USDT:USDT": [ + "NTRN/USDT:USDT": [ { "tier": 1.0, + "symbol": "NTRN/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -26468,6 +37079,7 @@ }, { "tier": 2.0, + "symbol": "NTRN/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -26484,6 +37096,7 @@ }, { "tier": 3.0, + "symbol": "NTRN/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 100000.0, @@ -26500,6 +37113,7 @@ }, { "tier": 4.0, + "symbol": "NTRN/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 200000.0, @@ -26516,6 +37130,7 @@ }, { "tier": 5.0, + "symbol": "NTRN/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, @@ -26532,6 +37147,7 @@ }, { "tier": 6.0, + "symbol": "NTRN/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -26548,6 +37164,7 @@ }, { "tier": 7.0, + "symbol": "NTRN/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -26563,9 +37180,10 @@ } } ], - "MBOX/USDT:USDT": [ + "NULS/USDT:USDT": [ { "tier": 1.0, + "symbol": "NULS/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -26582,6 +37200,7 @@ }, { "tier": 2.0, + "symbol": "NULS/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -26598,6 +37217,7 @@ }, { "tier": 3.0, + "symbol": "NULS/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 20000.0, @@ -26614,6 +37234,7 @@ }, { "tier": 4.0, + "symbol": "NULS/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 40000.0, @@ -26630,6 +37251,7 @@ }, { "tier": 5.0, + "symbol": "NULS/USDT:USDT", "currency": "USDT", "minNotional": 40000.0, "maxNotional": 200000.0, @@ -26646,6 +37268,7 @@ }, { "tier": 6.0, + "symbol": "NULS/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 400000.0, @@ -26662,6 +37285,7 @@ }, { "tier": 7.0, + "symbol": "NULS/USDT:USDT", "currency": "USDT", "minNotional": 400000.0, "maxNotional": 500000.0, @@ -26678,6 +37302,7 @@ }, { "tier": 8.0, + "symbol": "NULS/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -26694,6 +37319,7 @@ }, { "tier": 9.0, + "symbol": "NULS/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -26709,17 +37335,18 @@ } } ], - "MDT/USDT:USDT": [ + "OCEAN/USDT:USDT": [ { "tier": 1.0, + "symbol": "OCEAN/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "20", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.02", @@ -26728,14 +37355,15 @@ }, { "tier": 2.0, + "symbol": "OCEAN/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "15", + "initialLeverage": "20", "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -26744,6 +37372,7 @@ }, { "tier": 3.0, + "symbol": "OCEAN/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 200000.0, @@ -26760,6 +37389,7 @@ }, { "tier": 4.0, + "symbol": "OCEAN/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, @@ -26776,14 +37406,15 @@ }, { "tier": 5.0, + "symbol": "OCEAN/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", + "initialLeverage": "2", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.125", @@ -26792,40 +37423,26 @@ }, { "tier": 6.0, + "symbol": "OCEAN/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 3000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "6", - "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "1000000", - "maintMarginRatio": "0.25", - "cum": "148150.0" - } - }, - { - "tier": 7.0, - "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3500000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "3500000", - "notionalFloor": "3000000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "898150.0" + "cum": "398150.0" } } ], - "MEME/USDT:USDT": [ + "OGN/USDT:USDT": [ { "tier": 1.0, + "symbol": "OGN/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -26842,15 +37459,16 @@ }, { "tier": 2.0, + "symbol": "OGN/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "2", "initialLeverage": "25", - "notionalCap": "25000", + "notionalCap": "20000", "notionalFloor": "5000", "maintMarginRatio": "0.02", "cum": "25.0" @@ -26858,218 +37476,111 @@ }, { "tier": 3.0, + "symbol": "OGN/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 80000.0, + "minNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "3", "initialLeverage": "20", - "notionalCap": "80000", - "notionalFloor": "25000", + "notionalCap": "25000", + "notionalFloor": "20000", "maintMarginRatio": "0.025", - "cum": "150.0" + "cum": "125.0" } }, { "tier": 4.0, + "symbol": "OGN/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 800000.0, + "minNotional": 25000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "4", "initialLeverage": "10", - "notionalCap": "800000", - "notionalFloor": "80000", + "notionalCap": "200000", + "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "2150.0" + "cum": "750.0" } }, { "tier": 5.0, + "symbol": "OGN/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 1600000.0, + "minNotional": 200000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "5", "initialLeverage": "5", - "notionalCap": "1600000", - "notionalFloor": "800000", + "notionalCap": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "42150.0" + "cum": "10750.0" } }, { "tier": 6.0, + "symbol": "OGN/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 2000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "6", - "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1600000", - "maintMarginRatio": "0.125", - "cum": "82150.0" - } - }, - { - "tier": 7.0, - "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "4000000", - "notionalFloor": "2000000", - "maintMarginRatio": "0.25", - "cum": "332150.0" - } - }, - { - "tier": 8.0, - "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, - "maintenanceMarginRate": 0.5, - "maxLeverage": 1.0, - "info": { - "bracket": "8", - "initialLeverage": "1", - "notionalCap": "8000000", - "notionalFloor": "4000000", - "maintMarginRatio": "0.5", - "cum": "1332150.0" - } - } - ], - "METIS/USDT:USDT": [ - { - "tier": 1.0, - "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, - "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, - "info": { - "bracket": "2", - "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, - "info": { - "bracket": "3", - "initialLeverage": "10", - "notionalCap": "100000", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "675.0" - } - }, - { - "tier": 4.0, - "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 200000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "4", - "initialLeverage": "5", - "notionalCap": "200000", - "notionalFloor": "100000", - "maintMarginRatio": "0.1", - "cum": "5675.0" - } - }, - { - "tier": 5.0, - "currency": "USDT", - "minNotional": 200000.0, + "minNotional": 400000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "4", "notionalCap": "500000", - "notionalFloor": "200000", + "notionalFloor": "400000", "maintMarginRatio": "0.125", - "cum": "10675.0" + "cum": "20750.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "OGN/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "2", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "73175.0" + "cum": "83250.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "OGN/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "1", "notionalCap": "2000000", "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "323175.0" + "cum": "333250.0" } } ], - "MEW/USDT:USDT": [ + "OM/USDT:USDT": [ { "tier": 1.0, + "symbol": "OM/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -27086,15 +37597,16 @@ }, { "tier": 2.0, + "symbol": "OM/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 30000.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "30000", + "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", "cum": "50.0" @@ -27102,396 +37614,249 @@ }, { "tier": 3.0, + "symbol": "OM/USDT:USDT", "currency": "USDT", - "minNotional": 30000.0, - "maxNotional": 150000.0, + "minNotional": 20000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "150000", - "notionalFloor": "30000", + "notionalCap": "100000", + "notionalFloor": "20000", "maintMarginRatio": "0.02", - "cum": "200.0" + "cum": "150.0" } }, { "tier": 4.0, + "symbol": "OM/USDT:USDT", "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 300000.0, + "minNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "300000", - "notionalFloor": "150000", + "notionalCap": "200000", + "notionalFloor": "100000", "maintMarginRatio": "0.025", - "cum": "950.0" + "cum": "650.0" } }, { "tier": 5.0, + "symbol": "OM/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 1500000.0, + "minNotional": 200000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "1500000", - "notionalFloor": "300000", + "notionalCap": "1000000", + "notionalFloor": "200000", "maintMarginRatio": "0.05", - "cum": "8450.0" + "cum": "5650.0" } }, { "tier": 6.0, + "symbol": "OM/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.1", - "cum": "83450.0" + "cum": "55650.0" } }, { "tier": 7.0, + "symbol": "OM/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3750000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "3750000", - "notionalFloor": "3000000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "158450.0" + "cum": "105650.0" } }, { "tier": 8.0, + "symbol": "OM/USDT:USDT", "currency": "USDT", - "minNotional": 3750000.0, - "maxNotional": 7500000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "3750000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.25", - "cum": "627200.0" + "cum": "418150.0" } }, { "tier": 9.0, + "symbol": "OM/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, - "maintenanceMarginRate": 0.5, - "maxLeverage": 1.0, - "info": { - "bracket": "9", - "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "7500000", - "maintMarginRatio": "0.5", - "cum": "2502200.0" - } - } - ], - "MINA/USDT:USDT": [ - { - "tier": 1.0, - "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, - "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, - "info": { - "bracket": "2", - "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 400000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, - "info": { - "bracket": "3", - "initialLeverage": "10", - "notionalCap": "400000", - "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1300.0" - } - }, - { - "tier": 4.0, - "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "4", - "initialLeverage": "5", - "notionalCap": "1000000", - "notionalFloor": "400000", - "maintMarginRatio": "0.1", - "cum": "21300.0" - } - }, - { - "tier": 5.0, - "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "5", - "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1000000", - "maintMarginRatio": "0.125", - "cum": "46300.0" - } - }, - { - "tier": 6.0, - "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 6000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "6", - "initialLeverage": "2", - "notionalCap": "6000000", - "notionalFloor": "2000000", - "maintMarginRatio": "0.25", - "cum": "296300.0" - } - }, - { - "tier": 7.0, - "currency": "USDT", - "minNotional": 6000000.0, + "minNotional": 5000000.0, "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1796300.0" + "cum": "1668150.0" } } ], - "MKR/USDT:USDT": [ + "OMG/USDT:USDT": [ { "tier": 1.0, + "symbol": "OMG/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.006, - "maxLeverage": 75.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.006", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "OMG/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 50.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "50", - "notionalCap": "25000", + "initialLeverage": "8", + "notionalCap": "50000", "notionalFloor": "5000", - "maintMarginRatio": "0.01", - "cum": "20.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "OMG/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 40000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 40.0, + "minNotional": 50000.0, + "maxNotional": 900000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "40", - "notionalCap": "40000", - "notionalFloor": "25000", - "maintMarginRatio": "0.015", - "cum": "145.0" + "initialLeverage": "6", + "notionalCap": "900000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1300.0" } }, { "tier": 4.0, + "symbol": "OMG/USDT:USDT", "currency": "USDT", - "minNotional": 40000.0, - "maxNotional": 200000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, - "info": { - "bracket": "4", - "initialLeverage": "25", - "notionalCap": "200000", - "notionalFloor": "40000", - "maintMarginRatio": "0.02", - "cum": "345.0" - } - }, - { - "tier": 5.0, - "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 450000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, - "info": { - "bracket": "5", - "initialLeverage": "20", - "notionalCap": "450000", - "notionalFloor": "200000", - "maintMarginRatio": "0.025", - "cum": "1345.0" - } - }, - { - "tier": 6.0, - "currency": "USDT", - "minNotional": 450000.0, + "minNotional": 900000.0, "maxNotional": 2000000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, - "info": { - "bracket": "6", - "initialLeverage": "10", - "notionalCap": "2000000", - "notionalFloor": "450000", - "maintMarginRatio": "0.05", - "cum": "12595.0" - } - }, - { - "tier": 7.0, - "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "7", + "bracket": "4", "initialLeverage": "5", - "notionalCap": "4000000", - "notionalFloor": "2000000", + "notionalCap": "2000000", + "notionalFloor": "900000", "maintMarginRatio": "0.1", - "cum": "112595.0" + "cum": "46300.0" } }, { - "tier": 8.0, + "tier": 5.0, + "symbol": "OMG/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 5000000.0, + "minNotional": 2000000.0, + "maxNotional": 2100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "8", + "bracket": "5", "initialLeverage": "4", - "notionalCap": "5000000", - "notionalFloor": "4000000", + "notionalCap": "2100000", + "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "212595.0" + "cum": "96300.0" } }, { - "tier": 9.0, + "tier": 6.0, + "symbol": "OMG/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 2100000.0, + "maxNotional": 2200000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "6", "initialLeverage": "2", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "2200000", + "notionalFloor": "2100000", "maintMarginRatio": "0.25", - "cum": "837595.0" + "cum": "358800.0" } }, { - "tier": 10.0, + "tier": 7.0, + "symbol": "OMG/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "minNotional": 2200000.0, + "maxNotional": 2300000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "2300000", + "notionalFloor": "2200000", "maintMarginRatio": "0.5", - "cum": "3337595.0" + "cum": "908800.0" } } ], - "MOVR/USDT:USDT": [ + "OMNI/USDT:USDT": [ { "tier": 1.0, + "symbol": "OMNI/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -27508,218 +37873,283 @@ }, { "tier": 2.0, + "symbol": "OMNI/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "20000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "OMNI/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 30000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "2", + "bracket": "3", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "5000", + "notionalCap": "30000", + "notionalFloor": "20000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "125.0" } }, { - "tier": 3.0, + "tier": 4.0, + "symbol": "OMNI/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 100000.0, + "minNotional": 30000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "10", - "notionalCap": "100000", - "notionalFloor": "25000", + "notionalCap": "300000", + "notionalFloor": "30000", "maintMarginRatio": "0.05", - "cum": "675.0" + "cum": "875.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "OMNI/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 200000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "5", - "notionalCap": "200000", - "notionalFloor": "100000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "5675.0" + "cum": "15875.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "OMNI/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 600000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "750000", + "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "10675.0" + "cum": "30875.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "OMNI/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "73175.0" + "cum": "124625.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "OMNI/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "323175.0" + "cum": "499625.0" } } ], - "MTL/USDT:USDT": [ + "ONDO/USDT:USDT": [ { "tier": 1.0, + "symbol": "ONDO/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "25", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "ONDO/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, + "minNotional": 10000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "80000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "ONDO/USDT:USDT", + "currency": "USDT", + "minNotional": 80000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "400000", + "notionalFloor": "80000", + "maintMarginRatio": "0.02", + "cum": "450.0" + } + }, + { + "tier": 4.0, + "symbol": "ONDO/USDT:USDT", + "currency": "USDT", + "minNotional": 400000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "2", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "5000", + "notionalCap": "800000", + "notionalFloor": "400000", "maintMarginRatio": "0.025", - "cum": "25.0" + "cum": "2450.0" } }, { - "tier": 3.0, + "tier": 5.0, + "symbol": "ONDO/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 600000.0, + "minNotional": 800000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "600000", - "notionalFloor": "25000", + "notionalCap": "4000000", + "notionalFloor": "800000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "22450.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "ONDO/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 1600000.0, + "minNotional": 4000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "1600000", - "notionalFloor": "600000", + "notionalCap": "8000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.1", - "cum": "30650.0" + "cum": "222450.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "ONDO/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 2000000.0, + "minNotional": 8000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1600000", + "notionalCap": "10000000", + "notionalFloor": "8000000", "maintMarginRatio": "0.125", - "cum": "70650.0" + "cum": "422450.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "ONDO/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 6000000.0, + "minNotional": 10000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "6000000", - "notionalFloor": "2000000", + "notionalCap": "20000000", + "notionalFloor": "10000000", "maintMarginRatio": "0.25", - "cum": "320650.0" + "cum": "1672450.0" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "ONDO/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 10000000.0, + "minNotional": 20000000.0, + "maxNotional": 40000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalCap": "40000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.5", - "cum": "1820650.0" + "cum": "6672450.0" } } ], - "MYRO/USDT:USDT": [ + "ONE/USDT:USDT": [ { "tier": 1.0, + "symbol": "ONE/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -27736,6 +38166,7 @@ }, { "tier": 2.0, + "symbol": "ONE/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -27752,6 +38183,7 @@ }, { "tier": 3.0, + "symbol": "ONE/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 50000.0, @@ -27768,6 +38200,7 @@ }, { "tier": 4.0, + "symbol": "ONE/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, "maxNotional": 100000.0, @@ -27784,6 +38217,7 @@ }, { "tier": 5.0, + "symbol": "ONE/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 500000.0, @@ -27800,6 +38234,7 @@ }, { "tier": 6.0, + "symbol": "ONE/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -27816,6 +38251,7 @@ }, { "tier": 7.0, + "symbol": "ONE/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 1250000.0, @@ -27832,6 +38268,7 @@ }, { "tier": 8.0, + "symbol": "ONE/USDT:USDT", "currency": "USDT", "minNotional": 1250000.0, "maxNotional": 2500000.0, @@ -27848,6 +38285,7 @@ }, { "tier": 9.0, + "symbol": "ONE/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, "maxNotional": 5000000.0, @@ -27863,18 +38301,19 @@ } } ], - "NEAR/USDC:USDC": [ + "ONG/USDT:USDT": [ { "tier": 1.0, - "currency": "USDC", + "symbol": "ONG/USDT:USDT", + "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, + "maxNotional": 5000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "1", "initialLeverage": "50", - "notionalCap": "10000", + "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.015", "cum": "0.0" @@ -27882,420 +38321,412 @@ }, { "tier": 2.0, - "currency": "USDC", - "minNotional": 10000.0, - "maxNotional": 250000.0, + "symbol": "ONG/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "2", "initialLeverage": "20", - "notionalCap": "250000", - "notionalFloor": "10000", + "notionalCap": "25000", + "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "100.0" + "cum": "50.0" } }, { "tier": 3.0, - "currency": "USDC", - "minNotional": 250000.0, - "maxNotional": 750000.0, - "maintenanceMarginRate": 0.03, - "maxLeverage": 15.0, - "info": { - "bracket": "3", - "initialLeverage": "15", - "notionalCap": "750000", - "notionalFloor": "250000", - "maintMarginRatio": "0.03", - "cum": "1350.0" - } - }, - { - "tier": 4.0, - "currency": "USDC", - "minNotional": 750000.0, - "maxNotional": 1500000.0, + "symbol": "ONG/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "10", - "notionalCap": "1500000", - "notionalFloor": "750000", + "notionalCap": "100000", + "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "16350.0" + "cum": "675.0" } }, { - "tier": 5.0, - "currency": "USDC", - "minNotional": 1500000.0, - "maxNotional": 4000000.0, + "tier": 4.0, + "symbol": "ONG/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "5", - "notionalCap": "4000000", - "notionalFloor": "1500000", + "notionalCap": "200000", + "notionalFloor": "100000", "maintMarginRatio": "0.1", - "cum": "91350.0" + "cum": "5675.0" } }, { - "tier": 6.0, - "currency": "USDC", - "minNotional": 4000000.0, - "maxNotional": 5000000.0, + "tier": 5.0, + "symbol": "ONG/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", - "notionalCap": "5000000", - "notionalFloor": "4000000", + "notionalCap": "500000", + "notionalFloor": "200000", "maintMarginRatio": "0.125", - "cum": "191350.0" + "cum": "10675.0" } }, { - "tier": 7.0, - "currency": "USDC", - "minNotional": 5000000.0, - "maxNotional": 12000000.0, + "tier": 6.0, + "symbol": "ONG/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "2", - "notionalCap": "12000000", - "notionalFloor": "5000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "816350.0" + "cum": "73175.0" } }, { - "tier": 8.0, - "currency": "USDC", - "minNotional": 12000000.0, - "maxNotional": 20000000.0, + "tier": 7.0, + "symbol": "ONG/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "20000000", - "notionalFloor": "12000000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "3816350.0" + "cum": "323175.0" } } ], - "NEAR/USDT:USDT": [ + "ONT/USDT:USDT": [ { "tier": 1.0, + "symbol": "ONT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, - "info": { - "bracket": "1", - "initialLeverage": "75", - "notionalCap": "10000", - "notionalFloor": "0", - "maintMarginRatio": "0.01", - "cum": "0.0" - } - }, - { - "tier": 2.0, - "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, - "info": { - "bracket": "2", - "initialLeverage": "50", - "notionalCap": "100000", - "notionalFloor": "10000", - "maintMarginRatio": "0.015", - "cum": "50.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { - "bracket": "3", - "initialLeverage": "25", - "notionalCap": "500000", - "notionalFloor": "100000", - "maintMarginRatio": "0.02", - "cum": "550.0" + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.015", + "cum": "0.0" } }, { - "tier": 4.0, + "tier": 2.0, + "symbol": "ONT/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 5000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "20", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "50000", + "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "3050.0" + "cum": "50.0" } }, { - "tier": 5.0, + "tier": 3.0, + "symbol": "ONT/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 5000000.0, + "minNotional": 50000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "10", - "notionalCap": "5000000", - "notionalFloor": "1000000", + "notionalCap": "600000", + "notionalFloor": "50000", "maintMarginRatio": "0.05", - "cum": "28050.0" + "cum": "1300.0" } }, { - "tier": 6.0, + "tier": 4.0, + "symbol": "ONT/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 600000.0, + "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "5", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "1600000", + "notionalFloor": "600000", "maintMarginRatio": "0.1", - "cum": "278050.0" + "cum": "31300.0" } }, { - "tier": 7.0, + "tier": 5.0, + "symbol": "ONT/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 12500000.0, + "minNotional": 1600000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "4", - "notionalCap": "12500000", - "notionalFloor": "10000000", + "notionalCap": "2000000", + "notionalFloor": "1600000", "maintMarginRatio": "0.125", - "cum": "528050.0" + "cum": "71300.0" } }, { - "tier": 8.0, + "tier": 6.0, + "symbol": "ONT/USDT:USDT", "currency": "USDT", - "minNotional": 12500000.0, - "maxNotional": 25000000.0, + "minNotional": 2000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "2", - "notionalCap": "25000000", - "notionalFloor": "12500000", + "notionalCap": "6000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.25", - "cum": "2090550.0" + "cum": "321300.0" } }, { - "tier": 9.0, + "tier": 7.0, + "symbol": "ONT/USDT:USDT", "currency": "USDT", - "minNotional": 25000000.0, - "maxNotional": 50000000.0, + "minNotional": 6000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "25000000", + "notionalCap": "10000000", + "notionalFloor": "6000000", "maintMarginRatio": "0.5", - "cum": "8340550.0" + "cum": "1821300.0" } } ], - "NEIRO/USDT:USDT": [ + "OP/USDT:USDT": [ { "tier": 1.0, + "symbol": "OP/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.01, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.006, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "20000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.006", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "OP/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 160000.0, - "maintenanceMarginRate": 0.015, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.01, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "160000", - "notionalFloor": "20000", - "maintMarginRatio": "0.015", - "cum": "100.0" + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "40.0" } }, { "tier": 3.0, + "symbol": "OP/USDT:USDT", "currency": "USDT", - "minNotional": 160000.0, - "maxNotional": 800000.0, + "minNotional": 50000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 40.0, + "info": { + "bracket": "3", + "initialLeverage": "40", + "notionalCap": "80000", + "notionalFloor": "50000", + "maintMarginRatio": "0.015", + "cum": "290.0" + } + }, + { + "tier": 4.0, + "symbol": "OP/USDT:USDT", + "currency": "USDT", + "minNotional": 80000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "25", - "notionalCap": "800000", - "notionalFloor": "160000", + "notionalCap": "300000", + "notionalFloor": "80000", "maintMarginRatio": "0.02", - "cum": "900.0" + "cum": "690.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "OP/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 1600000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "20", - "notionalCap": "1600000", - "notionalFloor": "800000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.025", - "cum": "4900.0" + "cum": "2190.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "OP/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 8000000.0, + "minNotional": 600000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "10", - "notionalCap": "8000000", - "notionalFloor": "1600000", + "notionalCap": "3000000", + "notionalFloor": "600000", "maintMarginRatio": "0.05", - "cum": "44900.0" + "cum": "17190.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "OP/USDT:USDT", "currency": "USDT", - "minNotional": 8000000.0, - "maxNotional": 16000000.0, + "minNotional": 3000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "5", - "notionalCap": "16000000", - "notionalFloor": "8000000", + "notionalCap": "6000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.1", - "cum": "444900.0" + "cum": "167190.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "OP/USDT:USDT", "currency": "USDT", - "minNotional": 16000000.0, - "maxNotional": 20000000.0, + "minNotional": 6000000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "4", - "notionalCap": "20000000", - "notionalFloor": "16000000", + "notionalCap": "7500000", + "notionalFloor": "6000000", "maintMarginRatio": "0.125", - "cum": "844900.0" + "cum": "317190.0" } }, { - "tier": 8.0, + "tier": 9.0, + "symbol": "OP/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 40000000.0, + "minNotional": 7500000.0, + "maxNotional": 18000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "2", - "notionalCap": "40000000", - "notionalFloor": "20000000", + "notionalCap": "18000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.25", - "cum": "3344900.0" + "cum": "1254690.0" } }, { - "tier": 9.0, + "tier": 10.0, + "symbol": "OP/USDT:USDT", "currency": "USDT", - "minNotional": 40000000.0, - "maxNotional": 80000000.0, + "minNotional": 18000000.0, + "maxNotional": 30000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "80000000", - "notionalFloor": "40000000", + "notionalCap": "30000000", + "notionalFloor": "18000000", "maintMarginRatio": "0.5", - "cum": "13344900.0" + "cum": "5754690.0" } } ], - "NEIROETH/USDT:USDT": [ + "ORBS/USDT:USDT": [ { "tier": 1.0, + "symbol": "ORBS/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -28304,14 +38735,15 @@ }, { "tier": 2.0, + "symbol": "ORBS/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 9.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "9", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -28320,15 +38752,16 @@ }, { "tier": 3.0, + "symbol": "ORBS/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "20000", + "initialLeverage": "8", + "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -28336,592 +38769,610 @@ }, { "tier": 4.0, + "symbol": "ORBS/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 40000.0, + "minNotional": 30000.0, + "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "40000", - "notionalFloor": "20000", + "initialLeverage": "7", + "notionalCap": "60000", + "notionalFloor": "30000", "maintMarginRatio": "0.025", - "cum": "175.0" + "cum": "225.0" } }, { "tier": 5.0, + "symbol": "ORBS/USDT:USDT", "currency": "USDT", - "minNotional": 40000.0, - "maxNotional": 200000.0, + "minNotional": 60000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "40000", + "initialLeverage": "6", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.05", - "cum": "1175.0" + "cum": "1725.0" } }, { "tier": 6.0, + "symbol": "ORBS/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "11175.0" + "cum": "16725.0" } }, { "tier": 7.0, + "symbol": "ORBS/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 600000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "750000", + "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "21175.0" + "cum": "31725.0" } }, { "tier": 8.0, + "symbol": "ORBS/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 750000.0, + "maxNotional": 900000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "900000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "83675.0" + "cum": "125475.0" } }, { "tier": 9.0, + "symbol": "ORBS/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 900000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "1000000", + "notionalFloor": "900000", "maintMarginRatio": "0.5", - "cum": "333675.0" + "cum": "350475.0" } } ], - "NEO/USDC:USDC": [ + "ORCA/USDT:USDT": [ { "tier": 1.0, - "currency": "USDC", + "symbol": "ORCA/USDT:USDT", + "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.006, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.006", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, - "currency": "USDC", + "symbol": "ORCA/USDT:USDT", + "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "50000", + "initialLeverage": "50", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.01", - "cum": "20.0" + "maintMarginRatio": "0.015", + "cum": "25.0" } }, { "tier": 3.0, - "currency": "USDC", - "minNotional": 50000.0, - "maxNotional": 400000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, - "info": { - "bracket": "3", - "initialLeverage": "20", - "notionalCap": "400000", - "notionalFloor": "50000", - "maintMarginRatio": "0.025", - "cum": "770.0" - } - }, - { - "tier": 4.0, - "currency": "USDC", - "minNotional": 400000.0, - "maxNotional": 800000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, - "info": { - "bracket": "4", - "initialLeverage": "10", - "notionalCap": "800000", - "notionalFloor": "400000", - "maintMarginRatio": "0.05", - "cum": "10770.0" - } - }, - { - "tier": 5.0, - "currency": "USDC", - "minNotional": 800000.0, - "maxNotional": 2000000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "2000000", - "notionalFloor": "800000", - "maintMarginRatio": "0.1", - "cum": "50770.0" - } - }, - { - "tier": 6.0, - "currency": "USDC", - "minNotional": 2000000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "6", - "initialLeverage": "4", - "notionalCap": "5000000", - "notionalFloor": "2000000", - "maintMarginRatio": "0.125", - "cum": "100770.0" - } - }, - { - "tier": 7.0, - "currency": "USDC", - "minNotional": 5000000.0, - "maxNotional": 12000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "12000000", - "notionalFloor": "5000000", - "maintMarginRatio": "0.25", - "cum": "725770.0" - } - }, - { - "tier": 8.0, - "currency": "USDC", - "minNotional": 12000000.0, - "maxNotional": 20000000.0, - "maintenanceMarginRate": 0.5, - "maxLeverage": 1.0, - "info": { - "bracket": "8", - "initialLeverage": "1", - "notionalCap": "20000000", - "notionalFloor": "12000000", - "maintMarginRatio": "0.5", - "cum": "3725770.0" - } - } - ], - "NEO/USDT:USDT": [ - { - "tier": 1.0, - "currency": "USDT", - "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.006, - "maxLeverage": 50.0, - "info": { - "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", - "notionalFloor": "0", - "maintMarginRatio": "0.006", - "cum": "0.0" - } - }, - { - "tier": 2.0, + "symbol": "ORCA/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.01, + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "2", + "bracket": "3", "initialLeverage": "25", - "notionalCap": "50000", - "notionalFloor": "5000", - "maintMarginRatio": "0.01", - "cum": "20.0" + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" } }, { - "tier": 3.0, + "tier": 4.0, + "symbol": "ORCA/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 400000.0, + "minNotional": 30000.0, + "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "400000", - "notionalFloor": "50000", + "notionalCap": "60000", + "notionalFloor": "30000", "maintMarginRatio": "0.025", - "cum": "770.0" + "cum": "225.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "ORCA/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 800000.0, + "minNotional": 60000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "800000", - "notionalFloor": "400000", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.05", - "cum": "10770.0" + "cum": "1725.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "ORCA/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 2000000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "2000000", - "notionalFloor": "800000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "50770.0" + "cum": "16725.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "ORCA/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 5000000.0, + "minNotional": 600000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "5000000", - "notionalFloor": "2000000", + "notionalCap": "750000", + "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "100770.0" + "cum": "31725.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "ORCA/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 12000000.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "12000000", - "notionalFloor": "5000000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "725770.0" + "cum": "125475.0" } }, { - "tier": 8.0, + "tier": 9.0, + "symbol": "ORCA/USDT:USDT", "currency": "USDT", - "minNotional": 12000000.0, - "maxNotional": 20000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "20000000", - "notionalFloor": "12000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "3725770.0" + "cum": "500475.0" } } ], - "NFP/USDT:USDT": [ + "ORDI/USDC:USDC": [ { "tier": 1.0, - "currency": "USDT", + "symbol": "ORDI/USDC:USDC", + "currency": "USDC", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.0065, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.0065", "cum": "0.0" } }, { "tier": 2.0, - "currency": "USDT", + "symbol": "ORDI/USDC:USDC", + "currency": "USDC", "minNotional": 5000.0, - "maxNotional": 25000.0, + "maxNotional": 75000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "75000", + "notionalFloor": "5000", + "maintMarginRatio": "0.01", + "cum": "17.5" + } + }, + { + "tier": 3.0, + "symbol": "ORDI/USDC:USDC", + "currency": "USDC", + "minNotional": 75000.0, + "maxNotional": 150000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 40.0, + "info": { + "bracket": "3", + "initialLeverage": "40", + "notionalCap": "150000", + "notionalFloor": "75000", + "maintMarginRatio": "0.015", + "cum": "392.5" + } + }, + { + "tier": 4.0, + "symbol": "ORDI/USDC:USDC", + "currency": "USDC", + "minNotional": 150000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "2", + "bracket": "4", "initialLeverage": "25", - "notionalCap": "25000", - "notionalFloor": "5000", + "notionalCap": "300000", + "notionalFloor": "150000", "maintMarginRatio": "0.02", - "cum": "25.0" + "cum": "1142.5" } }, { - "tier": 3.0, - "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, + "tier": 5.0, + "symbol": "ORDI/USDC:USDC", + "currency": "USDC", + "minNotional": 300000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "25000", + "notionalCap": "1000000", + "notionalFloor": "300000", "maintMarginRatio": "0.025", - "cum": "150.0" + "cum": "2642.5" } }, { - "tier": 4.0, - "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 500000.0, + "tier": 6.0, + "symbol": "ORDI/USDC:USDC", + "currency": "USDC", + "minNotional": 1000000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "10", - "notionalCap": "500000", - "notionalFloor": "50000", + "notionalCap": "3000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.05", - "cum": "1400.0" + "cum": "27642.5" } }, { - "tier": 5.0, - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "tier": 7.0, + "symbol": "ORDI/USDC:USDC", + "currency": "USDC", + "minNotional": 3000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "5", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "6000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.1", - "cum": "26400.0" + "cum": "177642.5" } }, { - "tier": 6.0, - "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 1250000.0, + "tier": 8.0, + "symbol": "ORDI/USDC:USDC", + "currency": "USDC", + "minNotional": 6000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "4", - "notionalCap": "1250000", - "notionalFloor": "1000000", + "notionalCap": "10000000", + "notionalFloor": "6000000", "maintMarginRatio": "0.125", - "cum": "51400.0" + "cum": "327642.5" } }, { - "tier": 7.0, - "currency": "USDT", - "minNotional": 1250000.0, - "maxNotional": 2500000.0, + "tier": 9.0, + "symbol": "ORDI/USDC:USDC", + "currency": "USDC", + "minNotional": 10000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "2", - "notionalCap": "2500000", - "notionalFloor": "1250000", + "notionalCap": "20000000", + "notionalFloor": "10000000", "maintMarginRatio": "0.25", - "cum": "207650.0" + "cum": "1577642.5" } }, { - "tier": 8.0, - "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "tier": 10.0, + "symbol": "ORDI/USDC:USDC", + "currency": "USDC", + "minNotional": 20000000.0, + "maxNotional": 30000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "2500000", + "notionalCap": "30000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.5", - "cum": "832650.0" + "cum": "6577642.5" } } ], - "NKN/USDT:USDT": [ + "ORDI/USDT:USDT": [ { "tier": 1.0, + "symbol": "ORDI/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.0065, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "20", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.0065", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "ORDI/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "minNotional": 10000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "10", - "notionalCap": "50000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" + "initialLeverage": "50", + "notionalCap": "80000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "35.0" } }, { "tier": 3.0, + "symbol": "ORDI/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 200000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "minNotional": 80000.0, + "maxNotional": 150000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 40.0, "info": { "bracket": "3", - "initialLeverage": "8", - "notionalCap": "200000", - "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1275.0" + "initialLeverage": "40", + "notionalCap": "150000", + "notionalFloor": "80000", + "maintMarginRatio": "0.015", + "cum": "435.0" } }, { "tier": 4.0, + "symbol": "ORDI/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 150000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", - "maintMarginRatio": "0.1", - "cum": "11275.0" + "initialLeverage": "25", + "notionalCap": "400000", + "notionalFloor": "150000", + "maintMarginRatio": "0.02", + "cum": "1185.0" } }, { "tier": 5.0, + "symbol": "ORDI/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, + "minNotional": 400000.0, "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 2.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "5", - "initialLeverage": "2", + "initialLeverage": "20", "notionalCap": "1000000", - "notionalFloor": "500000", - "maintMarginRatio": "0.125", - "cum": "23775.0" + "notionalFloor": "400000", + "maintMarginRatio": "0.025", + "cum": "3185.0" } }, { "tier": 6.0, + "symbol": "ORDI/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "6", + "initialLeverage": "10", + "notionalCap": "4000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.05", + "cum": "28185.0" + } + }, + { + "tier": 7.0, + "symbol": "ORDI/USDT:USDT", + "currency": "USDT", + "minNotional": 4000000.0, + "maxNotional": 8000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "7", + "initialLeverage": "5", + "notionalCap": "8000000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.1", + "cum": "228185.0" + } + }, + { + "tier": 8.0, + "symbol": "ORDI/USDT:USDT", + "currency": "USDT", + "minNotional": 8000000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "8", + "initialLeverage": "4", + "notionalCap": "10000000", + "notionalFloor": "8000000", + "maintMarginRatio": "0.125", + "cum": "428185.0" + } + }, + { + "tier": 9.0, + "symbol": "ORDI/USDT:USDT", + "currency": "USDT", + "minNotional": 10000000.0, + "maxNotional": 20000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1678185.0" + } + }, + { + "tier": 10.0, + "symbol": "ORDI/USDT:USDT", + "currency": "USDT", + "minNotional": 20000000.0, + "maxNotional": 40000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalCap": "40000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.5", - "cum": "398775.0" + "cum": "6678185.0" } } ], - "NMR/USDT:USDT": [ + "OXT/USDT:USDT": [ { "tier": 1.0, + "symbol": "OXT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -28938,6 +39389,7 @@ }, { "tier": 2.0, + "symbol": "OXT/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -28954,6 +39406,7 @@ }, { "tier": 3.0, + "symbol": "OXT/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 200000.0, @@ -28970,6 +39423,7 @@ }, { "tier": 4.0, + "symbol": "OXT/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, @@ -28986,6 +39440,7 @@ }, { "tier": 5.0, + "symbol": "OXT/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -29002,6 +39457,7 @@ }, { "tier": 6.0, + "symbol": "OXT/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 3000000.0, @@ -29018,6 +39474,7 @@ }, { "tier": 7.0, + "symbol": "OXT/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 5000000.0, @@ -29033,9 +39490,10 @@ } } ], - "NOT/USDT:USDT": [ + "PENDLE/USDT:USDT": [ { "tier": 1.0, + "symbol": "PENDLE/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -29052,15 +39510,16 @@ }, { "tier": 2.0, + "symbol": "PENDLE/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 60000.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "60000", + "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", "cum": "50.0" @@ -29068,243 +39527,292 @@ }, { "tier": 3.0, + "symbol": "PENDLE/USDT:USDT", "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 300000.0, + "minNotional": 20000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "300000", - "notionalFloor": "60000", + "notionalCap": "100000", + "notionalFloor": "20000", "maintMarginRatio": "0.02", - "cum": "350.0" + "cum": "150.0" } }, { "tier": 4.0, + "symbol": "PENDLE/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "300000", + "notionalCap": "200000", + "notionalFloor": "100000", "maintMarginRatio": "0.025", - "cum": "1850.0" + "cum": "650.0" } }, { "tier": 5.0, + "symbol": "PENDLE/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 3000000.0, + "minNotional": 200000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "3000000", - "notionalFloor": "600000", + "notionalCap": "1000000", + "notionalFloor": "200000", "maintMarginRatio": "0.05", - "cum": "16850.0" + "cum": "5650.0" } }, { "tier": 6.0, + "symbol": "PENDLE/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.1", - "cum": "166850.0" + "cum": "55650.0" } }, { "tier": 7.0, + "symbol": "PENDLE/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "7500000", - "notionalFloor": "6000000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "316850.0" + "cum": "105650.0" } }, { "tier": 8.0, + "symbol": "PENDLE/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.25", - "cum": "1254350.0" + "cum": "418150.0" } }, { "tier": 9.0, + "symbol": "PENDLE/USDT:USDT", "currency": "USDT", - "minNotional": 15000000.0, - "maxNotional": 30000000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "15000000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "5004350.0" + "cum": "1668150.0" } } ], - "NTRN/USDT:USDT": [ + "PENGU/USDT:USDT": [ { "tier": 1.0, + "symbol": "PENGU/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "PENGU/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "PENGU/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 150000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "150000", + "notionalFloor": "30000", + "maintMarginRatio": "0.02", + "cum": "200.0" + } + }, + { + "tier": 4.0, + "symbol": "PENGU/USDT:USDT", + "currency": "USDT", + "minNotional": 150000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "2", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "5000", + "notionalCap": "300000", + "notionalFloor": "150000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "950.0" } }, { - "tier": 3.0, + "tier": 5.0, + "symbol": "PENGU/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 100000.0, + "minNotional": 300000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "100000", - "notionalFloor": "25000", + "notionalCap": "1500000", + "notionalFloor": "300000", "maintMarginRatio": "0.05", - "cum": "675.0" + "cum": "8450.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "PENGU/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 200000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "200000", - "notionalFloor": "100000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.1", - "cum": "5675.0" + "cum": "83450.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "PENGU/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 3000000.0, + "maxNotional": 3750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "3750000", + "notionalFloor": "3000000", "maintMarginRatio": "0.125", - "cum": "10675.0" + "cum": "158450.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "PENGU/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 3750000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "7500000", + "notionalFloor": "3750000", "maintMarginRatio": "0.25", - "cum": "73175.0" + "cum": "627200.0" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "PENGU/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 7500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "15000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "323175.0" + "cum": "2502200.0" } } ], - "NULS/USDT:USDT": [ + "PEOPLE/USDT:USDT": [ { "tier": 1.0, + "symbol": "PEOPLE/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -29312,152 +39820,162 @@ }, { "tier": 2.0, + "symbol": "PEOPLE/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, + "minNotional": 10000.0, + "maxNotional": 40000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "10000", - "notionalFloor": "5000", + "notionalCap": "40000", + "notionalFloor": "10000", "maintMarginRatio": "0.015", - "cum": "25.0" + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "PEOPLE/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, + "minNotional": 40000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "10000", + "notionalCap": "200000", + "notionalFloor": "40000", "maintMarginRatio": "0.02", - "cum": "75.0" + "cum": "250.0" } }, { "tier": 4.0, + "symbol": "PEOPLE/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 40000.0, + "minNotional": 200000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "40000", - "notionalFloor": "20000", + "notionalCap": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.025", - "cum": "175.0" + "cum": "1250.0" } }, { "tier": 5.0, + "symbol": "PEOPLE/USDT:USDT", "currency": "USDT", - "minNotional": 40000.0, - "maxNotional": 200000.0, + "minNotional": 400000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "40000", + "notionalCap": "2000000", + "notionalFloor": "400000", "maintMarginRatio": "0.05", - "cum": "1175.0" + "cum": "11250.0" } }, { "tier": 6.0, + "symbol": "PEOPLE/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 2000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "4000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.1", - "cum": "11175.0" + "cum": "111250.0" } }, { "tier": 7.0, + "symbol": "PEOPLE/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 4000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "5000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.125", - "cum": "21175.0" + "cum": "211250.0" } }, { "tier": 8.0, + "symbol": "PEOPLE/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.25", - "cum": "83675.0" + "cum": "836250.0" } }, { "tier": 9.0, + "symbol": "PEOPLE/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 10000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "20000000", + "notionalFloor": "10000000", "maintMarginRatio": "0.5", - "cum": "333675.0" + "cum": "3336250.0" } } ], - "OCEAN/USDT:USDT": [ + "PERP/USDT:USDT": [ { "tier": 1.0, + "symbol": "PERP/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "PERP/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -29469,11 +39987,12 @@ "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "25.0" + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "PERP/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 200000.0, @@ -29485,11 +40004,12 @@ "notionalCap": "200000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "675.0" } }, { "tier": 4.0, + "symbol": "PERP/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, @@ -29501,184 +40021,178 @@ "notionalCap": "500000", "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "10650.0" + "cum": "10675.0" } }, { "tier": 5.0, + "symbol": "PERP/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 2.0, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "2", + "initialLeverage": "4", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "23150.0" + "cum": "23175.0" } }, { "tier": 6.0, + "symbol": "PERP/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "148175.0" + } + }, + { + "tier": 7.0, + "symbol": "PERP/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 3005000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "3005000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "398150.0" + "cum": "898175.0" } } ], - "OGN/USDT:USDT": [ + "PHB/USDT:USDT": [ { "tier": 1.0, + "symbol": "PHB/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "PHB/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, - "info": { - "bracket": "2", - "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 20000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 15.0, "info": { - "bracket": "3", - "initialLeverage": "20", + "bracket": "2", + "initialLeverage": "15", "notionalCap": "25000", - "notionalFloor": "20000", + "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "125.0" + "cum": "25.0" } }, { - "tier": 4.0, + "tier": 3.0, + "symbol": "PHB/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 200000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "10", - "notionalCap": "200000", + "notionalCap": "100000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "750.0" + "cum": "650.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "PHB/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1", - "cum": "10750.0" - } - }, - { - "tier": 6.0, - "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "6", - "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", - "maintMarginRatio": "0.125", - "cum": "20750.0" + "cum": "5650.0" } }, { - "tier": 7.0, + "tier": 5.0, + "symbol": "PHB/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, + "minNotional": 250000.0, "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.25, + "maintenanceMarginRate": 0.125, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "2", "notionalCap": "1000000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "83250.0" + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11900.0" } }, { - "tier": 8.0, + "tier": 6.0, + "symbol": "PHB/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "2000000", + "notionalCap": "5000000", "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "333250.0" + "cum": "386900.0" } } ], - "OM/USDT:USDT": [ + "PIXEL/USDT:USDT": [ { "tier": 1.0, + "symbol": "PIXEL/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, + "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "10000", + "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -29686,380 +40200,300 @@ }, { "tier": 2.0, + "symbol": "PIXEL/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, + "minNotional": 5000.0, + "maxNotional": 16000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "20000", - "notionalFloor": "10000", + "notionalCap": "16000", + "notionalFloor": "5000", "maintMarginRatio": "0.015", - "cum": "50.0" + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "PIXEL/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 100000.0, + "minNotional": 16000.0, + "maxNotional": 80000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "100000", - "notionalFloor": "20000", + "notionalCap": "80000", + "notionalFloor": "16000", "maintMarginRatio": "0.02", - "cum": "150.0" + "cum": "105.0" } }, { "tier": 4.0, + "symbol": "PIXEL/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 200000.0, + "minNotional": 80000.0, + "maxNotional": 160000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "200000", - "notionalFloor": "100000", + "notionalCap": "160000", + "notionalFloor": "80000", "maintMarginRatio": "0.025", - "cum": "650.0" + "cum": "505.0" } }, { "tier": 5.0, + "symbol": "PIXEL/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 1000000.0, + "minNotional": 160000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "1000000", - "notionalFloor": "200000", + "notionalCap": "800000", + "notionalFloor": "160000", "maintMarginRatio": "0.05", - "cum": "5650.0" + "cum": "4505.0" } }, { "tier": 6.0, + "symbol": "PIXEL/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 800000.0, + "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "1600000", + "notionalFloor": "800000", "maintMarginRatio": "0.1", - "cum": "55650.0" + "cum": "44505.0" } }, { "tier": 7.0, + "symbol": "PIXEL/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 2500000.0, + "minNotional": 1600000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "2500000", - "notionalFloor": "2000000", + "notionalCap": "2000000", + "notionalFloor": "1600000", "maintMarginRatio": "0.125", - "cum": "105650.0" + "cum": "84505.0" } }, { "tier": 8.0, + "symbol": "PIXEL/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "minNotional": 2000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "5000000", - "notionalFloor": "2500000", + "notionalCap": "4000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.25", - "cum": "418150.0" + "cum": "334505.0" } }, { "tier": 9.0, + "symbol": "PIXEL/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 4000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "8000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "1668150.0" + "cum": "1334505.0" } } ], - "OMG/USDT:USDT": [ + "PNUT/USDT:USDT": [ { "tier": 1.0, + "symbol": "PNUT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "20000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "PNUT/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, - "info": { - "bracket": "2", - "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 900000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, - "info": { - "bracket": "3", - "initialLeverage": "10", - "notionalCap": "900000", - "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1300.0" - } - }, - { - "tier": 4.0, - "currency": "USDT", - "minNotional": 900000.0, - "maxNotional": 2400000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "4", - "initialLeverage": "5", - "notionalCap": "2400000", - "notionalFloor": "900000", - "maintMarginRatio": "0.1", - "cum": "46300.0" - } - }, - { - "tier": 5.0, - "currency": "USDT", - "minNotional": 2400000.0, - "maxNotional": 3000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "5", - "initialLeverage": "4", - "notionalCap": "3000000", - "notionalFloor": "2400000", - "maintMarginRatio": "0.125", - "cum": "106300.0" - } - }, - { - "tier": 6.0, - "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 9000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "6", - "initialLeverage": "2", - "notionalCap": "9000000", - "notionalFloor": "3000000", - "maintMarginRatio": "0.25", - "cum": "481300.0" - } - }, - { - "tier": 7.0, - "currency": "USDT", - "minNotional": 9000000.0, - "maxNotional": 15000000.0, - "maintenanceMarginRate": 0.5, - "maxLeverage": 1.0, - "info": { - "bracket": "7", - "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "9000000", - "maintMarginRatio": "0.5", - "cum": "2731300.0" - } - } - ], - "OMNI/USDT:USDT": [ - { - "tier": 1.0, - "currency": "USDT", - "minNotional": 0.0, - "maxNotional": 5000.0, + "minNotional": 20000.0, + "maxNotional": 160000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { - "bracket": "1", + "bracket": "2", "initialLeverage": "50", - "notionalCap": "5000", - "notionalFloor": "0", + "notionalCap": "160000", + "notionalFloor": "20000", "maintMarginRatio": "0.015", - "cum": "0.0" + "cum": "100.0" } }, { - "tier": 2.0, + "tier": 3.0, + "symbol": "PNUT/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 20000.0, + "minNotional": 160000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "2", + "bracket": "3", "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "5000", + "notionalCap": "800000", + "notionalFloor": "160000", "maintMarginRatio": "0.02", - "cum": "25.0" + "cum": "900.0" } }, { - "tier": 3.0, + "tier": 4.0, + "symbol": "PNUT/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 30000.0, + "minNotional": 800000.0, + "maxNotional": 1600000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "30000", - "notionalFloor": "20000", + "notionalCap": "1600000", + "notionalFloor": "800000", "maintMarginRatio": "0.025", - "cum": "125.0" + "cum": "4900.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "PNUT/USDT:USDT", "currency": "USDT", - "minNotional": 30000.0, - "maxNotional": 300000.0, + "minNotional": 1600000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "300000", - "notionalFloor": "30000", + "notionalCap": "8000000", + "notionalFloor": "1600000", "maintMarginRatio": "0.05", - "cum": "875.0" + "cum": "44900.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "PNUT/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 8000000.0, + "maxNotional": 16000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "600000", - "notionalFloor": "300000", + "notionalCap": "16000000", + "notionalFloor": "8000000", "maintMarginRatio": "0.1", - "cum": "15875.0" + "cum": "444900.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "PNUT/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 750000.0, + "minNotional": 16000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "750000", - "notionalFloor": "600000", + "notionalCap": "20000000", + "notionalFloor": "16000000", "maintMarginRatio": "0.125", - "cum": "30875.0" + "cum": "844900.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "PNUT/USDT:USDT", "currency": "USDT", - "minNotional": 750000.0, - "maxNotional": 1500000.0, + "minNotional": 20000000.0, + "maxNotional": 40000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1500000", - "notionalFloor": "750000", + "notionalCap": "40000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.25", - "cum": "124625.0" + "cum": "3344900.0" } }, { - "tier": 8.0, + "tier": 9.0, + "symbol": "PNUT/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 40000000.0, + "maxNotional": 80000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "80000000", + "notionalFloor": "40000000", "maintMarginRatio": "0.5", - "cum": "499625.0" + "cum": "13344900.0" } } ], - "ONDO/USDT:USDT": [ + "POL/USDT:USDT": [ { "tier": 1.0, + "symbol": "POL/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -30076,15 +40510,16 @@ }, { "tier": 2.0, + "symbol": "POL/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 40000.0, + "maxNotional": 60000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "40000", + "notionalCap": "60000", "notionalFloor": "10000", "maintMarginRatio": "0.015", "cum": "50.0" @@ -30092,120 +40527,128 @@ }, { "tier": 3.0, + "symbol": "POL/USDT:USDT", "currency": "USDT", - "minNotional": 40000.0, - "maxNotional": 200000.0, + "minNotional": 60000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "200000", - "notionalFloor": "40000", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.02", - "cum": "250.0" + "cum": "350.0" } }, { "tier": 4.0, + "symbol": "POL/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.025", - "cum": "1250.0" + "cum": "1850.0" } }, { "tier": 5.0, + "symbol": "POL/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 2000000.0, + "minNotional": 600000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "2000000", - "notionalFloor": "400000", + "notionalCap": "3000000", + "notionalFloor": "600000", "maintMarginRatio": "0.05", - "cum": "11250.0" + "cum": "16850.0" } }, { "tier": 6.0, + "symbol": "POL/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, + "minNotional": 3000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "4000000", - "notionalFloor": "2000000", + "notionalCap": "6000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.1", - "cum": "111250.0" + "cum": "166850.0" } }, { "tier": 7.0, + "symbol": "POL/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 5000000.0, + "minNotional": 6000000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "5000000", - "notionalFloor": "4000000", + "notionalCap": "7500000", + "notionalFloor": "6000000", "maintMarginRatio": "0.125", - "cum": "211250.0" + "cum": "316850.0" } }, { "tier": 8.0, + "symbol": "POL/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 7500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "15000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.25", - "cum": "836250.0" + "cum": "1254350.0" } }, { "tier": 9.0, + "symbol": "POL/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "minNotional": 15000000.0, + "maxNotional": 30000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "30000000", + "notionalFloor": "15000000", "maintMarginRatio": "0.5", - "cum": "3336250.0" + "cum": "5004350.0" } } ], - "ONE/USDT:USDT": [ + "POLYX/USDT:USDT": [ { "tier": 1.0, + "symbol": "POLYX/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -30222,15 +40665,16 @@ }, { "tier": 2.0, + "symbol": "POLYX/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "2", "initialLeverage": "25", - "notionalCap": "20000", + "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.02", "cum": "25.0" @@ -30238,996 +40682,1007 @@ }, { "tier": 3.0, + "symbol": "POLYX/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 25000.0, + "minNotional": 25000.0, + "maxNotional": 80000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "3", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "20000", + "notionalCap": "80000", + "notionalFloor": "25000", "maintMarginRatio": "0.025", - "cum": "125.0" + "cum": "150.0" } }, { "tier": 4.0, + "symbol": "POLYX/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 80000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "4", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "800000", + "notionalFloor": "80000", "maintMarginRatio": "0.05", - "cum": "750.0" + "cum": "2150.0" } }, { "tier": 5.0, + "symbol": "POLYX/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 800000.0, + "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "5", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "1600000", + "notionalFloor": "800000", "maintMarginRatio": "0.1", - "cum": "10750.0" + "cum": "42150.0" } }, { "tier": 6.0, + "symbol": "POLYX/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 1600000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "6", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "2000000", + "notionalFloor": "1600000", "maintMarginRatio": "0.125", - "cum": "20750.0" + "cum": "82150.0" } }, { "tier": 7.0, + "symbol": "POLYX/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 2000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "4000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.25", - "cum": "83250.0" + "cum": "332150.0" } }, { "tier": 8.0, + "symbol": "POLYX/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 4000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "8000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "333250.0" + "cum": "1332150.0" } } ], - "ONG/USDT:USDT": [ + "PONKE/USDT:USDT": [ { "tier": 1.0, + "symbol": "PONKE/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "PONKE/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "PONKE/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "PONKE/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "2", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "5000", + "notionalCap": "60000", + "notionalFloor": "30000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "225.0" } }, { - "tier": 3.0, + "tier": 5.0, + "symbol": "PONKE/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 100000.0, + "minNotional": 60000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "100000", - "notionalFloor": "25000", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.05", - "cum": "675.0" + "cum": "1725.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "PONKE/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 200000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "200000", - "notionalFloor": "100000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "5675.0" + "cum": "16725.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "PONKE/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 600000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "750000", + "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "10675.0" + "cum": "31725.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "PONKE/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "73175.0" + "cum": "125475.0" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "PONKE/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "323175.0" + "cum": "500475.0" } } ], - "ONT/USDT:USDT": [ + "POPCAT/USDT:USDT": [ { "tier": 1.0, + "symbol": "POPCAT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "POPCAT/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 50000.0, + "minNotional": 10000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "100000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "POPCAT/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "500000", + "notionalFloor": "100000", + "maintMarginRatio": "0.02", + "cum": "550.0" + } + }, + { + "tier": 4.0, + "symbol": "POPCAT/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "2", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "5000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "3050.0" } }, { - "tier": 3.0, + "tier": 5.0, + "symbol": "POPCAT/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 600000.0, + "minNotional": 1000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "600000", - "notionalFloor": "50000", + "notionalCap": "5000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.05", - "cum": "1300.0" + "cum": "28050.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "POPCAT/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 1600000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "1600000", - "notionalFloor": "600000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.1", - "cum": "31300.0" + "cum": "278050.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "POPCAT/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 2000000.0, + "minNotional": 10000000.0, + "maxNotional": 12500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1600000", + "notionalCap": "12500000", + "notionalFloor": "10000000", "maintMarginRatio": "0.125", - "cum": "71300.0" + "cum": "528050.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "POPCAT/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 6000000.0, + "minNotional": 12500000.0, + "maxNotional": 25000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "6000000", - "notionalFloor": "2000000", + "notionalCap": "25000000", + "notionalFloor": "12500000", "maintMarginRatio": "0.25", - "cum": "321300.0" + "cum": "2090550.0" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "POPCAT/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 10000000.0, + "minNotional": 25000000.0, + "maxNotional": 50000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalCap": "50000000", + "notionalFloor": "25000000", "maintMarginRatio": "0.5", - "cum": "1821300.0" + "cum": "8340550.0" } } ], - "OP/USDT:USDT": [ + "PORTAL/USDT:USDT": [ { "tier": 1.0, + "symbol": "PORTAL/USDT:USDT", "currency": "USDT", - "minNotional": 0.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.006, - "maxLeverage": 75.0, - "info": { - "bracket": "1", - "initialLeverage": "75", - "notionalCap": "10000", - "notionalFloor": "0", - "maintMarginRatio": "0.006", - "cum": "0.0" - } - }, - { - "tier": 2.0, - "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 50.0, - "info": { - "bracket": "2", - "initialLeverage": "50", - "notionalCap": "50000", - "notionalFloor": "10000", - "maintMarginRatio": "0.01", - "cum": "40.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 80000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 40.0, - "info": { - "bracket": "3", - "initialLeverage": "40", - "notionalCap": "80000", - "notionalFloor": "50000", - "maintMarginRatio": "0.015", - "cum": "290.0" - } - }, - { - "tier": 4.0, - "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 300000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { - "bracket": "4", - "initialLeverage": "25", - "notionalCap": "300000", - "notionalFloor": "80000", - "maintMarginRatio": "0.02", - "cum": "690.0" + "bracket": "1", + "initialLeverage": "50", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.015", + "cum": "0.0" } }, { - "tier": 5.0, + "tier": 2.0, + "symbol": "PORTAL/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 5000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "5", + "bracket": "2", "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "300000", + "notionalCap": "25000", + "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "2190.0" + "cum": "50.0" } }, { - "tier": 6.0, + "tier": 3.0, + "symbol": "PORTAL/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 3000000.0, + "minNotional": 25000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "6", + "bracket": "3", "initialLeverage": "10", - "notionalCap": "3000000", - "notionalFloor": "600000", + "notionalCap": "100000", + "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "17190.0" + "cum": "675.0" } }, { - "tier": 7.0, + "tier": 4.0, + "symbol": "PORTAL/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "minNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "7", + "bracket": "4", "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "200000", + "notionalFloor": "100000", "maintMarginRatio": "0.1", - "cum": "167190.0" + "cum": "5675.0" } }, { - "tier": 8.0, + "tier": 5.0, + "symbol": "PORTAL/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "minNotional": 200000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "8", + "bracket": "5", "initialLeverage": "4", - "notionalCap": "7500000", - "notionalFloor": "6000000", + "notionalCap": "500000", + "notionalFloor": "200000", "maintMarginRatio": "0.125", - "cum": "317190.0" + "cum": "10675.0" } }, { - "tier": 9.0, + "tier": 6.0, + "symbol": "PORTAL/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 18000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "6", "initialLeverage": "2", - "notionalCap": "18000000", - "notionalFloor": "7500000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "1254690.0" + "cum": "73175.0" } }, { - "tier": 10.0, + "tier": 7.0, + "symbol": "PORTAL/USDT:USDT", "currency": "USDT", - "minNotional": 18000000.0, - "maxNotional": 30000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "18000000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "5754690.0" + "cum": "323175.0" } } ], - "ORBS/USDT:USDT": [ + "POWR/USDT:USDT": [ { "tier": 1.0, + "symbol": "POWR/USDT:USDT", "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" } }, { "tier": 2.0, + "symbol": "POWR/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, - "info": { - "bracket": "2", - "initialLeverage": "50", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.015", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 30000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, - "info": { - "bracket": "3", - "initialLeverage": "25", - "notionalCap": "30000", - "notionalFloor": "10000", - "maintMarginRatio": "0.02", - "cum": "75.0" - } - }, - { - "tier": 4.0, - "currency": "USDT", - "minNotional": 30000.0, - "maxNotional": 60000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "20", - "notionalCap": "60000", - "notionalFloor": "30000", + "notionalCap": "25000", + "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "225.0" + "cum": "50.0" } }, { - "tier": 5.0, + "tier": 3.0, + "symbol": "POWR/USDT:USDT", "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 300000.0, + "minNotional": 25000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "10", - "notionalCap": "300000", - "notionalFloor": "60000", + "notionalCap": "100000", + "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "1725.0" + "cum": "675.0" } }, { - "tier": 6.0, + "tier": 4.0, + "symbol": "POWR/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "5", - "notionalCap": "600000", - "notionalFloor": "300000", + "notionalCap": "200000", + "notionalFloor": "100000", "maintMarginRatio": "0.1", - "cum": "16725.0" + "cum": "5675.0" } }, { - "tier": 7.0, + "tier": 5.0, + "symbol": "POWR/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 750000.0, + "minNotional": 200000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "4", - "notionalCap": "750000", - "notionalFloor": "600000", + "notionalCap": "500000", + "notionalFloor": "200000", "maintMarginRatio": "0.125", - "cum": "31725.0" + "cum": "10675.0" } }, { - "tier": 8.0, + "tier": 6.0, + "symbol": "POWR/USDT:USDT", "currency": "USDT", - "minNotional": 750000.0, - "maxNotional": 1500000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "2", - "notionalCap": "1500000", - "notionalFloor": "750000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "125475.0" + "cum": "73175.0" } }, { - "tier": 9.0, + "tier": 7.0, + "symbol": "POWR/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "500475.0" + "cum": "323175.0" } } ], - "ORDI/USDC:USDC": [ + "PYTH/USDT:USDT": [ { "tier": 1.0, - "currency": "USDC", + "symbol": "PYTH/USDT:USDT", + "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.0065, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.0065", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, - "currency": "USDC", - "minNotional": 5000.0, - "maxNotional": 75000.0, - "maintenanceMarginRate": 0.01, + "symbol": "PYTH/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "75000", - "notionalFloor": "5000", - "maintMarginRatio": "0.01", - "cum": "17.5" + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" } }, { "tier": 3.0, - "currency": "USDC", - "minNotional": 75000.0, + "symbol": "PYTH/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, "maxNotional": 150000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 40.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "40", + "initialLeverage": "25", "notionalCap": "150000", - "notionalFloor": "75000", - "maintMarginRatio": "0.015", - "cum": "392.5" + "notionalFloor": "30000", + "maintMarginRatio": "0.02", + "cum": "200.0" } }, { "tier": 4.0, - "currency": "USDC", + "symbol": "PYTH/USDT:USDT", + "currency": "USDT", "minNotional": 150000.0, "maxNotional": 300000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "4", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "300000", "notionalFloor": "150000", - "maintMarginRatio": "0.02", - "cum": "1142.5" + "maintMarginRatio": "0.025", + "cum": "950.0" } }, { "tier": 5.0, - "currency": "USDC", + "symbol": "PYTH/USDT:USDT", + "currency": "USDT", "minNotional": 300000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, - "info": { - "bracket": "5", - "initialLeverage": "20", - "notionalCap": "1000000", - "notionalFloor": "300000", - "maintMarginRatio": "0.025", - "cum": "2642.5" - } - }, - { - "tier": 6.0, - "currency": "USDC", - "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalCap": "1500000", + "notionalFloor": "300000", "maintMarginRatio": "0.05", - "cum": "27642.5" + "cum": "8450.0" } }, { - "tier": 7.0, - "currency": "USDC", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "tier": 6.0, + "symbol": "PYTH/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.1", - "cum": "177642.5" + "cum": "83450.0" } }, { - "tier": 8.0, - "currency": "USDC", - "minNotional": 6000000.0, - "maxNotional": 10000000.0, + "tier": 7.0, + "symbol": "PYTH/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 3750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalCap": "3750000", + "notionalFloor": "3000000", "maintMarginRatio": "0.125", - "cum": "327642.5" + "cum": "158450.0" } }, { - "tier": 9.0, - "currency": "USDC", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "tier": 8.0, + "symbol": "PYTH/USDT:USDT", + "currency": "USDT", + "minNotional": 3750000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "7500000", + "notionalFloor": "3750000", "maintMarginRatio": "0.25", - "cum": "1577642.5" + "cum": "627200.0" } }, { - "tier": 10.0, - "currency": "USDC", - "minNotional": 20000000.0, - "maxNotional": 30000000.0, + "tier": 9.0, + "symbol": "PYTH/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "20000000", + "notionalCap": "15000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "6577642.5" + "cum": "2502200.0" } } ], - "ORDI/USDT:USDT": [ + "QNT/USDT:USDT": [ { "tier": 1.0, + "symbol": "QNT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.0065, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "10000", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.0065", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "QNT/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 80000.0, - "maintenanceMarginRate": 0.01, + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "80000", - "notionalFloor": "10000", - "maintMarginRatio": "0.01", - "cum": "35.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 150000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 40.0, - "info": { - "bracket": "3", - "initialLeverage": "40", - "notionalCap": "150000", - "notionalFloor": "80000", + "notionalCap": "10000", + "notionalFloor": "5000", "maintMarginRatio": "0.015", - "cum": "435.0" + "cum": "25.0" } }, { - "tier": 4.0, + "tier": 3.0, + "symbol": "QNT/USDT:USDT", "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 400000.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "25", - "notionalCap": "400000", - "notionalFloor": "150000", + "notionalCap": "50000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "1185.0" + "cum": "75.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "QNT/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 1000000.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "1000000", - "notionalFloor": "400000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "3185.0" + "cum": "325.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "QNT/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 4000000.0, + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "4000000", - "notionalFloor": "1000000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.05", - "cum": "28185.0" + "cum": "2825.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "QNT/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "8000000", - "notionalFloor": "4000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "228185.0" + "cum": "27825.0" } }, { - "tier": 8.0, + "tier": 7.0, + "symbol": "QNT/USDT:USDT", "currency": "USDT", - "minNotional": 8000000.0, - "maxNotional": 10000000.0, + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "10000000", - "notionalFloor": "8000000", + "notionalCap": "1250000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "428185.0" + "cum": "52825.0" } }, { - "tier": 9.0, + "tier": 8.0, + "symbol": "QNT/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "minNotional": 1250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "2500000", + "notionalFloor": "1250000", "maintMarginRatio": "0.25", - "cum": "1678185.0" + "cum": "209075.0" } }, { - "tier": 10.0, + "tier": 9.0, + "symbol": "QNT/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 40000000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "40000000", - "notionalFloor": "20000000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "6678185.0" + "cum": "834075.0" } } ], - "OXT/USDT:USDT": [ + "QTUM/USDT:USDT": [ { "tier": 1.0, + "symbol": "QTUM/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "20", + "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "QTUM/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "15", + "initialLeverage": "20", "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "25.0" + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "QTUM/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 200000.0, @@ -31239,11 +41694,12 @@ "notionalCap": "200000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "675.0" } }, { "tier": 4.0, + "symbol": "QTUM/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, @@ -31255,11 +41711,12 @@ "notionalCap": "500000", "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "10650.0" + "cum": "10675.0" } }, { "tier": 5.0, + "symbol": "QTUM/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -31271,11 +41728,12 @@ "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "23150.0" + "cum": "23175.0" } }, { "tier": 6.0, + "symbol": "QTUM/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 3000000.0, @@ -31287,11 +41745,12 @@ "notionalCap": "3000000", "notionalFloor": "1000000", "maintMarginRatio": "0.25", - "cum": "148150.0" + "cum": "148175.0" } }, { "tier": 7.0, + "symbol": "QTUM/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 5000000.0, @@ -31303,22 +41762,23 @@ "notionalCap": "5000000", "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "898150.0" + "cum": "898175.0" } } ], - "PENDLE/USDT:USDT": [ + "QUICK/USDT:USDT": [ { "tier": 1.0, + "symbol": "QUICK/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, + "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "10000", + "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -31326,136 +41786,266 @@ }, { "tier": 2.0, + "symbol": "QUICK/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, + "minNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "20000", - "notionalFloor": "10000", + "notionalCap": "10000", + "notionalFloor": "5000", "maintMarginRatio": "0.015", - "cum": "50.0" + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "QUICK/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 100000.0, + "minNotional": 10000.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "100000", - "notionalFloor": "20000", + "notionalCap": "20000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "150.0" + "cum": "75.0" } }, { "tier": 4.0, + "symbol": "QUICK/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 200000.0, + "minNotional": 20000.0, + "maxNotional": 40000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "200000", - "notionalFloor": "100000", + "notionalCap": "40000", + "notionalFloor": "20000", "maintMarginRatio": "0.025", - "cum": "650.0" + "cum": "175.0" } }, { "tier": 5.0, + "symbol": "QUICK/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 1000000.0, + "minNotional": 40000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "1000000", - "notionalFloor": "200000", + "notionalCap": "200000", + "notionalFloor": "40000", "maintMarginRatio": "0.05", - "cum": "5650.0" + "cum": "1175.0" } }, { "tier": 6.0, + "symbol": "QUICK/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 200000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "55650.0" + "cum": "11175.0" } }, { "tier": 7.0, + "symbol": "QUICK/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 2500000.0, + "minNotional": 400000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "2500000", - "notionalFloor": "2000000", + "notionalCap": "500000", + "notionalFloor": "400000", "maintMarginRatio": "0.125", - "cum": "105650.0" + "cum": "21175.0" } }, { "tier": 8.0, + "symbol": "QUICK/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "5000000", - "notionalFloor": "2500000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "418150.0" + "cum": "83675.0" } }, { "tier": 9.0, + "symbol": "QUICK/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "1668150.0" + "cum": "333675.0" } } ], - "PEOPLE/USDT:USDT": [ + "RAD/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "RAD/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 20.0, + "info": { + "bracket": "1", + "initialLeverage": "20", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.02", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "RAD/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 15.0, + "info": { + "bracket": "2", + "initialLeverage": "15", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "RAD/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "200000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "650.0" + } + }, + { + "tier": 4.0, + "symbol": "RAD/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "200000", + "maintMarginRatio": "0.1", + "cum": "10650.0" + } + }, + { + "tier": 5.0, + "symbol": "RAD/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "23150.0" + } + }, + { + "tier": 6.0, + "symbol": "RAD/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.25", + "cum": "148150.0" + } + }, + { + "tier": 7.0, + "symbol": "RAD/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 3500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "3500000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.5", + "cum": "898150.0" + } + } + ], + "RARE/USDT:USDT": [ { "tier": 1.0, + "symbol": "RARE/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -31472,6 +42062,7 @@ }, { "tier": 2.0, + "symbol": "RARE/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 30000.0, @@ -31488,6 +42079,7 @@ }, { "tier": 3.0, + "symbol": "RARE/USDT:USDT", "currency": "USDT", "minNotional": 30000.0, "maxNotional": 150000.0, @@ -31504,6 +42096,7 @@ }, { "tier": 4.0, + "symbol": "RARE/USDT:USDT", "currency": "USDT", "minNotional": 150000.0, "maxNotional": 300000.0, @@ -31520,6 +42113,7 @@ }, { "tier": 5.0, + "symbol": "RARE/USDT:USDT", "currency": "USDT", "minNotional": 300000.0, "maxNotional": 1500000.0, @@ -31536,6 +42130,7 @@ }, { "tier": 6.0, + "symbol": "RARE/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, "maxNotional": 3000000.0, @@ -31552,6 +42147,7 @@ }, { "tier": 7.0, + "symbol": "RARE/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 3750000.0, @@ -31568,6 +42164,7 @@ }, { "tier": 8.0, + "symbol": "RARE/USDT:USDT", "currency": "USDT", "minNotional": 3750000.0, "maxNotional": 7500000.0, @@ -31584,6 +42181,7 @@ }, { "tier": 9.0, + "symbol": "RARE/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, "maxNotional": 15000000.0, @@ -31599,25 +42197,27 @@ } } ], - "PERP/USDT:USDT": [ + "RAY/USDT:USDT": [ { "tier": 1.0, + "symbol": "RAY/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "RAY/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -31629,330 +42229,522 @@ "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "75.0" } }, { "tier": 3.0, + "symbol": "RAY/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 200000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "200000", + "notionalCap": "100000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "675.0" + "cum": "700.0" } }, { "tier": 4.0, + "symbol": "RAY/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "4", "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1", - "cum": "10675.0" + "cum": "5700.0" } }, { "tier": 5.0, + "symbol": "RAY/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, + "minNotional": 250000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", + "initialLeverage": "2", "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalFloor": "250000", "maintMarginRatio": "0.125", - "cum": "23175.0" + "cum": "11950.0" } }, { "tier": 6.0, + "symbol": "RAY/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "5000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "386950.0" + } + } + ], + "RAYSOL/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "RAYSOL/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "RAYSOL/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "RAYSOL/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "RAYSOL/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "RAYSOL/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "RAYSOL/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "16725.0" + } + }, + { + "tier": 7.0, + "symbol": "RAYSOL/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "RAYSOL/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "148175.0" + "cum": "125475.0" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "RAYSOL/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3005000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "3005000", - "notionalFloor": "3000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "898175.0" + "cum": "500475.0" } } ], - "PHB/USDT:USDT": [ + "RDNT/USDT:USDT": [ { "tier": 1.0, + "symbol": "RDNT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "20", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "RDNT/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "minNotional": 10000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "15", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" + "initialLeverage": "50", + "notionalCap": "20000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "RDNT/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, + "minNotional": 20000.0, "maxNotional": 100000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "25", "notionalCap": "100000", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "650.0" + "notionalFloor": "20000", + "maintMarginRatio": "0.02", + "cum": "150.0" } }, { "tier": 4.0, + "symbol": "RDNT/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, - "maxNotional": 250000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "200000", + "notionalFloor": "100000", + "maintMarginRatio": "0.025", + "cum": "650.0" + } + }, + { + "tier": 5.0, + "symbol": "RDNT/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "200000", + "maintMarginRatio": "0.05", + "cum": "5650.0" + } + }, + { + "tier": 6.0, + "symbol": "RDNT/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "250000", - "notionalFloor": "100000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.1", - "cum": "5650.0" + "cum": "55650.0" + } + }, + { + "tier": 7.0, + "symbol": "RDNT/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "2500000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "105650.0" } }, { - "tier": 5.0, + "tier": 8.0, + "symbol": "RDNT/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.125, + "minNotional": 2500000.0, + "maxNotional": 6000000.0, + "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "5", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "11900.0" + "notionalCap": "6000000", + "notionalFloor": "2500000", + "maintMarginRatio": "0.25", + "cum": "418150.0" } }, { - "tier": 6.0, + "tier": 9.0, + "symbol": "RDNT/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 5000000.0, + "minNotional": 6000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "1000000", + "notionalCap": "10000000", + "notionalFloor": "6000000", "maintMarginRatio": "0.5", - "cum": "386900.0" + "cum": "1918150.0" } } ], - "PIXEL/USDT:USDT": [ + "REEF/USDT:USDT": [ { "tier": 1.0, + "symbol": "REEF/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "REEF/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, + "minNotional": 20000.0, "maxNotional": 25000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "8", "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "notionalFloor": "20000", + "maintMarginRatio": "0.025", + "cum": "100.0" } }, { "tier": 3.0, + "symbol": "REEF/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 80000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "80000", + "initialLeverage": "6", + "notionalCap": "200000", "notionalFloor": "25000", - "maintMarginRatio": "0.025", - "cum": "150.0" - } - }, - { - "tier": 4.0, - "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 800000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, - "info": { - "bracket": "4", - "initialLeverage": "10", - "notionalCap": "800000", - "notionalFloor": "80000", "maintMarginRatio": "0.05", - "cum": "2150.0" + "cum": "725.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "REEF/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 1600000.0, + "minNotional": 200000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "5", - "notionalCap": "1600000", - "notionalFloor": "800000", + "notionalCap": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "42150.0" + "cum": "10725.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "REEF/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 2000000.0, + "minNotional": 400000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1600000", + "notionalCap": "500000", + "notionalFloor": "400000", "maintMarginRatio": "0.125", - "cum": "82150.0" + "cum": "20725.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "REEF/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "2", - "notionalCap": "4000000", - "notionalFloor": "2000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "332150.0" + "cum": "83225.0" } }, { - "tier": 8.0, + "tier": 7.0, + "symbol": "REEF/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "minNotional": 1000000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "8000000", - "notionalFloor": "4000000", + "notionalCap": "1500000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "1332150.0" + "cum": "333225.0" } } ], - "POL/USDT:USDT": [ + "REI/USDT:USDT": [ { "tier": 1.0, + "symbol": "REI/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, + "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "10000", + "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -31960,144 +42752,153 @@ }, { "tier": 2.0, + "symbol": "REI/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 60000.0, + "minNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "60000", - "notionalFloor": "10000", + "notionalCap": "10000", + "notionalFloor": "5000", "maintMarginRatio": "0.015", - "cum": "50.0" + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "REI/USDT:USDT", "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 300000.0, + "minNotional": 10000.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "300000", - "notionalFloor": "60000", + "notionalCap": "20000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "350.0" + "cum": "75.0" } }, { "tier": 4.0, + "symbol": "REI/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 20000.0, + "maxNotional": 40000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "300000", + "notionalCap": "40000", + "notionalFloor": "20000", "maintMarginRatio": "0.025", - "cum": "1850.0" + "cum": "175.0" } }, { "tier": 5.0, + "symbol": "REI/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 3000000.0, + "minNotional": 40000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "3000000", - "notionalFloor": "600000", + "notionalCap": "200000", + "notionalFloor": "40000", "maintMarginRatio": "0.05", - "cum": "16850.0" + "cum": "1175.0" } }, { "tier": 6.0, + "symbol": "REI/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "minNotional": 200000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "166850.0" + "cum": "11175.0" } }, { "tier": 7.0, + "symbol": "REI/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "minNotional": 400000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "7500000", - "notionalFloor": "6000000", + "notionalCap": "500000", + "notionalFloor": "400000", "maintMarginRatio": "0.125", - "cum": "316850.0" + "cum": "21175.0" } }, { "tier": 8.0, + "symbol": "REI/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "1254350.0" + "cum": "83675.0" } }, { "tier": 9.0, + "symbol": "REI/USDT:USDT", "currency": "USDT", - "minNotional": 15000000.0, - "maxNotional": 30000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "15000000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "5004350.0" + "cum": "333675.0" } } ], - "POLYX/USDT:USDT": [ + "REN/USDT:USDT": [ { "tier": 1.0, + "symbol": "REN/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 16.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "16", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.015", @@ -32106,120 +42907,111 @@ }, { "tier": 2.0, + "symbol": "REN/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "25000", + "initialLeverage": "15", + "notionalCap": "50000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 80000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, - "info": { - "bracket": "3", - "initialLeverage": "20", - "notionalCap": "80000", - "notionalFloor": "25000", "maintMarginRatio": "0.025", - "cum": "150.0" + "cum": "50.0" } }, { - "tier": 4.0, + "tier": 3.0, + "symbol": "REN/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 800000.0, + "minNotional": 50000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "10", - "notionalCap": "800000", - "notionalFloor": "80000", + "notionalCap": "600000", + "notionalFloor": "50000", "maintMarginRatio": "0.05", - "cum": "2150.0" + "cum": "1300.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "REN/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 1600000.0, + "minNotional": 600000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "5", - "notionalCap": "1600000", - "notionalFloor": "800000", + "notionalCap": "1000000", + "notionalFloor": "600000", "maintMarginRatio": "0.1", - "cum": "42150.0" + "cum": "31300.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "REN/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 2000000.0, + "minNotional": 1000000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1600000", + "notionalCap": "1500000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "82150.0" + "cum": "56300.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "REN/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, + "minNotional": 1500000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "2", - "notionalCap": "4000000", - "notionalFloor": "2000000", + "notionalCap": "2000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.25", - "cum": "332150.0" + "cum": "243800.0" } }, { - "tier": 8.0, + "tier": 7.0, + "symbol": "REN/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "minNotional": 2000000.0, + "maxNotional": 2100000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "8000000", - "notionalFloor": "4000000", + "notionalCap": "2100000", + "notionalFloor": "2000000", "maintMarginRatio": "0.5", - "cum": "1332150.0" + "cum": "743800.0" } } ], - "POPCAT/USDT:USDT": [ + "RENDER/USDT:USDT": [ { "tier": 1.0, + "symbol": "RENDER/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -32236,15 +43028,16 @@ }, { "tier": 2.0, + "symbol": "RENDER/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 60000.0, + "maxNotional": 40000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "60000", + "notionalCap": "40000", "notionalFloor": "10000", "maintMarginRatio": "0.015", "cum": "50.0" @@ -32252,120 +43045,128 @@ }, { "tier": 3.0, + "symbol": "RENDER/USDT:USDT", "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 300000.0, + "minNotional": 40000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "300000", - "notionalFloor": "60000", + "notionalCap": "200000", + "notionalFloor": "40000", "maintMarginRatio": "0.02", - "cum": "350.0" + "cum": "250.0" } }, { "tier": 4.0, + "symbol": "RENDER/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 200000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "300000", + "notionalCap": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.025", - "cum": "1850.0" + "cum": "1250.0" } }, { "tier": 5.0, + "symbol": "RENDER/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 3000000.0, + "minNotional": 400000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "3000000", - "notionalFloor": "600000", + "notionalCap": "2000000", + "notionalFloor": "400000", "maintMarginRatio": "0.05", - "cum": "16850.0" + "cum": "11250.0" } }, { "tier": 6.0, + "symbol": "RENDER/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "minNotional": 2000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "4000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.1", - "cum": "166850.0" + "cum": "111250.0" } }, { "tier": 7.0, + "symbol": "RENDER/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "minNotional": 4000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "7500000", - "notionalFloor": "6000000", + "notionalCap": "5000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.125", - "cum": "316850.0" + "cum": "211250.0" } }, { "tier": 8.0, + "symbol": "RENDER/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.25", - "cum": "1254350.0" + "cum": "836250.0" } }, { "tier": 9.0, + "symbol": "RENDER/USDT:USDT", "currency": "USDT", - "minNotional": 15000000.0, - "maxNotional": 30000000.0, + "minNotional": 10000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "15000000", + "notionalCap": "20000000", + "notionalFloor": "10000000", "maintMarginRatio": "0.5", - "cum": "5004350.0" + "cum": "3336250.0" } } ], - "PORTAL/USDT:USDT": [ + "REZ/USDT:USDT": [ { "tier": 1.0, + "symbol": "REZ/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -32382,104 +43183,128 @@ }, { "tier": 2.0, + "symbol": "REZ/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "20000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "REZ/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 30000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "2", + "bracket": "3", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "5000", + "notionalCap": "30000", + "notionalFloor": "20000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "125.0" } }, { - "tier": 3.0, + "tier": 4.0, + "symbol": "REZ/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 100000.0, + "minNotional": 30000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "10", - "notionalCap": "100000", - "notionalFloor": "25000", + "notionalCap": "300000", + "notionalFloor": "30000", "maintMarginRatio": "0.05", - "cum": "675.0" + "cum": "875.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "REZ/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 200000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "5", - "notionalCap": "200000", - "notionalFloor": "100000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "5675.0" + "cum": "15875.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "REZ/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 600000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "750000", + "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "10675.0" + "cum": "30875.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "REZ/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "73175.0" + "cum": "124625.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "REZ/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "323175.0" + "cum": "499625.0" } } ], - "POWR/USDT:USDT": [ + "RIF/USDT:USDT": [ { "tier": 1.0, + "symbol": "RIF/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -32496,6 +43321,7 @@ }, { "tier": 2.0, + "symbol": "RIF/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -32512,6 +43338,7 @@ }, { "tier": 3.0, + "symbol": "RIF/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 100000.0, @@ -32528,6 +43355,7 @@ }, { "tier": 4.0, + "symbol": "RIF/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 200000.0, @@ -32544,6 +43372,7 @@ }, { "tier": 5.0, + "symbol": "RIF/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, @@ -32560,6 +43389,7 @@ }, { "tier": 6.0, + "symbol": "RIF/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -32576,6 +43406,7 @@ }, { "tier": 7.0, + "symbol": "RIF/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -32591,351 +43422,407 @@ } } ], - "PYTH/USDT:USDT": [ + "RLC/USDT:USDT": [ { "tier": 1.0, + "symbol": "RLC/USDT:USDT", "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" } }, { "tier": 2.0, + "symbol": "RLC/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "25000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.025", "cum": "25.0" } }, { "tier": 3.0, + "symbol": "RLC/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 80000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, - "info": { - "bracket": "3", - "initialLeverage": "20", - "notionalCap": "80000", - "notionalFloor": "25000", - "maintMarginRatio": "0.025", - "cum": "150.0" - } - }, - { - "tier": 4.0, - "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 800000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "10", - "notionalCap": "800000", - "notionalFloor": "80000", + "notionalCap": "600000", + "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "2150.0" + "cum": "650.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "RLC/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, + "minNotional": 600000.0, "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "5", "notionalCap": "1600000", - "notionalFloor": "800000", + "notionalFloor": "600000", "maintMarginRatio": "0.1", - "cum": "42150.0" + "cum": "30650.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "RLC/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "2000000", "notionalFloor": "1600000", "maintMarginRatio": "0.125", - "cum": "82150.0" + "cum": "70650.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "RLC/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, - "maxNotional": 4000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "2", - "notionalCap": "4000000", + "notionalCap": "6000000", "notionalFloor": "2000000", "maintMarginRatio": "0.25", - "cum": "332150.0" + "cum": "320650.0" } }, { - "tier": 8.0, + "tier": 7.0, + "symbol": "RLC/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "minNotional": 6000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "8000000", - "notionalFloor": "4000000", + "notionalCap": "10000000", + "notionalFloor": "6000000", "maintMarginRatio": "0.5", - "cum": "1332150.0" + "cum": "1820650.0" } } ], - "QNT/USDT:USDT": [ + "RONIN/USDT:USDT": [ { "tier": 1.0, + "symbol": "RONIN/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "20", + "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "RONIN/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "10", + "initialLeverage": "20", "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "75.0" + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "RONIN/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "8", + "initialLeverage": "10", "notionalCap": "100000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "700.0" + "cum": "675.0" } }, { "tier": 4.0, + "symbol": "RONIN/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, - "maxNotional": 250000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "4", "initialLeverage": "5", - "notionalCap": "250000", + "notionalCap": "200000", "notionalFloor": "100000", "maintMarginRatio": "0.1", - "cum": "5700.0" + "cum": "5675.0" } }, { "tier": 5.0, + "symbol": "RONIN/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 1000000.0, + "minNotional": 200000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 2.0, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "250000", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "200000", "maintMarginRatio": "0.125", - "cum": "11950.0" + "cum": "10675.0" } }, { "tier": 6.0, + "symbol": "RONIN/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.25", + "cum": "73175.0" + } + }, + { + "tier": 7.0, + "symbol": "RONIN/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 5000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "5000000", + "notionalCap": "2000000", "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "386950.0" + "cum": "323175.0" } } ], - "QTUM/USDT:USDT": [ + "ROSE/USDT:USDT": [ { "tier": 1.0, + "symbol": "ROSE/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "ROSE/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "ROSE/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "ROSE/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "2", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "5000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "325.0" } }, { - "tier": 3.0, + "tier": 5.0, + "symbol": "ROSE/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.05", - "cum": "675.0" + "cum": "2825.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "ROSE/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "10675.0" + "cum": "27825.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "ROSE/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "1250000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "23175.0" + "cum": "52825.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "ROSE/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, + "minNotional": 1250000.0, "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalFloor": "1250000", "maintMarginRatio": "0.25", - "cum": "148175.0" + "cum": "209075.0" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "ROSE/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", "notionalCap": "5000000", "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "898175.0" + "cum": "959075.0" } } ], - "QUICK/USDT:USDT": [ + "RPL/USDT:USDT": [ { "tier": 1.0, + "symbol": "RPL/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -32952,6 +43839,7 @@ }, { "tier": 2.0, + "symbol": "RPL/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -32968,6 +43856,7 @@ }, { "tier": 3.0, + "symbol": "RPL/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 20000.0, @@ -32984,6 +43873,7 @@ }, { "tier": 4.0, + "symbol": "RPL/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 40000.0, @@ -33000,6 +43890,7 @@ }, { "tier": 5.0, + "symbol": "RPL/USDT:USDT", "currency": "USDT", "minNotional": 40000.0, "maxNotional": 200000.0, @@ -33016,6 +43907,7 @@ }, { "tier": 6.0, + "symbol": "RPL/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 400000.0, @@ -33032,6 +43924,7 @@ }, { "tier": 7.0, + "symbol": "RPL/USDT:USDT", "currency": "USDT", "minNotional": 400000.0, "maxNotional": 500000.0, @@ -33048,6 +43941,7 @@ }, { "tier": 8.0, + "symbol": "RPL/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -33064,6 +43958,7 @@ }, { "tier": 9.0, + "symbol": "RPL/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -33079,123 +43974,165 @@ } } ], - "RAD/USDT:USDT": [ + "RSR/USDT:USDT": [ { "tier": 1.0, + "symbol": "RSR/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "20", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "RSR/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "15", - "notionalCap": "25000", + "initialLeverage": "50", + "notionalCap": "10000", "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "RSR/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "RSR/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "25.0" + "cum": "325.0" } }, { - "tier": 3.0, + "tier": 5.0, + "symbol": "RSR/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "2825.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "RSR/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "10650.0" + "cum": "27825.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "RSR/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "1250000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "23150.0" + "cum": "52825.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "RSR/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, + "minNotional": 1250000.0, "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalFloor": "1250000", "maintMarginRatio": "0.25", - "cum": "148150.0" + "cum": "209075.0" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "RSR/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, - "maxNotional": 3500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "3500000", + "notionalCap": "5000000", "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "898150.0" + "cum": "959075.0" } } ], - "RARE/USDT:USDT": [ + "RUNE/USDT:USDT": [ { "tier": 1.0, + "symbol": "RUNE/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -33212,6 +44149,7 @@ }, { "tier": 2.0, + "symbol": "RUNE/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 30000.0, @@ -33228,6 +44166,7 @@ }, { "tier": 3.0, + "symbol": "RUNE/USDT:USDT", "currency": "USDT", "minNotional": 30000.0, "maxNotional": 150000.0, @@ -33244,6 +44183,7 @@ }, { "tier": 4.0, + "symbol": "RUNE/USDT:USDT", "currency": "USDT", "minNotional": 150000.0, "maxNotional": 300000.0, @@ -33260,6 +44200,7 @@ }, { "tier": 5.0, + "symbol": "RUNE/USDT:USDT", "currency": "USDT", "minNotional": 300000.0, "maxNotional": 1500000.0, @@ -33276,6 +44217,7 @@ }, { "tier": 6.0, + "symbol": "RUNE/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, "maxNotional": 3000000.0, @@ -33292,6 +44234,7 @@ }, { "tier": 7.0, + "symbol": "RUNE/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 3750000.0, @@ -33308,6 +44251,7 @@ }, { "tier": 8.0, + "symbol": "RUNE/USDT:USDT", "currency": "USDT", "minNotional": 3750000.0, "maxNotional": 7500000.0, @@ -33324,6 +44268,7 @@ }, { "tier": 9.0, + "symbol": "RUNE/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, "maxNotional": 15000000.0, @@ -33339,107 +44284,303 @@ } } ], - "RAY/USDT:USDT": [ + "RVN/USDT:USDT": [ { "tier": 1.0, + "symbol": "RVN/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "RVN/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "20000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "RVN/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "2", + "bracket": "3", "initialLeverage": "20", "notionalCap": "25000", - "notionalFloor": "5000", + "notionalFloor": "20000", "maintMarginRatio": "0.025", - "cum": "75.0" + "cum": "125.0" } }, { - "tier": 3.0, + "tier": 4.0, + "symbol": "RVN/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "10", - "notionalCap": "100000", + "notionalCap": "200000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "700.0" + "cum": "750.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "RVN/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 250000.0, + "minNotional": 200000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "5", - "notionalCap": "250000", - "notionalFloor": "100000", + "notionalCap": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "5700.0" + "cum": "10750.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "RVN/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 1000000.0, + "minNotional": 400000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "400000", + "maintMarginRatio": "0.125", + "cum": "20750.0" + } + }, + { + "tier": 7.0, + "symbol": "RVN/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "2", "notionalCap": "1000000", - "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "11950.0" + "notionalFloor": "500000", + "maintMarginRatio": "0.25", + "cum": "83250.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "RVN/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 5000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "5000000", + "notionalCap": "2000000", "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "386950.0" + "cum": "333250.0" } } ], - "RDNT/USDT:USDT": [ + "SAFE/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "SAFE/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "SAFE/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "SAFE/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "SAFE/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "SAFE/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "SAFE/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "16725.0" + } + }, + { + "tier": 7.0, + "symbol": "SAFE/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "SAFE/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "125475.0" + } + }, + { + "tier": 9.0, + "symbol": "SAFE/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "500475.0" + } + } + ], + "SAGA/USDT:USDT": [ { "tier": 1.0, + "symbol": "SAGA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -33456,15 +44597,16 @@ }, { "tier": 2.0, + "symbol": "SAGA/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 30000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "20000", + "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.015", "cum": "50.0" @@ -33472,234 +44614,300 @@ }, { "tier": 3.0, + "symbol": "SAGA/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 100000.0, + "minNotional": 30000.0, + "maxNotional": 150000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "100000", - "notionalFloor": "20000", + "notionalCap": "150000", + "notionalFloor": "30000", "maintMarginRatio": "0.02", - "cum": "150.0" + "cum": "200.0" } }, { "tier": 4.0, + "symbol": "SAGA/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 200000.0, + "minNotional": 150000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "200000", - "notionalFloor": "100000", + "notionalCap": "300000", + "notionalFloor": "150000", "maintMarginRatio": "0.025", - "cum": "650.0" + "cum": "950.0" } }, { "tier": 5.0, + "symbol": "SAGA/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 1000000.0, + "minNotional": 300000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "1000000", - "notionalFloor": "200000", + "notionalCap": "1500000", + "notionalFloor": "300000", "maintMarginRatio": "0.05", - "cum": "5650.0" + "cum": "8450.0" } }, { "tier": 6.0, + "symbol": "SAGA/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.1", - "cum": "55650.0" + "cum": "83450.0" } }, { "tier": 7.0, + "symbol": "SAGA/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 2500000.0, + "minNotional": 3000000.0, + "maxNotional": 3750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "2500000", - "notionalFloor": "2000000", + "notionalCap": "3750000", + "notionalFloor": "3000000", "maintMarginRatio": "0.125", - "cum": "105650.0" + "cum": "158450.0" } }, { "tier": 8.0, + "symbol": "SAGA/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 6000000.0, + "minNotional": 3750000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "6000000", - "notionalFloor": "2500000", + "notionalCap": "7500000", + "notionalFloor": "3750000", "maintMarginRatio": "0.25", - "cum": "418150.0" + "cum": "627200.0" } }, { "tier": 9.0, + "symbol": "SAGA/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 10000000.0, + "minNotional": 7500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalCap": "15000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "1918150.0" + "cum": "2502200.0" } } ], - "REEF/USDT:USDT": [ + "SAND/USDT:USDT": [ { "tier": 1.0, + "symbol": "SAND/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 10.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.006, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "10", - "notionalCap": "20000", + "initialLeverage": "75", + "notionalCap": "25000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.006", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "SAND/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "8", - "notionalCap": "25000", - "notionalFloor": "20000", - "maintMarginRatio": "0.025", + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "25000", + "maintMarginRatio": "0.01", "cum": "100.0" } }, { "tier": 3.0, + "symbol": "SAND/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, + "minNotional": 50000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 40.0, "info": { "bracket": "3", - "initialLeverage": "6", - "notionalCap": "200000", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "725.0" + "initialLeverage": "40", + "notionalCap": "80000", + "notionalFloor": "50000", + "maintMarginRatio": "0.015", + "cum": "350.0" } }, { "tier": 4.0, + "symbol": "SAND/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 80000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "4", + "initialLeverage": "25", + "notionalCap": "300000", + "notionalFloor": "80000", + "maintMarginRatio": "0.02", + "cum": "750.0" + } + }, + { + "tier": 5.0, + "symbol": "SAND/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "5", + "initialLeverage": "20", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.025", + "cum": "2250.0" + } + }, + { + "tier": 6.0, + "symbol": "SAND/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "6", + "initialLeverage": "10", + "notionalCap": "3000000", + "notionalFloor": "600000", + "maintMarginRatio": "0.05", + "cum": "17250.0" + } + }, + { + "tier": 7.0, + "symbol": "SAND/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "7", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "6000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.1", - "cum": "10725.0" + "cum": "167250.0" } }, { - "tier": 5.0, + "tier": 8.0, + "symbol": "SAND/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 6000000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "8", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "7500000", + "notionalFloor": "6000000", "maintMarginRatio": "0.125", - "cum": "20725.0" + "cum": "317250.0" } }, { - "tier": 6.0, + "tier": 9.0, + "symbol": "SAND/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 7500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "9", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "15000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.25", - "cum": "83225.0" + "cum": "1254750.0" } }, { - "tier": 7.0, + "tier": 10.0, + "symbol": "SAND/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 1500000.0, + "minNotional": 15000000.0, + "maxNotional": 30000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "1500000", - "notionalFloor": "1000000", + "notionalCap": "30000000", + "notionalFloor": "15000000", "maintMarginRatio": "0.5", - "cum": "333225.0" + "cum": "5004750.0" } } ], - "REI/USDT:USDT": [ + "SANTOS/USDT:USDT": [ { "tier": 1.0, + "symbol": "SANTOS/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -33716,6 +44924,7 @@ }, { "tier": 2.0, + "symbol": "SANTOS/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -33732,15 +44941,16 @@ }, { "tier": 3.0, + "symbol": "SANTOS/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "20000", + "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -33748,218 +44958,215 @@ }, { "tier": 4.0, + "symbol": "SANTOS/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 40000.0, + "minNotional": 30000.0, + "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "40000", - "notionalFloor": "20000", + "notionalCap": "60000", + "notionalFloor": "30000", "maintMarginRatio": "0.025", - "cum": "175.0" + "cum": "225.0" } }, { "tier": 5.0, + "symbol": "SANTOS/USDT:USDT", "currency": "USDT", - "minNotional": 40000.0, - "maxNotional": 200000.0, + "minNotional": 60000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "40000", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.05", - "cum": "1175.0" + "cum": "1725.0" } }, { "tier": 6.0, + "symbol": "SANTOS/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "11175.0" + "cum": "16725.0" } }, { "tier": 7.0, + "symbol": "SANTOS/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 600000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "750000", + "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "21175.0" + "cum": "31725.0" } }, { "tier": 8.0, + "symbol": "SANTOS/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "83675.0" + "cum": "125475.0" } }, { "tier": 9.0, + "symbol": "SANTOS/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "333675.0" + "cum": "500475.0" } } ], - "REN/USDT:USDT": [ + "SC/USDT:USDT": [ { "tier": 1.0, + "symbol": "SC/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, + "maintenanceMarginRate": 0.01, "maxLeverage": 50.0, "info": { "bracket": "1", "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "SC/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 50000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "2", "initialLeverage": "20", - "notionalCap": "50000", + "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "75.0" } }, { "tier": 3.0, + "symbol": "SC/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 600000.0, + "minNotional": 25000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "600000", - "notionalFloor": "50000", + "notionalCap": "100000", + "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "1300.0" + "cum": "700.0" } }, { "tier": 4.0, + "symbol": "SC/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 1600000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "4", "initialLeverage": "5", - "notionalCap": "1600000", - "notionalFloor": "600000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1", - "cum": "31300.0" + "cum": "5700.0" } }, { "tier": 5.0, + "symbol": "SC/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 2000000.0, + "minNotional": 250000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1600000", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "250000", "maintMarginRatio": "0.125", - "cum": "71300.0" + "cum": "11950.0" } }, { "tier": 6.0, + "symbol": "SC/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 6000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "6", - "initialLeverage": "2", - "notionalCap": "6000000", - "notionalFloor": "2000000", - "maintMarginRatio": "0.25", - "cum": "321300.0" - } - }, - { - "tier": 7.0, - "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 10000000.0, + "minNotional": 1000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalCap": "5000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "1821300.0" + "cum": "386950.0" } } ], - "RENDER/USDT:USDT": [ + "SCR/USDT:USDT": [ { "tier": 1.0, + "symbol": "SCR/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -33976,6 +45183,7 @@ }, { "tier": 2.0, + "symbol": "SCR/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 16000.0, @@ -33992,6 +45200,7 @@ }, { "tier": 3.0, + "symbol": "SCR/USDT:USDT", "currency": "USDT", "minNotional": 16000.0, "maxNotional": 80000.0, @@ -34008,6 +45217,7 @@ }, { "tier": 4.0, + "symbol": "SCR/USDT:USDT", "currency": "USDT", "minNotional": 80000.0, "maxNotional": 160000.0, @@ -34024,6 +45234,7 @@ }, { "tier": 5.0, + "symbol": "SCR/USDT:USDT", "currency": "USDT", "minNotional": 160000.0, "maxNotional": 800000.0, @@ -34040,6 +45251,7 @@ }, { "tier": 6.0, + "symbol": "SCR/USDT:USDT", "currency": "USDT", "minNotional": 800000.0, "maxNotional": 1600000.0, @@ -34056,6 +45268,7 @@ }, { "tier": 7.0, + "symbol": "SCR/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, "maxNotional": 2000000.0, @@ -34072,6 +45285,7 @@ }, { "tier": 8.0, + "symbol": "SCR/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 4000000.0, @@ -34088,6 +45302,7 @@ }, { "tier": 9.0, + "symbol": "SCR/USDT:USDT", "currency": "USDT", "minNotional": 4000000.0, "maxNotional": 8000000.0, @@ -34103,401 +45318,356 @@ } } ], - "REZ/USDT:USDT": [ + "SCRT/USDT:USDT": [ { "tier": 1.0, + "symbol": "SCRT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "SCRT/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "20000", + "initialLeverage": "50", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.015", "cum": "25.0" } }, { "tier": 3.0, + "symbol": "SCRT/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, + "minNotional": 10000.0, "maxNotional": 30000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "20", + "initialLeverage": "25", "notionalCap": "30000", - "notionalFloor": "20000", - "maintMarginRatio": "0.025", - "cum": "125.0" + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" } }, { "tier": 4.0, + "symbol": "SCRT/USDT:USDT", "currency": "USDT", "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "SCRT/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "10", "notionalCap": "300000", - "notionalFloor": "30000", + "notionalFloor": "60000", "maintMarginRatio": "0.05", - "cum": "875.0" + "cum": "1725.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "SCRT/USDT:USDT", "currency": "USDT", "minNotional": 300000.0, "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", "notionalCap": "600000", "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "15875.0" + "cum": "16725.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "SCRT/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", "notionalCap": "750000", "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "30875.0" + "cum": "31725.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "SCRT/USDT:USDT", "currency": "USDT", "minNotional": 750000.0, "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", "notionalCap": "1500000", "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "124625.0" + "cum": "125475.0" } }, { - "tier": 8.0, + "tier": 9.0, + "symbol": "SCRT/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", "notionalCap": "3000000", "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "499625.0" + "cum": "500475.0" } } ], - "RIF/USDT:USDT": [ + "SEI/USDT:USDT": [ { "tier": 1.0, + "symbol": "SEI/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 10000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", + "initialLeverage": "50", + "notionalCap": "100000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", "cum": "50.0" } }, { "tier": 3.0, - "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, - "info": { - "bracket": "3", - "initialLeverage": "10", - "notionalCap": "100000", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "675.0" - } - }, - { - "tier": 4.0, + "symbol": "SEI/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, - "maxNotional": 200000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "4", - "initialLeverage": "5", - "notionalCap": "200000", - "notionalFloor": "100000", - "maintMarginRatio": "0.1", - "cum": "5675.0" - } - }, - { - "tier": 5.0, - "currency": "USDT", - "minNotional": 200000.0, "maxNotional": 500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "5", - "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "200000", - "maintMarginRatio": "0.125", - "cum": "10675.0" - } - }, - { - "tier": 6.0, - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "6", - "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "73175.0" - } - }, - { - "tier": 7.0, - "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, - "maintenanceMarginRate": 0.5, - "maxLeverage": 1.0, - "info": { - "bracket": "7", - "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", - "maintMarginRatio": "0.5", - "cum": "323175.0" - } - } - ], - "RLC/USDT:USDT": [ - { - "tier": 1.0, - "currency": "USDT", - "minNotional": 0.0, - "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "1", + "bracket": "3", "initialLeverage": "25", - "notionalCap": "5000", - "notionalFloor": "0", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.02", - "cum": "0.0" + "cum": "550.0" } }, { - "tier": 2.0, + "tier": 4.0, + "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "2", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "5000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.025", - "cum": "25.0" + "cum": "3050.0" } }, { - "tier": 3.0, + "tier": 5.0, + "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 600000.0, + "minNotional": 1000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "600000", - "notionalFloor": "25000", + "notionalCap": "5000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "28050.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 1600000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "1600000", - "notionalFloor": "600000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.1", - "cum": "30650.0" + "cum": "278050.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 2000000.0, + "minNotional": 10000000.0, + "maxNotional": 12500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1600000", + "notionalCap": "12500000", + "notionalFloor": "10000000", "maintMarginRatio": "0.125", - "cum": "70650.0" + "cum": "528050.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 6000000.0, + "minNotional": 12500000.0, + "maxNotional": 25000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "6000000", - "notionalFloor": "2000000", + "notionalCap": "25000000", + "notionalFloor": "12500000", "maintMarginRatio": "0.25", - "cum": "320650.0" + "cum": "2090550.0" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 10000000.0, + "minNotional": 25000000.0, + "maxNotional": 50000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalCap": "50000000", + "notionalFloor": "25000000", "maintMarginRatio": "0.5", - "cum": "1820650.0" + "cum": "8340550.0" } } ], - "RONIN/USDT:USDT": [ + "SFP/USDT:USDT": [ { "tier": 1.0, + "symbol": "SFP/USDT:USDT", "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" } }, { "tier": 2.0, + "symbol": "SFP/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, + "maxNotional": 15000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "2", "initialLeverage": "20", - "notionalCap": "25000", + "notionalCap": "15000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "SFP/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, + "minNotional": 15000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, @@ -34505,87 +45675,75 @@ "bracket": "3", "initialLeverage": "10", "notionalCap": "100000", - "notionalFloor": "25000", + "notionalFloor": "15000", "maintMarginRatio": "0.05", - "cum": "675.0" + "cum": "400.0" } }, { "tier": 4.0, + "symbol": "SFP/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, - "maxNotional": 200000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "4", "initialLeverage": "5", - "notionalCap": "200000", + "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1", - "cum": "5675.0" + "cum": "5400.0" } }, { "tier": 5.0, + "symbol": "SFP/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 250000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "200000", + "initialLeverage": "2", + "notionalCap": "3000000", + "notionalFloor": "250000", "maintMarginRatio": "0.125", - "cum": "10675.0" + "cum": "11650.0" } }, { "tier": 6.0, + "symbol": "SFP/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "6", - "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "73175.0" - } - }, - { - "tier": 7.0, - "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 3000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", - "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "bracket": "6", + "initialLeverage": "1", + "notionalCap": "8000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "323175.0" + "cum": "1136650.0" } } ], - "ROSE/USDT:USDT": [ + "SKL/USDT:USDT": [ { "tier": 1.0, + "symbol": "SKL/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -34594,104 +45752,145 @@ }, { "tier": 2.0, + "symbol": "SKL/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "SKL/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "SKL/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "2", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "5000", + "notionalCap": "60000", + "notionalFloor": "30000", "maintMarginRatio": "0.025", - "cum": "75.0" + "cum": "225.0" } }, { - "tier": 3.0, + "tier": 5.0, + "symbol": "SKL/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 60000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.05", - "cum": "700.0" + "cum": "1725.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "SKL/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "10700.0" + "cum": "16725.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "SKL/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, + "minNotional": 600000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "4", "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "23200.0" + "cum": "31725.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "SKL/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "3000000", + "notionalCap": "1500000", "notionalFloor": "1000000", "maintMarginRatio": "0.25", - "cum": "148200.0" + "cum": "156725.0" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "SKL/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 5000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "3000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "898200.0" + "cum": "531725.0" } } ], - "RPL/USDT:USDT": [ + "SLERF/USDT:USDT": [ { "tier": 1.0, + "symbol": "SLERF/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -34708,6 +45907,7 @@ }, { "tier": 2.0, + "symbol": "SLERF/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -34724,15 +45924,16 @@ }, { "tier": 3.0, + "symbol": "SLERF/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "20000", + "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -34740,120 +45941,128 @@ }, { "tier": 4.0, + "symbol": "SLERF/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 40000.0, + "minNotional": 30000.0, + "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "40000", - "notionalFloor": "20000", + "notionalCap": "60000", + "notionalFloor": "30000", "maintMarginRatio": "0.025", - "cum": "175.0" + "cum": "225.0" } }, { "tier": 5.0, + "symbol": "SLERF/USDT:USDT", "currency": "USDT", - "minNotional": 40000.0, - "maxNotional": 200000.0, + "minNotional": 60000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "40000", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.05", - "cum": "1175.0" + "cum": "1725.0" } }, { "tier": 6.0, + "symbol": "SLERF/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "11175.0" + "cum": "16725.0" } }, { "tier": 7.0, + "symbol": "SLERF/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 600000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "750000", + "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "21175.0" + "cum": "31725.0" } }, { "tier": 8.0, + "symbol": "SLERF/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "83675.0" + "cum": "125475.0" } }, { "tier": 9.0, + "symbol": "SLERF/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "333675.0" + "cum": "500475.0" } } ], - "RSR/USDT:USDT": [ + "SLP/USDT:USDT": [ { "tier": 1.0, + "symbol": "SLP/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 21.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "21", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "SLP/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -34865,239 +46074,220 @@ "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "25.0" + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "SLP/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 300000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "300000", + "notionalCap": "100000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "675.0" } }, { "tier": 4.0, + "symbol": "SLP/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 800000.0, + "minNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "4", "initialLeverage": "5", - "notionalCap": "800000", - "notionalFloor": "300000", + "notionalCap": "200000", + "notionalFloor": "100000", "maintMarginRatio": "0.1", - "cum": "15650.0" + "cum": "5675.0" } }, { "tier": 5.0, + "symbol": "SLP/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 1000000.0, + "minNotional": 200000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "800000", + "notionalCap": "500000", + "notionalFloor": "200000", "maintMarginRatio": "0.125", - "cum": "35650.0" + "cum": "10675.0" } }, { "tier": 6.0, + "symbol": "SLP/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "6", "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "160650.0" + "cum": "73175.0" } }, { "tier": 7.0, + "symbol": "SLP/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 5000000.0, + "minNotional": 1000000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "7", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "3000000", + "notionalCap": "1500000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "910650.0" + "cum": "323175.0" } } ], - "RUNE/USDT:USDT": [ + "SNT/USDT:USDT": [ { "tier": 1.0, + "symbol": "SNT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 21.0, "info": { "bracket": "1", - "initialLeverage": "75", - "notionalCap": "10000", + "initialLeverage": "21", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "SNT/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.015", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", "cum": "50.0" } }, { "tier": 3.0, + "symbol": "SNT/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, + "minNotional": 25000.0, "maxNotional": 100000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "100000", - "notionalFloor": "20000", - "maintMarginRatio": "0.02", - "cum": "150.0" + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "675.0" } }, { "tier": 4.0, + "symbol": "SNT/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 200000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "5", "notionalCap": "200000", "notionalFloor": "100000", - "maintMarginRatio": "0.025", - "cum": "650.0" + "maintMarginRatio": "0.1", + "cum": "5675.0" } }, { "tier": 5.0, + "symbol": "SNT/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, - "info": { - "bracket": "5", - "initialLeverage": "10", - "notionalCap": "1000000", - "notionalFloor": "200000", - "maintMarginRatio": "0.05", - "cum": "5650.0" - } - }, - { - "tier": 6.0, - "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "6", - "initialLeverage": "5", - "notionalCap": "2000000", - "notionalFloor": "1000000", - "maintMarginRatio": "0.1", - "cum": "55650.0" - } - }, - { - "tier": 7.0, - "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 2500000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "4", - "notionalCap": "2500000", - "notionalFloor": "2000000", + "notionalCap": "500000", + "notionalFloor": "200000", "maintMarginRatio": "0.125", - "cum": "105650.0" + "cum": "10675.0" } }, { - "tier": 8.0, + "tier": 6.0, + "symbol": "SNT/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "2", - "notionalCap": "5000000", - "notionalFloor": "2500000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "418150.0" + "cum": "73175.0" } }, { - "tier": 9.0, + "tier": 7.0, + "symbol": "SNT/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "1668150.0" + "cum": "323175.0" } } ], - "RVN/USDT:USDT": [ + "SNX/USDT:USDT": [ { "tier": 1.0, + "symbol": "SNX/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -35114,510 +46304,610 @@ }, { "tier": 2.0, + "symbol": "SNX/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, - "info": { - "bracket": "2", - "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "2", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "20000", + "notionalCap": "50000", + "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "125.0" + "cum": "50.0" } }, { - "tier": 4.0, + "tier": 3.0, + "symbol": "SNX/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 50000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "400000", + "notionalFloor": "50000", "maintMarginRatio": "0.05", - "cum": "750.0" + "cum": "1300.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "SNX/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 400000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "1000000", + "notionalFloor": "400000", "maintMarginRatio": "0.1", - "cum": "10750.0" + "cum": "21300.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "SNX/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "20750.0" + "cum": "46300.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "SNX/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 2000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "6000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.25", - "cum": "83250.0" + "cum": "296300.0" } }, { - "tier": 8.0, + "tier": 7.0, + "symbol": "SNX/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 6000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "10000000", + "notionalFloor": "6000000", "maintMarginRatio": "0.5", - "cum": "333250.0" + "cum": "1796300.0" } } ], - "SAGA/USDT:USDT": [ + "SOL/USDC:USDC": [ { "tier": 1.0, - "currency": "USDT", + "symbol": "SOL/USDC:USDC", + "currency": "USDC", "minNotional": 0.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maintenanceMarginRate": 0.005, + "maxLeverage": 100.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "100", "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.005", "cum": "0.0" } }, { "tier": 2.0, - "currency": "USDT", + "symbol": "SOL/USDC:USDC", + "currency": "USDC", "minNotional": 10000.0, - "maxNotional": 30000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.0065, + "maxLeverage": 75.0, "info": { "bracket": "2", - "initialLeverage": "50", - "notionalCap": "30000", + "initialLeverage": "75", + "notionalCap": "50000", "notionalFloor": "10000", - "maintMarginRatio": "0.015", - "cum": "50.0" + "maintMarginRatio": "0.0065", + "cum": "15.0" + } + }, + { + "tier": 3.0, + "symbol": "SOL/USDC:USDC", + "currency": "USDC", + "minNotional": 50000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, + "info": { + "bracket": "3", + "initialLeverage": "50", + "notionalCap": "200000", + "notionalFloor": "50000", + "maintMarginRatio": "0.01", + "cum": "190.0" + } + }, + { + "tier": 4.0, + "symbol": "SOL/USDC:USDC", + "currency": "USDC", + "minNotional": 200000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.012, + "maxLeverage": 40.0, + "info": { + "bracket": "4", + "initialLeverage": "40", + "notionalCap": "500000", + "notionalFloor": "200000", + "maintMarginRatio": "0.012", + "cum": "590.0" } }, { - "tier": 3.0, - "currency": "USDT", - "minNotional": 30000.0, - "maxNotional": 150000.0, + "tier": 5.0, + "symbol": "SOL/USDC:USDC", + "currency": "USDC", + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "25", - "notionalCap": "150000", - "notionalFloor": "30000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.02", - "cum": "200.0" + "cum": "4590.0" } }, { - "tier": 4.0, - "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 300000.0, + "tier": 6.0, + "symbol": "SOL/USDC:USDC", + "currency": "USDC", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "20", - "notionalCap": "300000", - "notionalFloor": "150000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.025", - "cum": "950.0" + "cum": "9590.0" } }, { - "tier": 5.0, - "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 1500000.0, + "tier": 7.0, + "symbol": "SOL/USDC:USDC", + "currency": "USDC", + "minNotional": 2000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "10", - "notionalCap": "1500000", - "notionalFloor": "300000", + "notionalCap": "5000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.05", - "cum": "8450.0" + "cum": "59590.0" } }, { - "tier": 6.0, - "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "tier": 8.0, + "symbol": "SOL/USDC:USDC", + "currency": "USDC", + "minNotional": 5000000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "15000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.1", - "cum": "83450.0" + "cum": "309590.0" } }, { - "tier": 7.0, - "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3750000.0, + "tier": 9.0, + "symbol": "SOL/USDC:USDC", + "currency": "USDC", + "minNotional": 15000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "4", - "notionalCap": "3750000", - "notionalFloor": "3000000", + "notionalCap": "20000000", + "notionalFloor": "15000000", "maintMarginRatio": "0.125", - "cum": "158450.0" + "cum": "684590.0" } }, { - "tier": 8.0, - "currency": "USDT", - "minNotional": 3750000.0, - "maxNotional": 7500000.0, + "tier": 10.0, + "symbol": "SOL/USDC:USDC", + "currency": "USDC", + "minNotional": 20000000.0, + "maxNotional": 50000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "10", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "3750000", + "notionalCap": "50000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.25", - "cum": "627200.0" + "cum": "3184590.0" } }, { - "tier": 9.0, - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "tier": 11.0, + "symbol": "SOL/USDC:USDC", + "currency": "USDC", + "minNotional": 50000000.0, + "maxNotional": 100000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "11", "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "100000000", + "notionalFloor": "50000000", "maintMarginRatio": "0.5", - "cum": "2502200.0" + "cum": "15684590.0" } } ], - "SAND/USDT:USDT": [ + "SOL/USDT:USDT": [ { "tier": 1.0, + "symbol": "SOL/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.006, - "maxLeverage": 50.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.005, + "maxLeverage": 100.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "100", + "notionalCap": "20000", "notionalFloor": "0", - "maintMarginRatio": "0.006", + "maintMarginRatio": "0.005", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "SOL/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.007, - "maxLeverage": 40.0, + "minNotional": 20000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.0065, + "maxLeverage": 75.0, "info": { "bracket": "2", - "initialLeverage": "40", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.007", - "cum": "5.0" + "initialLeverage": "75", + "notionalCap": "100000", + "notionalFloor": "20000", + "maintMarginRatio": "0.0065", + "cum": "30.0" } }, { "tier": 3.0, + "symbol": "SOL/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, + "minNotional": 100000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maxLeverage": 50.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "50000", - "notionalFloor": "25000", + "initialLeverage": "50", + "notionalCap": "800000", + "notionalFloor": "100000", "maintMarginRatio": "0.01", - "cum": "80.0" + "cum": "380.0" } }, { "tier": 4.0, + "symbol": "SOL/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 400000.0, + "minNotional": 800000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "4", + "initialLeverage": "25", + "notionalCap": "4000000", + "notionalFloor": "800000", + "maintMarginRatio": "0.02", + "cum": "8380.0" + } + }, + { + "tier": 5.0, + "symbol": "SOL/USDT:USDT", + "currency": "USDT", + "minNotional": 4000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "20", - "notionalCap": "400000", - "notionalFloor": "50000", + "notionalCap": "8000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.025", - "cum": "830.0" + "cum": "28380.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "SOL/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 800000.0, + "minNotional": 8000000.0, + "maxNotional": 40000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "10", - "notionalCap": "800000", - "notionalFloor": "400000", + "notionalCap": "40000000", + "notionalFloor": "8000000", "maintMarginRatio": "0.05", - "cum": "10830.0" + "cum": "228380.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "SOL/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 2000000.0, + "minNotional": 40000000.0, + "maxNotional": 80000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "5", - "notionalCap": "2000000", - "notionalFloor": "800000", + "notionalCap": "80000000", + "notionalFloor": "40000000", "maintMarginRatio": "0.1", - "cum": "50830.0" + "cum": "2228380.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "SOL/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 5000000.0, + "minNotional": 80000000.0, + "maxNotional": 100000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "4", - "notionalCap": "5000000", - "notionalFloor": "2000000", + "notionalCap": "100000000", + "notionalFloor": "80000000", "maintMarginRatio": "0.125", - "cum": "100830.0" + "cum": "4228380.0" } }, { - "tier": 8.0, + "tier": 9.0, + "symbol": "SOL/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 12000000.0, + "minNotional": 100000000.0, + "maxNotional": 200000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "2", - "notionalCap": "12000000", - "notionalFloor": "5000000", + "notionalCap": "200000000", + "notionalFloor": "100000000", "maintMarginRatio": "0.25", - "cum": "725830.0" + "cum": "16728380.0" } }, { - "tier": 9.0, + "tier": 10.0, + "symbol": "SOL/USDT:USDT", "currency": "USDT", - "minNotional": 12000000.0, - "maxNotional": 20000000.0, + "minNotional": 200000000.0, + "maxNotional": 400000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "20000000", - "notionalFloor": "12000000", + "notionalCap": "400000000", + "notionalFloor": "200000000", "maintMarginRatio": "0.5", - "cum": "3725830.0" + "cum": "66728380.0" } } ], - "SC/USDT:USDT": [ + "SPELL/USDT:USDT": [ { "tier": 1.0, + "symbol": "SPELL/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.01, + "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "1", "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "SPELL/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "20000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "SPELL/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "2", + "bracket": "3", "initialLeverage": "20", "notionalCap": "25000", - "notionalFloor": "5000", + "notionalFloor": "20000", "maintMarginRatio": "0.025", - "cum": "75.0" + "cum": "125.0" } }, { - "tier": 3.0, + "tier": 4.0, + "symbol": "SPELL/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "10", - "notionalCap": "100000", + "notionalCap": "200000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "700.0" + "cum": "750.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "SPELL/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 250000.0, + "minNotional": 200000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "5", - "notionalCap": "250000", - "notionalFloor": "100000", + "notionalCap": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "5700.0" + "cum": "10750.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "SPELL/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 1000000.0, + "minNotional": 400000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "400000", + "maintMarginRatio": "0.125", + "cum": "20750.0" + } + }, + { + "tier": 7.0, + "symbol": "SPELL/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "2", "notionalCap": "1000000", - "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "11950.0" + "notionalFloor": "500000", + "maintMarginRatio": "0.25", + "cum": "83250.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "SPELL/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 5000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "5000000", + "notionalCap": "2000000", "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "386950.0" + "cum": "333250.0" } } ], - "SCR/USDT:USDT": [ + "SPX/USDT:USDT": [ { "tier": 1.0, + "symbol": "SPX/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -35634,6 +46924,7 @@ }, { "tier": 2.0, + "symbol": "SPX/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -35650,6 +46941,7 @@ }, { "tier": 3.0, + "symbol": "SPX/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 30000.0, @@ -35666,6 +46958,7 @@ }, { "tier": 4.0, + "symbol": "SPX/USDT:USDT", "currency": "USDT", "minNotional": 30000.0, "maxNotional": 60000.0, @@ -35682,6 +46975,7 @@ }, { "tier": 5.0, + "symbol": "SPX/USDT:USDT", "currency": "USDT", "minNotional": 60000.0, "maxNotional": 300000.0, @@ -35698,6 +46992,7 @@ }, { "tier": 6.0, + "symbol": "SPX/USDT:USDT", "currency": "USDT", "minNotional": 300000.0, "maxNotional": 600000.0, @@ -35714,6 +47009,7 @@ }, { "tier": 7.0, + "symbol": "SPX/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, "maxNotional": 750000.0, @@ -35730,6 +47026,7 @@ }, { "tier": 8.0, + "symbol": "SPX/USDT:USDT", "currency": "USDT", "minNotional": 750000.0, "maxNotional": 1500000.0, @@ -35746,6 +47043,7 @@ }, { "tier": 9.0, + "symbol": "SPX/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, "maxNotional": 3000000.0, @@ -35761,18 +47059,19 @@ } } ], - "SEI/USDT:USDT": [ + "SSV/USDT:USDT": [ { "tier": 1.0, + "symbol": "SSV/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, + "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "10000", + "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -35780,348 +47079,283 @@ }, { "tier": 2.0, + "symbol": "SSV/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 60000.0, + "minNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "60000", - "notionalFloor": "10000", + "notionalCap": "10000", + "notionalFloor": "5000", "maintMarginRatio": "0.015", - "cum": "50.0" + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "SSV/USDT:USDT", "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 300000.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "300000", - "notionalFloor": "60000", + "notionalCap": "50000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "350.0" + "cum": "75.0" } }, { "tier": 4.0, + "symbol": "SSV/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "300000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "1850.0" + "cum": "325.0" } }, { "tier": 5.0, + "symbol": "SSV/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 3000000.0, + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "3000000", - "notionalFloor": "600000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.05", - "cum": "16850.0" + "cum": "2825.0" } }, { "tier": 6.0, + "symbol": "SSV/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "166850.0" + "cum": "27825.0" } }, { "tier": 7.0, + "symbol": "SSV/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "7500000", - "notionalFloor": "6000000", + "notionalCap": "1250000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "316850.0" + "cum": "52825.0" } }, { "tier": 8.0, + "symbol": "SSV/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "8", - "initialLeverage": "2", - "notionalCap": "15000000", - "notionalFloor": "7500000", - "maintMarginRatio": "0.25", - "cum": "1254350.0" - } - }, - { - "tier": 9.0, - "currency": "USDT", - "minNotional": 15000000.0, - "maxNotional": 30000000.0, - "maintenanceMarginRate": 0.5, - "maxLeverage": 1.0, - "info": { - "bracket": "9", - "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "15000000", - "maintMarginRatio": "0.5", - "cum": "5004350.0" - } - } - ], - "SFP/USDT:USDT": [ - { - "tier": 1.0, - "currency": "USDT", - "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, - "info": { - "bracket": "1", - "initialLeverage": "25", - "notionalCap": "5000", - "notionalFloor": "0", - "maintMarginRatio": "0.02", - "cum": "0.0" - } - }, - { - "tier": 2.0, - "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 15000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, - "info": { - "bracket": "2", - "initialLeverage": "20", - "notionalCap": "15000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 15000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, - "info": { - "bracket": "3", - "initialLeverage": "10", - "notionalCap": "100000", - "notionalFloor": "15000", - "maintMarginRatio": "0.05", - "cum": "400.0" - } - }, - { - "tier": 4.0, - "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "4", - "initialLeverage": "5", - "notionalCap": "250000", - "notionalFloor": "100000", - "maintMarginRatio": "0.1", - "cum": "5400.0" - } - }, - { - "tier": 5.0, - "currency": "USDT", - "minNotional": 250000.0, + "minNotional": 1250000.0, "maxNotional": 3000000.0, - "maintenanceMarginRate": 0.125, + "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "5", + "bracket": "8", "initialLeverage": "2", "notionalCap": "3000000", - "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "11650.0" + "notionalFloor": "1250000", + "maintMarginRatio": "0.25", + "cum": "209075.0" } }, { - "tier": 6.0, + "tier": 9.0, + "symbol": "SSV/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, - "maxNotional": 8000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "8000000", + "notionalCap": "5000000", "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "1136650.0" + "cum": "959075.0" } } ], - "SKL/USDT:USDT": [ + "STEEM/USDT:USDT": [ { "tier": 1.0, + "symbol": "STEEM/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "20", + "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "STEEM/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "10", + "initialLeverage": "20", "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "25.0" + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "STEEM/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "8", + "initialLeverage": "10", "notionalCap": "100000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "675.0" } }, { "tier": 4.0, + "symbol": "STEEM/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, - "maxNotional": 250000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "4", "initialLeverage": "5", - "notionalCap": "250000", + "notionalCap": "200000", "notionalFloor": "100000", "maintMarginRatio": "0.1", - "cum": "5650.0" + "cum": "5675.0" } }, { "tier": 5.0, + "symbol": "STEEM/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 1000000.0, + "minNotional": 200000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 2.0, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "250000", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "200000", "maintMarginRatio": "0.125", - "cum": "11900.0" + "cum": "10675.0" } }, { "tier": 6.0, + "symbol": "STEEM/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.25", + "cum": "73175.0" + } + }, + { + "tier": 7.0, + "symbol": "STEEM/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "3000000", + "notionalCap": "2000000", "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "386900.0" + "cum": "323175.0" } } ], - "SLP/USDT:USDT": [ + "STG/USDT:USDT": [ { "tier": 1.0, + "symbol": "STG/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 21.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "21", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "STG/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -36133,1353 +47367,1470 @@ "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "STG/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "100000", + "notionalCap": "200000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "675.0" + "cum": "650.0" } }, { "tier": 4.0, + "symbol": "STG/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 200000.0, + "minNotional": 200000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "4", "initialLeverage": "5", - "notionalCap": "200000", - "notionalFloor": "100000", + "notionalCap": "500000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "5675.0" + "cum": "10650.0" } }, { "tier": 5.0, + "symbol": "STG/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "10675.0" + "cum": "23150.0" } }, { "tier": 6.0, + "symbol": "STG/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 1000000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "6", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "3000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.25", - "cum": "73175.0" + "cum": "148150.0" } }, { "tier": 7.0, + "symbol": "STG/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 1500000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "7", "initialLeverage": "1", - "notionalCap": "1500000", - "notionalFloor": "1000000", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "323175.0" + "cum": "898150.0" } } ], - "SNT/USDT:USDT": [ + "STMX/USDT:USDT": [ { "tier": 1.0, + "symbol": "STMX/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 21.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "21", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "STMX/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "STMX/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "8", "notionalCap": "100000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "675.0" + "cum": "650.0" } }, { "tier": 4.0, + "symbol": "STMX/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, - "maxNotional": 200000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "4", "initialLeverage": "5", - "notionalCap": "200000", + "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1", - "cum": "5675.0" + "cum": "5650.0" } }, { "tier": 5.0, + "symbol": "STMX/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "5", - "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "200000", - "maintMarginRatio": "0.125", - "cum": "10675.0" - } - }, - { - "tier": 6.0, - "currency": "USDT", - "minNotional": 500000.0, + "minNotional": 250000.0, "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.25, + "maintenanceMarginRate": 0.125, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "2", "notionalCap": "1000000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "73175.0" + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11900.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "STMX/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "2000000", + "notionalCap": "3000000", "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "323175.0" + "cum": "386900.0" } } ], - "SNX/USDT:USDT": [ + "STORJ/USDT:USDT": [ { "tier": 1.0, + "symbol": "STORJ/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 21.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "21", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "STORJ/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 50000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "2", "initialLeverage": "20", - "notionalCap": "50000", + "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "STORJ/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 400000.0, + "minNotional": 25000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "400000", - "notionalFloor": "50000", + "notionalCap": "300000", + "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "1300.0" + "cum": "650.0" } }, { "tier": 4.0, + "symbol": "STORJ/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 1000000.0, + "minNotional": 300000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "4", "initialLeverage": "5", - "notionalCap": "1000000", - "notionalFloor": "400000", + "notionalCap": "800000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "21300.0" + "cum": "15650.0" } }, { "tier": 5.0, + "symbol": "STORJ/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 800000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "1000000", + "notionalFloor": "800000", "maintMarginRatio": "0.125", - "cum": "46300.0" + "cum": "35650.0" } }, { "tier": 6.0, + "symbol": "STORJ/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 6000000.0, + "minNotional": 1000000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "6", "initialLeverage": "2", - "notionalCap": "6000000", - "notionalFloor": "2000000", + "notionalCap": "3000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.25", - "cum": "296300.0" + "cum": "160650.0" } }, { "tier": 7.0, + "symbol": "STORJ/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 10000000.0, + "minNotional": 3000000.0, + "maxNotional": 3500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "7", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalCap": "3500000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "1796300.0" + "cum": "910650.0" } } ], - "SOL/USDC:USDC": [ + "STPT/USDT:USDT": [ { "tier": 1.0, - "currency": "USDC", + "symbol": "STPT/USDT:USDT", + "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.005, - "maxLeverage": 100.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 21.0, "info": { "bracket": "1", - "initialLeverage": "100", - "notionalCap": "10000", + "initialLeverage": "21", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.005", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, - "currency": "USDC", - "minNotional": 10000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.0065, - "maxLeverage": 75.0, - "info": { - "bracket": "2", - "initialLeverage": "75", - "notionalCap": "50000", - "notionalFloor": "10000", - "maintMarginRatio": "0.0065", - "cum": "15.0" - } - }, - { - "tier": 3.0, - "currency": "USDC", - "minNotional": 50000.0, - "maxNotional": 200000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 50.0, - "info": { - "bracket": "3", - "initialLeverage": "50", - "notionalCap": "200000", - "notionalFloor": "50000", - "maintMarginRatio": "0.01", - "cum": "190.0" - } - }, - { - "tier": 4.0, - "currency": "USDC", - "minNotional": 200000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.012, - "maxLeverage": 40.0, - "info": { - "bracket": "4", - "initialLeverage": "40", - "notionalCap": "500000", - "notionalFloor": "200000", - "maintMarginRatio": "0.012", - "cum": "590.0" - } - }, - { - "tier": 5.0, - "currency": "USDC", - "minNotional": 500000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, - "info": { - "bracket": "5", - "initialLeverage": "25", - "notionalCap": "1000000", - "notionalFloor": "500000", - "maintMarginRatio": "0.02", - "cum": "4590.0" - } - }, - { - "tier": 6.0, - "currency": "USDC", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "symbol": "STPT/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "6", + "bracket": "2", "initialLeverage": "20", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "25000", + "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "9590.0" + "cum": "50.0" } }, { - "tier": 7.0, - "currency": "USDC", - "minNotional": 2000000.0, - "maxNotional": 5000000.0, + "tier": 3.0, + "symbol": "STPT/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 150000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "7", + "bracket": "3", "initialLeverage": "10", - "notionalCap": "5000000", - "notionalFloor": "2000000", + "notionalCap": "150000", + "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "59590.0" + "cum": "675.0" } }, { - "tier": 8.0, - "currency": "USDC", - "minNotional": 5000000.0, - "maxNotional": 15000000.0, + "tier": 4.0, + "symbol": "STPT/USDT:USDT", + "currency": "USDT", + "minNotional": 150000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "8", + "bracket": "4", "initialLeverage": "5", - "notionalCap": "15000000", - "notionalFloor": "5000000", + "notionalCap": "300000", + "notionalFloor": "150000", "maintMarginRatio": "0.1", - "cum": "309590.0" + "cum": "8175.0" } }, { - "tier": 9.0, - "currency": "USDC", - "minNotional": 15000000.0, - "maxNotional": 20000000.0, + "tier": 5.0, + "symbol": "STPT/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "9", + "bracket": "5", "initialLeverage": "4", - "notionalCap": "20000000", - "notionalFloor": "15000000", + "notionalCap": "750000", + "notionalFloor": "300000", "maintMarginRatio": "0.125", - "cum": "684590.0" + "cum": "15675.0" } }, { - "tier": 10.0, - "currency": "USDC", - "minNotional": 20000000.0, - "maxNotional": 50000000.0, + "tier": 6.0, + "symbol": "STPT/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "10", + "bracket": "6", "initialLeverage": "2", - "notionalCap": "50000000", - "notionalFloor": "20000000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "3184590.0" - } - }, - { - "tier": 11.0, - "currency": "USDC", - "minNotional": 50000000.0, - "maxNotional": 100000000.0, - "maintenanceMarginRate": 0.5, - "maxLeverage": 1.0, - "info": { - "bracket": "11", - "initialLeverage": "1", - "notionalCap": "100000000", - "notionalFloor": "50000000", - "maintMarginRatio": "0.5", - "cum": "15684590.0" - } - } - ], - "SOL/USDT:USDT": [ - { - "tier": 1.0, - "currency": "USDT", - "minNotional": 0.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.005, - "maxLeverage": 100.0, - "info": { - "bracket": "1", - "initialLeverage": "100", - "notionalCap": "20000", - "notionalFloor": "0", - "maintMarginRatio": "0.005", - "cum": "0.0" - } - }, - { - "tier": 2.0, - "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.0065, - "maxLeverage": 75.0, - "info": { - "bracket": "2", - "initialLeverage": "75", - "notionalCap": "100000", - "notionalFloor": "20000", - "maintMarginRatio": "0.0065", - "cum": "30.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 800000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 50.0, - "info": { - "bracket": "3", - "initialLeverage": "50", - "notionalCap": "800000", - "notionalFloor": "100000", - "maintMarginRatio": "0.01", - "cum": "380.0" + "cum": "109425.0" } }, { - "tier": 4.0, + "tier": 7.0, + "symbol": "STPT/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 4000000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, - "info": { - "bracket": "4", - "initialLeverage": "25", - "notionalCap": "4000000", - "notionalFloor": "800000", - "maintMarginRatio": "0.02", - "cum": "8380.0" + "minNotional": 1500000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "2000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "484425.0" } - }, + } + ], + "STRAX/USDT:USDT": [ { - "tier": 5.0, + "tier": 1.0, + "symbol": "STRAX/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 0.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.03, + "maxLeverage": 11.0, "info": { - "bracket": "5", - "initialLeverage": "20", - "notionalCap": "8000000", - "notionalFloor": "4000000", - "maintMarginRatio": "0.025", - "cum": "28380.0" + "bracket": "1", + "initialLeverage": "11", + "notionalCap": "25000", + "notionalFloor": "0", + "maintMarginRatio": "0.03", + "cum": "0.0" } }, { - "tier": 6.0, + "tier": 2.0, + "symbol": "STRAX/USDT:USDT", "currency": "USDT", - "minNotional": 8000000.0, - "maxNotional": 40000000.0, + "minNotional": 25000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "6", + "bracket": "2", "initialLeverage": "10", - "notionalCap": "40000000", - "notionalFloor": "8000000", + "notionalCap": "200000", + "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "228380.0" + "cum": "500.0" } }, { - "tier": 7.0, + "tier": 3.0, + "symbol": "STRAX/USDT:USDT", "currency": "USDT", - "minNotional": 40000000.0, - "maxNotional": 80000000.0, + "minNotional": 200000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "7", + "bracket": "3", "initialLeverage": "5", - "notionalCap": "80000000", - "notionalFloor": "40000000", + "notionalCap": "500000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "2228380.0" + "cum": "10500.0" } }, { - "tier": 8.0, + "tier": 4.0, + "symbol": "STRAX/USDT:USDT", "currency": "USDT", - "minNotional": 80000000.0, - "maxNotional": 100000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "8", + "bracket": "4", "initialLeverage": "4", - "notionalCap": "100000000", - "notionalFloor": "80000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "4228380.0" + "cum": "23000.0" } }, { - "tier": 9.0, + "tier": 5.0, + "symbol": "STRAX/USDT:USDT", "currency": "USDT", - "minNotional": 100000000.0, - "maxNotional": 200000000.0, + "minNotional": 1000000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "5", "initialLeverage": "2", - "notionalCap": "200000000", - "notionalFloor": "100000000", + "notionalCap": "3000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.25", - "cum": "16728380.0" + "cum": "148000.0" } }, { - "tier": 10.0, + "tier": 6.0, + "symbol": "STRAX/USDT:USDT", "currency": "USDT", - "minNotional": 200000000.0, - "maxNotional": 400000000.0, + "minNotional": 3000000.0, + "maxNotional": 3500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "400000000", - "notionalFloor": "200000000", + "notionalCap": "3500000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "66728380.0" + "cum": "898000.0" } } ], - "SPELL/USDT:USDT": [ + "STRK/USDT:USDT": [ { "tier": 1.0, + "symbol": "STRK/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "STRK/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, + "minNotional": 10000.0, "maxNotional": 20000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "50", "notionalCap": "20000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "STRK/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "25", + "notionalCap": "100000", "notionalFloor": "20000", - "maintMarginRatio": "0.025", - "cum": "125.0" + "maintMarginRatio": "0.02", + "cum": "150.0" } }, { "tier": 4.0, + "symbol": "STRK/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, + "minNotional": 100000.0, "maxNotional": 200000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "4", - "initialLeverage": "10", + "initialLeverage": "20", "notionalCap": "200000", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "750.0" + "notionalFloor": "100000", + "maintMarginRatio": "0.025", + "cum": "650.0" } }, { "tier": 5.0, + "symbol": "STRK/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, - "maxNotional": 400000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "200000", + "maintMarginRatio": "0.05", + "cum": "5650.0" + } + }, + { + "tier": 6.0, + "symbol": "STRK/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.1", - "cum": "10750.0" + "cum": "55650.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "STRK/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "20750.0" + "cum": "105650.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "STRK/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.25", - "cum": "83250.0" + "cum": "418150.0" } }, { - "tier": 8.0, + "tier": 9.0, + "symbol": "STRK/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "333250.0" + "cum": "1668150.0" } } ], - "SSV/USDT:USDT": [ + "STX/USDT:USDT": [ { "tier": 1.0, + "symbol": "STX/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "20", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "STX/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "minNotional": 10000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "15", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" + "initialLeverage": "50", + "notionalCap": "60000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "STX/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.02", + "cum": "350.0" + } + }, + { + "tier": 4.0, + "symbol": "STX/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.025", + "cum": "1850.0" + } + }, + { + "tier": 5.0, + "symbol": "STX/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "3000000", + "notionalFloor": "600000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "16850.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "STX/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 3000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "6000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.1", - "cum": "10650.0" + "cum": "166850.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "STX/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 6000000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "7500000", + "notionalFloor": "6000000", "maintMarginRatio": "0.125", - "cum": "23150.0" + "cum": "316850.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "STX/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "minNotional": 7500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalCap": "15000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.25", - "cum": "148150.0" + "cum": "1254350.0" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "STX/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 5000000.0, + "minNotional": 15000000.0, + "maxNotional": 30000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "3000000", + "notionalCap": "30000000", + "notionalFloor": "15000000", "maintMarginRatio": "0.5", - "cum": "898150.0" + "cum": "5004350.0" } } ], - "STEEM/USDT:USDT": [ + "SUI/USDC:USDC": [ { "tier": 1.0, - "currency": "USDT", + "symbol": "SUI/USDC:USDC", + "currency": "USDC", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, + "maintenanceMarginRate": 0.01, "maxLeverage": 50.0, "info": { "bracket": "1", "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, - "currency": "USDT", + "symbol": "SUI/USDC:USDC", + "currency": "USDC", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "25", + "notionalCap": "50000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.02", "cum": "50.0" } }, { "tier": 3.0, - "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 100000.0, + "symbol": "SUI/USDC:USDC", + "currency": "USDC", + "minNotional": 50000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "600000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "300.0" + } + }, + { + "tier": 4.0, + "symbol": "SUI/USDC:USDC", + "currency": "USDC", + "minNotional": 600000.0, + "maxNotional": 1200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "10", - "notionalCap": "100000", - "notionalFloor": "25000", + "notionalCap": "1200000", + "notionalFloor": "600000", "maintMarginRatio": "0.05", - "cum": "675.0" + "cum": "15300.0" } }, { - "tier": 4.0, - "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 200000.0, + "tier": 5.0, + "symbol": "SUI/USDC:USDC", + "currency": "USDC", + "minNotional": 1200000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "5", - "notionalCap": "200000", - "notionalFloor": "100000", + "notionalCap": "3000000", + "notionalFloor": "1200000", "maintMarginRatio": "0.1", - "cum": "5675.0" + "cum": "75300.0" } }, { - "tier": 5.0, - "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "tier": 6.0, + "symbol": "SUI/USDC:USDC", + "currency": "USDC", + "minNotional": 3000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "4000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.125", - "cum": "10675.0" + "cum": "150300.0" } }, { - "tier": 6.0, - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "tier": 7.0, + "symbol": "SUI/USDC:USDC", + "currency": "USDC", + "minNotional": 4000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "6000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.25", - "cum": "73175.0" + "cum": "650300.0" } }, { - "tier": 7.0, - "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "tier": 8.0, + "symbol": "SUI/USDC:USDC", + "currency": "USDC", + "minNotional": 6000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "10000000", + "notionalFloor": "6000000", "maintMarginRatio": "0.5", - "cum": "323175.0" + "cum": "2150300.0" } } ], - "STG/USDT:USDT": [ + "SUI/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "SUI/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "20000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "SUI/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "200000", + "notionalFloor": "20000", + "maintMarginRatio": "0.015", + "cum": "100.0" + } + }, { - "tier": 1.0, + "tier": 3.0, + "symbol": "SUI/USDT:USDT", "currency": "USDT", - "minNotional": 0.0, - "maxNotional": 5000.0, + "minNotional": 200000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "1", + "bracket": "3", "initialLeverage": "25", - "notionalCap": "5000", - "notionalFloor": "0", + "notionalCap": "1000000", + "notionalFloor": "200000", "maintMarginRatio": "0.02", - "cum": "0.0" + "cum": "1100.0" } }, { - "tier": 2.0, + "tier": 4.0, + "symbol": "SUI/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "2", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "5000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.025", - "cum": "25.0" + "cum": "6100.0" } }, { - "tier": 3.0, + "tier": 5.0, + "symbol": "SUI/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 2000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "10000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "56100.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "SUI/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 10000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "20000000", + "notionalFloor": "10000000", "maintMarginRatio": "0.1", - "cum": "10650.0" + "cum": "556100.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "SUI/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 20000000.0, + "maxNotional": 25000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "25000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.125", - "cum": "23150.0" + "cum": "1056100.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "SUI/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "minNotional": 25000000.0, + "maxNotional": 50000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalCap": "50000000", + "notionalFloor": "25000000", "maintMarginRatio": "0.25", - "cum": "148150.0" + "cum": "4181100.0" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "SUI/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 5000000.0, + "minNotional": 50000000.0, + "maxNotional": 100000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "3000000", + "notionalCap": "100000000", + "notionalFloor": "50000000", "maintMarginRatio": "0.5", - "cum": "898150.0" + "cum": "16681100.0" } } ], - "STMX/USDT:USDT": [ + "SUN/USDT:USDT": [ { "tier": 1.0, + "symbol": "SUN/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "20", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "SUN/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxNotional": 16000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "10", - "notionalCap": "25000", + "initialLeverage": "50", + "notionalCap": "16000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.015", "cum": "25.0" } }, { "tier": 3.0, + "symbol": "SUN/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "minNotional": 16000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "8", - "notionalCap": "100000", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "650.0" + "initialLeverage": "25", + "notionalCap": "80000", + "notionalFloor": "16000", + "maintMarginRatio": "0.02", + "cum": "105.0" } }, { "tier": 4.0, + "symbol": "SUN/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 250000.0, + "minNotional": 80000.0, + "maxNotional": 160000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "160000", + "notionalFloor": "80000", + "maintMarginRatio": "0.025", + "cum": "505.0" + } + }, + { + "tier": 5.0, + "symbol": "SUN/USDT:USDT", + "currency": "USDT", + "minNotional": 160000.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "800000", + "notionalFloor": "160000", + "maintMarginRatio": "0.05", + "cum": "4505.0" + } + }, + { + "tier": 6.0, + "symbol": "SUN/USDT:USDT", + "currency": "USDT", + "minNotional": 800000.0, + "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "250000", - "notionalFloor": "100000", + "notionalCap": "1600000", + "notionalFloor": "800000", "maintMarginRatio": "0.1", - "cum": "5650.0" + "cum": "44505.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "SUN/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 1000000.0, + "minNotional": 1600000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "2000000", + "notionalFloor": "1600000", + "maintMarginRatio": "0.125", + "cum": "84505.0" + } + }, + { + "tier": 8.0, + "symbol": "SUN/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "5", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "11900.0" + "notionalCap": "4000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.25", + "cum": "334505.0" } }, { - "tier": 6.0, + "tier": 9.0, + "symbol": "SUN/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "minNotional": 4000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalCap": "8000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "386900.0" + "cum": "1334505.0" } } ], - "STORJ/USDT:USDT": [ + "SUPER/USDT:USDT": [ { "tier": 1.0, + "symbol": "SUPER/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 21.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "21", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "SUPER/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "50", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.015", "cum": "25.0" } }, { "tier": 3.0, + "symbol": "SUPER/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "SUPER/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "SUPER/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", "notionalCap": "300000", - "notionalFloor": "25000", + "notionalFloor": "60000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "1725.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "SUPER/USDT:USDT", "currency": "USDT", "minNotional": 300000.0, - "maxNotional": 800000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "800000", + "notionalCap": "600000", "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "15650.0" + "cum": "16725.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "SUPER/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 1000000.0, + "minNotional": 600000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "800000", + "notionalCap": "750000", + "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "35650.0" + "cum": "31725.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "SUPER/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "160650.0" + "cum": "125475.0" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "SUPER/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3500000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "3500000", - "notionalFloor": "3000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "910650.0" + "cum": "500475.0" } } ], - "STPT/USDT:USDT": [ + "SUSHI/USDT:USDT": [ { "tier": 1.0, + "symbol": "SUSHI/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 21.0, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "21", + "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.015", @@ -37488,15 +48839,16 @@ }, { "tier": 2.0, + "symbol": "SUSHI/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "2", "initialLeverage": "20", - "notionalCap": "25000", + "notionalCap": "50000", "notionalFloor": "5000", "maintMarginRatio": "0.025", "cum": "50.0" @@ -37504,186 +48856,249 @@ }, { "tier": 3.0, + "symbol": "SUSHI/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 150000.0, + "minNotional": 50000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "150000", - "notionalFloor": "25000", + "notionalCap": "600000", + "notionalFloor": "50000", "maintMarginRatio": "0.05", - "cum": "675.0" + "cum": "1300.0" } }, { "tier": 4.0, + "symbol": "SUSHI/USDT:USDT", "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 300000.0, + "minNotional": 600000.0, + "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "4", "initialLeverage": "5", - "notionalCap": "300000", - "notionalFloor": "150000", + "notionalCap": "1600000", + "notionalFloor": "600000", "maintMarginRatio": "0.1", - "cum": "8175.0" + "cum": "31300.0" } }, { "tier": 5.0, + "symbol": "SUSHI/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 750000.0, + "minNotional": 1600000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "750000", - "notionalFloor": "300000", + "notionalCap": "2000000", + "notionalFloor": "1600000", "maintMarginRatio": "0.125", - "cum": "15675.0" + "cum": "71300.0" } }, { "tier": 6.0, + "symbol": "SUSHI/USDT:USDT", "currency": "USDT", - "minNotional": 750000.0, - "maxNotional": 1500000.0, + "minNotional": 2000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "6", "initialLeverage": "2", - "notionalCap": "1500000", - "notionalFloor": "750000", + "notionalCap": "6000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.25", - "cum": "109425.0" + "cum": "321300.0" } }, { "tier": 7.0, + "symbol": "SUSHI/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 2000000.0, + "minNotional": 6000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "7", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1500000", + "notionalCap": "10000000", + "notionalFloor": "6000000", "maintMarginRatio": "0.5", - "cum": "484425.0" + "cum": "1821300.0" } } ], - "STRAX/USDT:USDT": [ + "SWELL/USDT:USDT": [ { "tier": 1.0, + "symbol": "SWELL/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.03, - "maxLeverage": 11.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "11", - "notionalCap": "25000", + "initialLeverage": "75", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.03", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "SWELL/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "SWELL/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "SWELL/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "SWELL/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "2", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.05", - "cum": "500.0" + "cum": "1725.0" } }, { - "tier": 3.0, + "tier": 6.0, + "symbol": "SWELL/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "3", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "10500.0" + "cum": "16725.0" } }, { - "tier": 4.0, + "tier": 7.0, + "symbol": "SWELL/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 600000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "4", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "750000", + "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "23000.0" + "cum": "31725.0" } }, { - "tier": 5.0, + "tier": 8.0, + "symbol": "SWELL/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "5", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "148000.0" + "cum": "125475.0" } }, { - "tier": 6.0, + "tier": 9.0, + "symbol": "SWELL/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3500000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "3500000", - "notionalFloor": "3000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "898000.0" + "cum": "500475.0" } } ], - "STRK/USDT:USDT": [ + "SXP/USDT:USDT": [ { "tier": 1.0, + "symbol": "SXP/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -37700,6 +49115,7 @@ }, { "tier": 2.0, + "symbol": "SXP/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 20000.0, @@ -37716,6 +49132,7 @@ }, { "tier": 3.0, + "symbol": "SXP/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 100000.0, @@ -37732,6 +49149,7 @@ }, { "tier": 4.0, + "symbol": "SXP/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 200000.0, @@ -37748,6 +49166,7 @@ }, { "tier": 5.0, + "symbol": "SXP/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 1000000.0, @@ -37764,6 +49183,7 @@ }, { "tier": 6.0, + "symbol": "SXP/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -37780,6 +49200,7 @@ }, { "tier": 7.0, + "symbol": "SXP/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 2500000.0, @@ -37796,15 +49217,16 @@ }, { "tier": 8.0, + "symbol": "SXP/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "5000000", + "notionalCap": "6000000", "notionalFloor": "2500000", "maintMarginRatio": "0.25", "cum": "418150.0" @@ -37812,8 +49234,9 @@ }, { "tier": 9.0, + "symbol": "SXP/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, + "minNotional": 6000000.0, "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, @@ -37821,300 +49244,439 @@ "bracket": "9", "initialLeverage": "1", "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalFloor": "6000000", "maintMarginRatio": "0.5", - "cum": "1668150.0" + "cum": "1918150.0" } } ], - "STX/USDT:USDT": [ + "SYN/USDT:USDT": [ { "tier": 1.0, + "symbol": "SYN/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "75", - "notionalCap": "10000", + "initialLeverage": "50", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "SYN/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 30000.0, + "minNotional": 5000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "20000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "SYN/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "20000", + "maintMarginRatio": "0.025", + "cum": "125.0" + } + }, + { + "tier": 4.0, + "symbol": "SYN/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "200000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "750.0" + } + }, + { + "tier": 5.0, + "symbol": "SYN/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "400000", + "notionalFloor": "200000", + "maintMarginRatio": "0.1", + "cum": "10750.0" + } + }, + { + "tier": 6.0, + "symbol": "SYN/USDT:USDT", + "currency": "USDT", + "minNotional": 400000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "400000", + "maintMarginRatio": "0.125", + "cum": "20750.0" + } + }, + { + "tier": 7.0, + "symbol": "SYN/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.25", + "cum": "83250.0" + } + }, + { + "tier": 8.0, + "symbol": "SYN/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "333250.0" + } + } + ], + "SYS/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "SYS/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { - "bracket": "2", + "bracket": "1", "initialLeverage": "50", - "notionalCap": "30000", - "notionalFloor": "10000", + "notionalCap": "5000", + "notionalFloor": "0", "maintMarginRatio": "0.015", - "cum": "50.0" + "cum": "0.0" } }, { - "tier": 3.0, + "tier": 2.0, + "symbol": "SYS/USDT:USDT", "currency": "USDT", - "minNotional": 30000.0, - "maxNotional": 150000.0, + "minNotional": 5000.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "3", + "bracket": "2", "initialLeverage": "25", - "notionalCap": "150000", - "notionalFloor": "30000", + "notionalCap": "20000", + "notionalFloor": "5000", "maintMarginRatio": "0.02", - "cum": "200.0" + "cum": "25.0" } }, { - "tier": 4.0, + "tier": 3.0, + "symbol": "SYS/USDT:USDT", "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 300000.0, + "minNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "20", - "notionalCap": "300000", - "notionalFloor": "150000", + "notionalCap": "25000", + "notionalFloor": "20000", "maintMarginRatio": "0.025", - "cum": "950.0" + "cum": "125.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "SYS/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 1500000.0, + "minNotional": 25000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "10", - "notionalCap": "1500000", - "notionalFloor": "300000", + "notionalCap": "200000", + "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "8450.0" + "cum": "750.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "SYS/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 200000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "83450.0" + "cum": "10750.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "SYS/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3750000.0, + "minNotional": 400000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "4", - "notionalCap": "3750000", - "notionalFloor": "3000000", + "notionalCap": "500000", + "notionalFloor": "400000", "maintMarginRatio": "0.125", - "cum": "158450.0" + "cum": "20750.0" } }, { - "tier": 8.0, + "tier": 7.0, + "symbol": "SYS/USDT:USDT", "currency": "USDT", - "minNotional": 3750000.0, - "maxNotional": 7500000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "3750000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "627200.0" + "cum": "83250.0" } }, { - "tier": 9.0, + "tier": 8.0, + "symbol": "SYS/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "2502200.0" + "cum": "333250.0" } } ], - "SUI/USDC:USDC": [ + "T/USDT:USDT": [ { "tier": 1.0, - "currency": "USDC", + "symbol": "T/USDT:USDT", + "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.01, + "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "1", "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.015", "cum": "0.0" } }, { "tier": 2.0, - "currency": "USDC", + "symbol": "T/USDT:USDT", + "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 50000.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "2", "initialLeverage": "25", - "notionalCap": "50000", + "notionalCap": "20000", "notionalFloor": "5000", "maintMarginRatio": "0.02", - "cum": "50.0" + "cum": "25.0" } }, { "tier": 3.0, - "currency": "USDC", - "minNotional": 50000.0, - "maxNotional": 600000.0, + "symbol": "T/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "3", "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "50000", + "notionalCap": "25000", + "notionalFloor": "20000", "maintMarginRatio": "0.025", - "cum": "300.0" + "cum": "125.0" } }, { "tier": 4.0, - "currency": "USDC", - "minNotional": 600000.0, - "maxNotional": 1200000.0, + "symbol": "T/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "4", "initialLeverage": "10", - "notionalCap": "1200000", - "notionalFloor": "600000", + "notionalCap": "200000", + "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "15300.0" + "cum": "750.0" } }, { "tier": 5.0, - "currency": "USDC", - "minNotional": 1200000.0, - "maxNotional": 3000000.0, + "symbol": "T/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "5", "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "1200000", + "notionalCap": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "75300.0" + "cum": "10750.0" } }, { "tier": 6.0, - "currency": "USDC", - "minNotional": 3000000.0, - "maxNotional": 4000000.0, + "symbol": "T/USDT:USDT", + "currency": "USDT", + "minNotional": 400000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "6", "initialLeverage": "4", - "notionalCap": "4000000", - "notionalFloor": "3000000", + "notionalCap": "500000", + "notionalFloor": "400000", "maintMarginRatio": "0.125", - "cum": "150300.0" + "cum": "20750.0" } }, { "tier": 7.0, - "currency": "USDC", - "minNotional": 4000000.0, - "maxNotional": 6000000.0, + "symbol": "T/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "6000000", - "notionalFloor": "4000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "650300.0" + "cum": "83250.0" } }, { "tier": 8.0, - "currency": "USDC", - "minNotional": 6000000.0, - "maxNotional": 10000000.0, + "symbol": "T/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "2150300.0" + "cum": "333250.0" } } ], - "SUI/USDT:USDT": [ + "TAO/USDT:USDT": [ { "tier": 1.0, + "symbol": "TAO/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 20000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "20000", + "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -38122,145 +49684,154 @@ }, { "tier": 2.0, + "symbol": "TAO/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 200000.0, + "minNotional": 10000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "200000", - "notionalFloor": "20000", + "notionalCap": "100000", + "notionalFloor": "10000", "maintMarginRatio": "0.015", - "cum": "100.0" + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "TAO/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 1000000.0, + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "1000000", - "notionalFloor": "200000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.02", - "cum": "1100.0" + "cum": "550.0" } }, { "tier": 4.0, + "symbol": "TAO/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.025", - "cum": "6100.0" + "cum": "3050.0" } }, { "tier": 5.0, + "symbol": "TAO/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 10000000.0, + "minNotional": 1000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "10000000", - "notionalFloor": "2000000", + "notionalCap": "5000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.05", - "cum": "56100.0" + "cum": "28050.0" } }, { "tier": 6.0, + "symbol": "TAO/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.1", - "cum": "556100.0" + "cum": "278050.0" } }, { "tier": 7.0, + "symbol": "TAO/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 25000000.0, + "minNotional": 10000000.0, + "maxNotional": 12500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "25000000", - "notionalFloor": "20000000", + "notionalCap": "12500000", + "notionalFloor": "10000000", "maintMarginRatio": "0.125", - "cum": "1056100.0" + "cum": "528050.0" } }, { "tier": 8.0, + "symbol": "TAO/USDT:USDT", "currency": "USDT", - "minNotional": 25000000.0, - "maxNotional": 50000000.0, + "minNotional": 12500000.0, + "maxNotional": 25000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "50000000", - "notionalFloor": "25000000", + "notionalCap": "25000000", + "notionalFloor": "12500000", "maintMarginRatio": "0.25", - "cum": "4181100.0" + "cum": "2090550.0" } }, { "tier": 9.0, + "symbol": "TAO/USDT:USDT", "currency": "USDT", - "minNotional": 50000000.0, - "maxNotional": 100000000.0, + "minNotional": 25000000.0, + "maxNotional": 50000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "100000000", - "notionalFloor": "50000000", + "notionalCap": "50000000", + "notionalFloor": "25000000", "maintMarginRatio": "0.5", - "cum": "16681100.0" + "cum": "8340550.0" } } ], - "SUN/USDT:USDT": [ + "THE/USDT:USDT": [ { "tier": 1.0, + "symbol": "THE/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "5000", + "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -38268,396 +49839,421 @@ }, { "tier": 2.0, + "symbol": "THE/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 16000.0, + "minNotional": 10000.0, + "maxNotional": 40000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "16000", - "notionalFloor": "5000", + "notionalCap": "40000", + "notionalFloor": "10000", "maintMarginRatio": "0.015", - "cum": "25.0" + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "THE/USDT:USDT", "currency": "USDT", - "minNotional": 16000.0, - "maxNotional": 80000.0, + "minNotional": 40000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "80000", - "notionalFloor": "16000", + "notionalCap": "200000", + "notionalFloor": "40000", "maintMarginRatio": "0.02", - "cum": "105.0" + "cum": "250.0" } }, { "tier": 4.0, + "symbol": "THE/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 160000.0, + "minNotional": 200000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "160000", - "notionalFloor": "80000", + "notionalCap": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.025", - "cum": "505.0" + "cum": "1250.0" } }, { "tier": 5.0, + "symbol": "THE/USDT:USDT", "currency": "USDT", - "minNotional": 160000.0, - "maxNotional": 800000.0, + "minNotional": 400000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "800000", - "notionalFloor": "160000", + "notionalCap": "2000000", + "notionalFloor": "400000", "maintMarginRatio": "0.05", - "cum": "4505.0" + "cum": "11250.0" } }, { "tier": 6.0, + "symbol": "THE/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 1600000.0, + "minNotional": 2000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "1600000", - "notionalFloor": "800000", + "notionalCap": "4000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.1", - "cum": "44505.0" + "cum": "111250.0" } }, { "tier": 7.0, + "symbol": "THE/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 2000000.0, + "minNotional": 4000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1600000", + "notionalCap": "5000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.125", - "cum": "84505.0" + "cum": "211250.0" } }, { "tier": 8.0, + "symbol": "THE/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "4000000", - "notionalFloor": "2000000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.25", - "cum": "334505.0" + "cum": "836250.0" } }, { "tier": 9.0, + "symbol": "THE/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "minNotional": 10000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "8000000", - "notionalFloor": "4000000", + "notionalCap": "20000000", + "notionalFloor": "10000000", "maintMarginRatio": "0.5", - "cum": "1334505.0" + "cum": "3336250.0" } } ], - "SUPER/USDT:USDT": [ + "THETA/USDT:USDT": [ { "tier": 1.0, + "symbol": "THETA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, - "info": { - "bracket": "1", - "initialLeverage": "75", - "notionalCap": "5000", - "notionalFloor": "0", - "maintMarginRatio": "0.01", - "cum": "0.0" - } - }, - { - "tier": 2.0, - "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { - "bracket": "2", + "bracket": "1", "initialLeverage": "50", - "notionalCap": "10000", - "notionalFloor": "5000", + "notionalCap": "50000", + "notionalFloor": "0", "maintMarginRatio": "0.015", - "cum": "25.0" + "cum": "0.0" } }, { - "tier": 3.0, + "tier": 2.0, + "symbol": "THETA/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 30000.0, + "minNotional": 50000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, - "info": { - "bracket": "3", - "initialLeverage": "25", - "notionalCap": "30000", - "notionalFloor": "10000", - "maintMarginRatio": "0.02", - "cum": "75.0" - } - }, - { - "tier": 4.0, - "currency": "USDT", - "minNotional": 30000.0, - "maxNotional": 60000.0, - "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "4", + "bracket": "2", "initialLeverage": "20", - "notionalCap": "60000", - "notionalFloor": "30000", - "maintMarginRatio": "0.025", - "cum": "225.0" + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.02", + "cum": "250.0" } }, { - "tier": 5.0, + "tier": 3.0, + "symbol": "THETA/USDT:USDT", "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 300000.0, + "minNotional": 250000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "5", + "bracket": "3", "initialLeverage": "10", - "notionalCap": "300000", - "notionalFloor": "60000", + "notionalCap": "1000000", + "notionalFloor": "250000", "maintMarginRatio": "0.05", - "cum": "1725.0" + "cum": "7750.0" } }, { - "tier": 6.0, + "tier": 4.0, + "symbol": "THETA/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "5", - "notionalCap": "600000", - "notionalFloor": "300000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.1", - "cum": "16725.0" + "cum": "57750.0" } }, { - "tier": 7.0, + "tier": 5.0, + "symbol": "THETA/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 750000.0, + "minNotional": 2000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "4", - "notionalCap": "750000", - "notionalFloor": "600000", + "notionalCap": "5000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "31725.0" + "cum": "107750.0" } }, { - "tier": 8.0, + "tier": 6.0, + "symbol": "THETA/USDT:USDT", "currency": "USDT", - "minNotional": 750000.0, - "maxNotional": 1500000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.1665, + "maxLeverage": 3.0, + "info": { + "bracket": "6", + "initialLeverage": "3", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.1665", + "cum": "315250.0" + } + }, + { + "tier": 7.0, + "symbol": "THETA/USDT:USDT", + "currency": "USDT", + "minNotional": 10000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", - "notionalCap": "1500000", - "notionalFloor": "750000", + "notionalCap": "20000000", + "notionalFloor": "10000000", "maintMarginRatio": "0.25", - "cum": "125475.0" + "cum": "1150250.0" } }, { - "tier": 9.0, + "tier": 8.0, + "symbol": "THETA/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 20000000.0, + "maxNotional": 30000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "30000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.5", - "cum": "500475.0" + "cum": "6150250.0" } } ], - "SUSHI/USDT:USDT": [ + "TIA/USDC:USDC": [ { "tier": 1.0, - "currency": "USDT", + "symbol": "TIA/USDC:USDC", + "currency": "USDC", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, + "maintenanceMarginRate": 0.01, "maxLeverage": 50.0, "info": { "bracket": "1", "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, - "currency": "USDT", + "symbol": "TIA/USDC:USDC", + "currency": "USDC", "minNotional": 5000.0, "maxNotional": 50000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "25", "notionalCap": "50000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.02", "cum": "50.0" } }, { "tier": 3.0, - "currency": "USDT", + "symbol": "TIA/USDC:USDC", + "currency": "USDC", "minNotional": 50000.0, "maxNotional": 600000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "20", "notionalCap": "600000", "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1300.0" + "maintMarginRatio": "0.025", + "cum": "300.0" } }, { "tier": 4.0, - "currency": "USDT", + "symbol": "TIA/USDC:USDC", + "currency": "USDC", "minNotional": 600000.0, - "maxNotional": 1600000.0, + "maxNotional": 1200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "1200000", + "notionalFloor": "600000", + "maintMarginRatio": "0.05", + "cum": "15300.0" + } + }, + { + "tier": 5.0, + "symbol": "TIA/USDC:USDC", + "currency": "USDC", + "minNotional": 1200000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "5", - "notionalCap": "1600000", - "notionalFloor": "600000", + "notionalCap": "3000000", + "notionalFloor": "1200000", "maintMarginRatio": "0.1", - "cum": "31300.0" + "cum": "75300.0" } }, { - "tier": 5.0, - "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 2000000.0, + "tier": 6.0, + "symbol": "TIA/USDC:USDC", + "currency": "USDC", + "minNotional": 3000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1600000", + "notionalCap": "4000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.125", - "cum": "71300.0" + "cum": "150300.0" } }, { - "tier": 6.0, - "currency": "USDT", - "minNotional": 2000000.0, + "tier": 7.0, + "symbol": "TIA/USDC:USDC", + "currency": "USDC", + "minNotional": 4000000.0, "maxNotional": 6000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "2", "notionalCap": "6000000", - "notionalFloor": "2000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.25", - "cum": "321300.0" + "cum": "650300.0" } }, { - "tier": 7.0, - "currency": "USDT", + "tier": 8.0, + "symbol": "TIA/USDC:USDC", + "currency": "USDC", "minNotional": 6000000.0, "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "1", "notionalCap": "10000000", "notionalFloor": "6000000", "maintMarginRatio": "0.5", - "cum": "1821300.0" + "cum": "2150300.0" } } ], - "SXP/USDT:USDT": [ + "TIA/USDT:USDT": [ { "tier": 1.0, + "symbol": "TIA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -38674,15 +50270,16 @@ }, { "tier": 2.0, + "symbol": "TIA/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "20000", + "notionalCap": "100000", "notionalFloor": "10000", "maintMarginRatio": "0.015", "cum": "50.0" @@ -38690,380 +50287,404 @@ }, { "tier": 3.0, + "symbol": "TIA/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 100000.0, + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "100000", - "notionalFloor": "20000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.02", - "cum": "150.0" + "cum": "550.0" } }, { "tier": 4.0, + "symbol": "TIA/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 200000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "200000", - "notionalFloor": "100000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.025", - "cum": "650.0" + "cum": "3050.0" } }, { "tier": 5.0, + "symbol": "TIA/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 1000000.0, + "minNotional": 1000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "1000000", - "notionalFloor": "200000", + "notionalCap": "5000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.05", - "cum": "5650.0" + "cum": "28050.0" } }, { "tier": 6.0, + "symbol": "TIA/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.1", - "cum": "55650.0" + "cum": "278050.0" } }, { "tier": 7.0, + "symbol": "TIA/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 2500000.0, + "minNotional": 10000000.0, + "maxNotional": 12500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "2500000", - "notionalFloor": "2000000", + "notionalCap": "12500000", + "notionalFloor": "10000000", "maintMarginRatio": "0.125", - "cum": "105650.0" + "cum": "528050.0" } }, { "tier": 8.0, + "symbol": "TIA/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 6000000.0, + "minNotional": 12500000.0, + "maxNotional": 25000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "6000000", - "notionalFloor": "2500000", + "notionalCap": "25000000", + "notionalFloor": "12500000", "maintMarginRatio": "0.25", - "cum": "418150.0" + "cum": "2090550.0" } }, { "tier": 9.0, + "symbol": "TIA/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 10000000.0, + "minNotional": 25000000.0, + "maxNotional": 50000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalCap": "50000000", + "notionalFloor": "25000000", "maintMarginRatio": "0.5", - "cum": "1918150.0" + "cum": "8340550.0" } } ], - "SYN/USDT:USDT": [ + "TLM/USDT:USDT": [ { "tier": 1.0, + "symbol": "TLM/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "TLM/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, - "info": { - "bracket": "2", - "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 20000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 15.0, "info": { - "bracket": "3", - "initialLeverage": "20", + "bracket": "2", + "initialLeverage": "15", "notionalCap": "25000", - "notionalFloor": "20000", + "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "125.0" + "cum": "25.0" } }, { - "tier": 4.0, + "tier": 3.0, + "symbol": "TLM/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "10", "notionalCap": "200000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "750.0" + "cum": "650.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "TLM/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, - "maxNotional": 400000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "5", - "notionalCap": "400000", + "notionalCap": "500000", "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "10750.0" + "cum": "10650.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "TLM/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "20750.0" + "cum": "23150.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "TLM/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 1000000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "3000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.25", - "cum": "83250.0" + "cum": "148150.0" } }, { - "tier": 8.0, + "tier": 7.0, + "symbol": "TLM/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "333250.0" + "cum": "898150.0" } } ], - "SYS/USDT:USDT": [ + "TNSR/USDT:USDT": [ { "tier": 1.0, + "symbol": "TNSR/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "TNSR/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "20000", + "initialLeverage": "50", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.015", "cum": "25.0" } }, { "tier": 3.0, + "symbol": "TNSR/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 25000.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "TNSR/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "20000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "125.0" + "cum": "325.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "TNSR/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.05", - "cum": "750.0" + "cum": "2825.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "TNSR/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "10750.0" + "cum": "27825.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "TNSR/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "1250000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "20750.0" + "cum": "52825.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "TNSR/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 1250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "2500000", + "notionalFloor": "1250000", "maintMarginRatio": "0.25", - "cum": "83250.0" + "cum": "209075.0" } }, { - "tier": 8.0, + "tier": 9.0, + "symbol": "TNSR/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "333250.0" + "cum": "834075.0" } } ], - "T/USDT:USDT": [ + "TOKEN/USDT:USDT": [ { "tier": 1.0, + "symbol": "TOKEN/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -39080,120 +50701,111 @@ }, { "tier": 2.0, + "symbol": "TOKEN/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, - "info": { - "bracket": "2", - "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 20000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "2", "initialLeverage": "20", "notionalCap": "25000", - "notionalFloor": "20000", + "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "125.0" + "cum": "50.0" } }, { - "tier": 4.0, + "tier": 3.0, + "symbol": "TOKEN/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 200000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "10", - "notionalCap": "200000", + "notionalCap": "100000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "750.0" + "cum": "675.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "TOKEN/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "200000", + "notionalFloor": "100000", "maintMarginRatio": "0.1", - "cum": "10750.0" + "cum": "5675.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "TOKEN/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, + "minNotional": 200000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "500000", - "notionalFloor": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.125", - "cum": "20750.0" + "cum": "10675.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "TOKEN/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "2", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.25", - "cum": "83250.0" + "cum": "73175.0" } }, { - "tier": 8.0, + "tier": 7.0, + "symbol": "TOKEN/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "1", "notionalCap": "2000000", "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "333250.0" + "cum": "323175.0" } } ], - "TAO/USDT:USDT": [ + "TON/USDT:USDT": [ { "tier": 1.0, + "symbol": "TON/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -39210,15 +50822,16 @@ }, { "tier": 2.0, + "symbol": "TON/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 100000.0, + "maxNotional": 80000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "100000", + "notionalCap": "80000", "notionalFloor": "10000", "maintMarginRatio": "0.015", "cum": "50.0" @@ -39226,129 +50839,137 @@ }, { "tier": 3.0, + "symbol": "TON/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 500000.0, + "minNotional": 80000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "500000", - "notionalFloor": "100000", + "notionalCap": "400000", + "notionalFloor": "80000", "maintMarginRatio": "0.02", - "cum": "550.0" + "cum": "450.0" } }, { "tier": 4.0, + "symbol": "TON/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 400000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "800000", + "notionalFloor": "400000", "maintMarginRatio": "0.025", - "cum": "3050.0" + "cum": "2450.0" } }, { "tier": 5.0, + "symbol": "TON/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 5000000.0, + "minNotional": 800000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "5000000", - "notionalFloor": "1000000", + "notionalCap": "4000000", + "notionalFloor": "800000", "maintMarginRatio": "0.05", - "cum": "28050.0" + "cum": "22450.0" } }, { "tier": 6.0, + "symbol": "TON/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 4000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "8000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.1", - "cum": "278050.0" + "cum": "222450.0" } }, { "tier": 7.0, + "symbol": "TON/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 12500000.0, + "minNotional": 8000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "12500000", - "notionalFloor": "10000000", + "notionalCap": "10000000", + "notionalFloor": "8000000", "maintMarginRatio": "0.125", - "cum": "528050.0" + "cum": "422450.0" } }, { "tier": 8.0, + "symbol": "TON/USDT:USDT", "currency": "USDT", - "minNotional": 12500000.0, - "maxNotional": 25000000.0, + "minNotional": 10000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "25000000", - "notionalFloor": "12500000", + "notionalCap": "20000000", + "notionalFloor": "10000000", "maintMarginRatio": "0.25", - "cum": "2090550.0" + "cum": "1672450.0" } }, { "tier": 9.0, + "symbol": "TON/USDT:USDT", "currency": "USDT", - "minNotional": 25000000.0, - "maxNotional": 50000000.0, + "minNotional": 20000000.0, + "maxNotional": 40000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "25000000", + "notionalCap": "40000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.5", - "cum": "8340550.0" + "cum": "6672450.0" } } ], - "THETA/USDT:USDT": [ + "TRB/USDT:USDT": [ { "tier": 1.0, + "symbol": "TRB/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 50000.0, + "maxNotional": 5000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 26.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "50000", + "initialLeverage": "26", + "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.015", "cum": "0.0" @@ -39356,129 +50977,137 @@ }, { "tier": 2.0, + "symbol": "TRB/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, + "minNotional": 5000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maxLeverage": 25.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "250000", - "notionalFloor": "50000", + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "5000", "maintMarginRatio": "0.02", - "cum": "250.0" + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "TRB/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "1000000", - "notionalFloor": "250000", - "maintMarginRatio": "0.05", - "cum": "7750.0" + "initialLeverage": "20", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "275.0" } }, { "tier": 4.0, + "symbol": "TRB/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 100000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "2000000", - "notionalFloor": "1000000", - "maintMarginRatio": "0.1", - "cum": "57750.0" + "initialLeverage": "10", + "notionalCap": "400000", + "notionalFloor": "100000", + "maintMarginRatio": "0.05", + "cum": "2775.0" } }, { "tier": 5.0, + "symbol": "TRB/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 400000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "5000000", - "notionalFloor": "2000000", - "maintMarginRatio": "0.125", - "cum": "107750.0" + "initialLeverage": "5", + "notionalCap": "1000000", + "notionalFloor": "400000", + "maintMarginRatio": "0.1", + "cum": "22775.0" } }, { "tier": 6.0, + "symbol": "TRB/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, - "maintenanceMarginRate": 0.1665, - "maxLeverage": 3.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "3", - "notionalCap": "10000000", - "notionalFloor": "5000000", - "maintMarginRatio": "0.1665", - "cum": "315250.0" + "initialLeverage": "4", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.125", + "cum": "47775.0" } }, { "tier": 7.0, + "symbol": "TRB/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "minNotional": 2000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "4000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.25", - "cum": "1150250.0" + "cum": "297775.0" } }, { "tier": 8.0, + "symbol": "TRB/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 30000000.0, + "minNotional": 4000000.0, + "maxNotional": 4500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "20000000", + "notionalCap": "4500000", + "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "6150250.0" + "cum": "1297775.0" } } ], - "TIA/USDC:USDC": [ + "TROY/USDT:USDT": [ { "tier": 1.0, - "currency": "USDC", + "symbol": "TROY/USDT:USDT", + "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 50.0, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -39486,129 +51115,154 @@ }, { "tier": 2.0, - "currency": "USDC", - "minNotional": 5000.0, - "maxNotional": 50000.0, + "symbol": "TROY/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "20000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "TROY/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "2", + "bracket": "3", "initialLeverage": "25", - "notionalCap": "50000", - "notionalFloor": "5000", + "notionalCap": "100000", + "notionalFloor": "20000", "maintMarginRatio": "0.02", - "cum": "50.0" + "cum": "150.0" } }, { - "tier": 3.0, - "currency": "USDC", - "minNotional": 50000.0, - "maxNotional": 600000.0, + "tier": 4.0, + "symbol": "TROY/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "50000", + "notionalCap": "200000", + "notionalFloor": "100000", "maintMarginRatio": "0.025", - "cum": "300.0" + "cum": "650.0" } }, { - "tier": 4.0, - "currency": "USDC", - "minNotional": 600000.0, - "maxNotional": 1200000.0, + "tier": 5.0, + "symbol": "TROY/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "1200000", - "notionalFloor": "600000", + "notionalCap": "1000000", + "notionalFloor": "200000", "maintMarginRatio": "0.05", - "cum": "15300.0" + "cum": "5650.0" } }, { - "tier": 5.0, - "currency": "USDC", - "minNotional": 1200000.0, - "maxNotional": 3000000.0, + "tier": 6.0, + "symbol": "TROY/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "1200000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.1", - "cum": "75300.0" + "cum": "55650.0" } }, { - "tier": 6.0, - "currency": "USDC", - "minNotional": 3000000.0, - "maxNotional": 4000000.0, + "tier": 7.0, + "symbol": "TROY/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "4000000", - "notionalFloor": "3000000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "150300.0" + "cum": "105650.0" } }, { - "tier": 7.0, - "currency": "USDC", - "minNotional": 4000000.0, - "maxNotional": 6000000.0, + "tier": 8.0, + "symbol": "TROY/USDT:USDT", + "currency": "USDT", + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "6000000", - "notionalFloor": "4000000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.25", - "cum": "650300.0" + "cum": "418150.0" } }, { - "tier": 8.0, - "currency": "USDC", - "minNotional": 6000000.0, + "tier": 9.0, + "symbol": "TROY/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "2150300.0" + "cum": "1668150.0" } } ], - "TIA/USDT:USDT": [ + "TRU/USDT:USDT": [ { "tier": 1.0, + "symbol": "TRU/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, + "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "10000", + "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -39616,380 +51270,472 @@ }, { "tier": 2.0, + "symbol": "TRU/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 80000.0, + "minNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "80000", - "notionalFloor": "10000", + "notionalCap": "10000", + "notionalFloor": "5000", "maintMarginRatio": "0.015", - "cum": "50.0" + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "TRU/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 400000.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "400000", - "notionalFloor": "80000", + "notionalCap": "50000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "450.0" + "cum": "75.0" } }, { "tier": 4.0, + "symbol": "TRU/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 800000.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "800000", - "notionalFloor": "400000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "2450.0" + "cum": "325.0" } }, { "tier": 5.0, + "symbol": "TRU/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 4000000.0, + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "4000000", - "notionalFloor": "800000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.05", - "cum": "22450.0" + "cum": "2825.0" } }, { "tier": 6.0, + "symbol": "TRU/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "8000000", - "notionalFloor": "4000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "222450.0" + "cum": "27825.0" } }, { "tier": 7.0, + "symbol": "TRU/USDT:USDT", "currency": "USDT", - "minNotional": 8000000.0, - "maxNotional": 10000000.0, + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "10000000", - "notionalFloor": "8000000", + "notionalCap": "1250000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "422450.0" + "cum": "52825.0" } }, { "tier": 8.0, + "symbol": "TRU/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "minNotional": 1250000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "3000000", + "notionalFloor": "1250000", "maintMarginRatio": "0.25", - "cum": "1672450.0" + "cum": "209075.0" } }, { "tier": 9.0, + "symbol": "TRU/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 40000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "40000000", - "notionalFloor": "20000000", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "6672450.0" + "cum": "959075.0" } } ], - "TLM/USDT:USDT": [ + "TRX/USDT:USDT": [ { "tier": 1.0, + "symbol": "TRX/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.0065, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "20", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.0065", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "TRX/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "minNotional": 10000.0, + "maxNotional": 90000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "15", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" + "initialLeverage": "50", + "notionalCap": "90000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "35.0" } }, { "tier": 3.0, + "symbol": "TRX/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 90000.0, + "maxNotional": 120000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 40.0, + "info": { + "bracket": "3", + "initialLeverage": "40", + "notionalCap": "120000", + "notionalFloor": "90000", + "maintMarginRatio": "0.015", + "cum": "485.0" + } + }, + { + "tier": 4.0, + "symbol": "TRX/USDT:USDT", + "currency": "USDT", + "minNotional": 120000.0, + "maxNotional": 650000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "4", + "initialLeverage": "25", + "notionalCap": "650000", + "notionalFloor": "120000", + "maintMarginRatio": "0.02", + "cum": "1085.0" + } + }, + { + "tier": 5.0, + "symbol": "TRX/USDT:USDT", + "currency": "USDT", + "minNotional": 650000.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "5", + "initialLeverage": "20", + "notionalCap": "800000", + "notionalFloor": "650000", + "maintMarginRatio": "0.025", + "cum": "4335.0" + } + }, + { + "tier": 6.0, + "symbol": "TRX/USDT:USDT", + "currency": "USDT", + "minNotional": 800000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "6", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "3000000", + "notionalFloor": "800000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "24335.0" } }, { - "tier": 4.0, + "tier": 7.0, + "symbol": "TRX/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 3000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "7", "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "6000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.1", - "cum": "10650.0" + "cum": "174335.0" } }, { - "tier": 5.0, + "tier": 8.0, + "symbol": "TRX/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 6000000.0, + "maxNotional": 12000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "8", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "12000000", + "notionalFloor": "6000000", "maintMarginRatio": "0.125", - "cum": "23150.0" + "cum": "324335.0" } }, { - "tier": 6.0, + "tier": 9.0, + "symbol": "TRX/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "minNotional": 12000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "9", "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalCap": "20000000", + "notionalFloor": "12000000", "maintMarginRatio": "0.25", - "cum": "148150.0" + "cum": "1824335.0" } }, { - "tier": 7.0, + "tier": 10.0, + "symbol": "TRX/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 5000000.0, + "minNotional": 20000000.0, + "maxNotional": 30000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "3000000", + "notionalCap": "30000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.5", - "cum": "898150.0" + "cum": "6824335.0" } } ], - "TNSR/USDT:USDT": [ + "TURBO/USDT:USDT": [ { "tier": 1.0, + "symbol": "TURBO/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "TURBO/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 20000.0, + "minNotional": 10000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "60000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "TURBO/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "2", + "bracket": "3", "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "5000", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.02", - "cum": "25.0" + "cum": "350.0" } }, { - "tier": 3.0, + "tier": 4.0, + "symbol": "TURBO/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 30000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "30000", - "notionalFloor": "20000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.025", - "cum": "125.0" + "cum": "1850.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "TURBO/USDT:USDT", "currency": "USDT", - "minNotional": 30000.0, - "maxNotional": 300000.0, + "minNotional": 600000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "300000", - "notionalFloor": "30000", + "notionalCap": "3000000", + "notionalFloor": "600000", "maintMarginRatio": "0.05", - "cum": "875.0" + "cum": "16850.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "TURBO/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 3000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "600000", - "notionalFloor": "300000", + "notionalCap": "6000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.1", - "cum": "15875.0" + "cum": "166850.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "TURBO/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 750000.0, + "minNotional": 6000000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "750000", - "notionalFloor": "600000", + "notionalCap": "7500000", + "notionalFloor": "6000000", "maintMarginRatio": "0.125", - "cum": "30875.0" + "cum": "316850.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "TURBO/USDT:USDT", "currency": "USDT", - "minNotional": 750000.0, - "maxNotional": 1500000.0, + "minNotional": 7500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1500000", - "notionalFloor": "750000", + "notionalCap": "15000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.25", - "cum": "124625.0" + "cum": "1254350.0" } }, { - "tier": 8.0, + "tier": 9.0, + "symbol": "TURBO/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 15000000.0, + "maxNotional": 30000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "30000000", + "notionalFloor": "15000000", "maintMarginRatio": "0.5", - "cum": "499625.0" + "cum": "5004350.0" } } ], - "TOKEN/USDT:USDT": [ + "TWT/USDT:USDT": [ { "tier": 1.0, + "symbol": "TWT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -40006,6 +51752,7 @@ }, { "tier": 2.0, + "symbol": "TWT/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -40022,6 +51769,7 @@ }, { "tier": 3.0, + "symbol": "TWT/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 100000.0, @@ -40038,6 +51786,7 @@ }, { "tier": 4.0, + "symbol": "TWT/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 200000.0, @@ -40054,6 +51803,7 @@ }, { "tier": 5.0, + "symbol": "TWT/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, @@ -40070,6 +51820,7 @@ }, { "tier": 6.0, + "symbol": "TWT/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -40086,6 +51837,7 @@ }, { "tier": 7.0, + "symbol": "TWT/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -40101,18 +51853,19 @@ } } ], - "TON/USDT:USDT": [ + "UMA/USDT:USDT": [ { "tier": 1.0, + "symbol": "UMA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, + "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "10000", + "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -40120,688 +51873,559 @@ }, { "tier": 2.0, + "symbol": "UMA/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 80000.0, + "minNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "80000", - "notionalFloor": "10000", + "notionalCap": "10000", + "notionalFloor": "5000", "maintMarginRatio": "0.015", - "cum": "50.0" + "cum": "25.0" } }, { "tier": 3.0, + "symbol": "UMA/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 400000.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "400000", - "notionalFloor": "80000", + "notionalCap": "50000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "450.0" + "cum": "75.0" } }, { "tier": 4.0, + "symbol": "UMA/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 800000.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "800000", - "notionalFloor": "400000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "2450.0" + "cum": "325.0" } }, { "tier": 5.0, + "symbol": "UMA/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 4000000.0, + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "4000000", - "notionalFloor": "800000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.05", - "cum": "22450.0" + "cum": "2825.0" } }, { "tier": 6.0, + "symbol": "UMA/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "8000000", - "notionalFloor": "4000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "222450.0" + "cum": "27825.0" } }, { "tier": 7.0, + "symbol": "UMA/USDT:USDT", "currency": "USDT", - "minNotional": 8000000.0, - "maxNotional": 10000000.0, + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "10000000", - "notionalFloor": "8000000", + "notionalCap": "1250000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "422450.0" + "cum": "52825.0" } }, { "tier": 8.0, + "symbol": "UMA/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "minNotional": 1250000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "3000000", + "notionalFloor": "1250000", "maintMarginRatio": "0.25", - "cum": "1672450.0" + "cum": "209075.0" } }, { "tier": 9.0, + "symbol": "UMA/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 40000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "40000000", - "notionalFloor": "20000000", - "maintMarginRatio": "0.5", - "cum": "6672450.0" - } - } - ], - "TRB/USDT:USDT": [ - { - "tier": 1.0, - "currency": "USDT", - "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 26.0, - "info": { - "bracket": "1", - "initialLeverage": "26", - "notionalCap": "5000", - "notionalFloor": "0", - "maintMarginRatio": "0.015", - "cum": "0.0" - } - }, - { - "tier": 2.0, - "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, - "info": { - "bracket": "2", - "initialLeverage": "25", - "notionalCap": "50000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, - "info": { - "bracket": "3", - "initialLeverage": "20", - "notionalCap": "100000", - "notionalFloor": "50000", - "maintMarginRatio": "0.025", - "cum": "275.0" - } - }, - { - "tier": 4.0, - "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 400000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, - "info": { - "bracket": "4", - "initialLeverage": "10", - "notionalCap": "400000", - "notionalFloor": "100000", - "maintMarginRatio": "0.05", - "cum": "2775.0" - } - }, - { - "tier": 5.0, - "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "1000000", - "notionalFloor": "400000", - "maintMarginRatio": "0.1", - "cum": "22775.0" - } - }, - { - "tier": 6.0, - "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "6", - "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1000000", - "maintMarginRatio": "0.125", - "cum": "47775.0" - } - }, - { - "tier": 7.0, - "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "4000000", - "notionalFloor": "2000000", - "maintMarginRatio": "0.25", - "cum": "297775.0" - } - }, - { - "tier": 8.0, - "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.5, - "maxLeverage": 1.0, - "info": { - "bracket": "8", - "initialLeverage": "1", - "notionalCap": "4500000", - "notionalFloor": "4000000", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "1297775.0" - } - } - ], - "TRU/USDT:USDT": [ - { - "tier": 1.0, - "currency": "USDT", - "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, - "info": { - "bracket": "1", - "initialLeverage": "20", - "notionalCap": "5000", - "notionalFloor": "0", - "maintMarginRatio": "0.02", - "cum": "0.0" + "cum": "959075.0" } - }, + } + ], + "UNFI/USDT:USDT": [ { - "tier": 2.0, + "tier": 1.0, + "symbol": "UNFI/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, + "minNotional": 0.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "maxLeverage": 11.0, "info": { - "bracket": "2", - "initialLeverage": "15", + "bracket": "1", + "initialLeverage": "11", "notionalCap": "25000", - "notionalFloor": "5000", + "notionalFloor": "0", "maintMarginRatio": "0.025", - "cum": "25.0" + "cum": "0.0" } }, { - "tier": 3.0, + "tier": 2.0, + "symbol": "UNFI/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 200000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "2", "initialLeverage": "10", - "notionalCap": "200000", + "notionalCap": "100000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "625.0" } }, { - "tier": 4.0, + "tier": 3.0, + "symbol": "UNFI/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "250000", + "notionalFloor": "100000", "maintMarginRatio": "0.1", - "cum": "10650.0" + "cum": "5625.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "UNFI/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, + "minNotional": 250000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "4", "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalFloor": "250000", "maintMarginRatio": "0.125", - "cum": "23150.0" + "cum": "11875.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "UNFI/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "2", - "notionalCap": "3000000", + "notionalCap": "1500000", "notionalFloor": "1000000", "maintMarginRatio": "0.25", - "cum": "148150.0" + "cum": "136875.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "UNFI/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 5000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "3000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "898150.0" + "cum": "511875.0" } } ], - "TRX/USDT:USDT": [ + "UNI/USDT:USDT": [ { "tier": 1.0, + "symbol": "UNI/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.0065, + "maintenanceMarginRate": 0.006, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.0065", + "maintMarginRatio": "0.006", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "UNI/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 90000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "90000", + "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.01", - "cum": "35.0" + "cum": "40.0" } }, { "tier": 3.0, + "symbol": "UNI/USDT:USDT", "currency": "USDT", - "minNotional": 90000.0, - "maxNotional": 120000.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 40.0, "info": { "bracket": "3", "initialLeverage": "40", - "notionalCap": "120000", - "notionalFloor": "90000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.015", - "cum": "485.0" + "cum": "290.0" } }, { "tier": 4.0, + "symbol": "UNI/USDT:USDT", "currency": "USDT", - "minNotional": 120000.0, - "maxNotional": 650000.0, + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "4", "initialLeverage": "25", - "notionalCap": "650000", - "notionalFloor": "120000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.02", - "cum": "1085.0" + "cum": "790.0" } }, { "tier": 5.0, + "symbol": "UNI/USDT:USDT", "currency": "USDT", - "minNotional": 650000.0, - "maxNotional": 800000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "5", "initialLeverage": "20", - "notionalCap": "800000", - "notionalFloor": "650000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.025", - "cum": "4335.0" + "cum": "3290.0" } }, { "tier": 6.0, + "symbol": "UNI/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 3000000.0, + "minNotional": 1000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "6", "initialLeverage": "10", - "notionalCap": "3000000", - "notionalFloor": "800000", + "notionalCap": "5000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.05", - "cum": "24335.0" + "cum": "28290.0" } }, { "tier": 7.0, + "symbol": "UNI/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "7", "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.1", - "cum": "174335.0" + "cum": "278290.0" } }, { "tier": 8.0, + "symbol": "UNI/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 12000000.0, + "minNotional": 10000000.0, + "maxNotional": 12500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "8", "initialLeverage": "4", - "notionalCap": "12000000", - "notionalFloor": "6000000", + "notionalCap": "12500000", + "notionalFloor": "10000000", "maintMarginRatio": "0.125", - "cum": "324335.0" + "cum": "528290.0" } }, { "tier": 9.0, + "symbol": "UNI/USDT:USDT", "currency": "USDT", - "minNotional": 12000000.0, - "maxNotional": 20000000.0, + "minNotional": 12500000.0, + "maxNotional": 25000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "20000000", - "notionalFloor": "12000000", + "notionalCap": "25000000", + "notionalFloor": "12500000", "maintMarginRatio": "0.25", - "cum": "1824335.0" + "cum": "2090790.0" } }, { "tier": 10.0, + "symbol": "UNI/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 30000000.0, + "minNotional": 25000000.0, + "maxNotional": 50000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "20000000", + "notionalCap": "50000000", + "notionalFloor": "25000000", "maintMarginRatio": "0.5", - "cum": "6824335.0" + "cum": "8340790.0" } } ], - "TURBO/USDT:USDT": [ + "USDC/USDT:USDT": [ { "tier": 1.0, + "symbol": "USDC/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.006, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "75", - "notionalCap": "10000", + "initialLeverage": "50", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.006", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "USDC/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 60000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, - "info": { - "bracket": "2", - "initialLeverage": "50", - "notionalCap": "60000", - "notionalFloor": "10000", - "maintMarginRatio": "0.015", - "cum": "50.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 300000.0, - "maintenanceMarginRate": 0.02, + "minNotional": 5000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.01, "maxLeverage": 25.0, "info": { - "bracket": "3", + "bracket": "2", "initialLeverage": "25", - "notionalCap": "300000", - "notionalFloor": "60000", - "maintMarginRatio": "0.02", - "cum": "350.0" + "notionalCap": "50000", + "notionalFloor": "5000", + "maintMarginRatio": "0.01", + "cum": "20.0" } }, { - "tier": 4.0, + "tier": 3.0, + "symbol": "USDC/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 50000.0, + "maxNotional": 900000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "300000", + "notionalCap": "900000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "1850.0" + "cum": "770.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "USDC/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 3000000.0, + "minNotional": 900000.0, + "maxNotional": 1800000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "10", - "notionalCap": "3000000", - "notionalFloor": "600000", + "notionalCap": "1800000", + "notionalFloor": "900000", "maintMarginRatio": "0.05", - "cum": "16850.0" + "cum": "23270.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "USDC/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "minNotional": 1800000.0, + "maxNotional": 4800000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "4800000", + "notionalFloor": "1800000", "maintMarginRatio": "0.1", - "cum": "166850.0" + "cum": "113270.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "USDC/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "minNotional": 4800000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "4", - "notionalCap": "7500000", - "notionalFloor": "6000000", + "notionalCap": "6000000", + "notionalFloor": "4800000", "maintMarginRatio": "0.125", - "cum": "316850.0" + "cum": "233270.0" } }, { - "tier": 8.0, + "tier": 7.0, + "symbol": "USDC/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 6000000.0, + "maxNotional": 18000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "18000000", + "notionalFloor": "6000000", "maintMarginRatio": "0.25", - "cum": "1254350.0" + "cum": "983270.0" } }, { - "tier": 9.0, + "tier": 8.0, + "symbol": "USDC/USDT:USDT", "currency": "USDT", - "minNotional": 15000000.0, + "minNotional": 18000000.0, "maxNotional": 30000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "30000000", - "notionalFloor": "15000000", + "notionalFloor": "18000000", "maintMarginRatio": "0.5", - "cum": "5004350.0" + "cum": "5483270.0" } } ], - "TWT/USDT:USDT": [ + "USTC/USDT:USDT": [ { "tier": 1.0, + "symbol": "USTC/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -40818,6 +52442,7 @@ }, { "tier": 2.0, + "symbol": "USTC/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -40834,6 +52459,7 @@ }, { "tier": 3.0, + "symbol": "USTC/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 100000.0, @@ -40850,6 +52476,7 @@ }, { "tier": 4.0, + "symbol": "USTC/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 200000.0, @@ -40866,6 +52493,7 @@ }, { "tier": 5.0, + "symbol": "USTC/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, @@ -40882,6 +52510,7 @@ }, { "tier": 6.0, + "symbol": "USTC/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -40898,6 +52527,7 @@ }, { "tier": 7.0, + "symbol": "USTC/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -40913,513 +52543,475 @@ } } ], - "UMA/USDT:USDT": [ + "USUAL/USDT:USDT": [ { "tier": 1.0, + "symbol": "USUAL/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "USUAL/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", + "initialLeverage": "50", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", "cum": "50.0" } }, { "tier": 3.0, + "symbol": "USUAL/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 30000.0, + "maxNotional": 150000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "675.0" + "initialLeverage": "25", + "notionalCap": "150000", + "notionalFloor": "30000", + "maintMarginRatio": "0.02", + "cum": "200.0" } }, { "tier": 4.0, + "symbol": "USUAL/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "4", - "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", - "maintMarginRatio": "0.1", - "cum": "10675.0" - } - }, - { - "tier": 5.0, - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "5", - "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "500000", - "maintMarginRatio": "0.125", - "cum": "23175.0" - } - }, - { - "tier": 6.0, - "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 3000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "6", - "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "1000000", - "maintMarginRatio": "0.25", - "cum": "148175.0" - } - }, - { - "tier": 7.0, - "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.5, - "maxLeverage": 1.0, - "info": { - "bracket": "7", - "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "3000000", - "maintMarginRatio": "0.5", - "cum": "898175.0" - } - } - ], - "UNFI/USDT:USDT": [ - { - "tier": 1.0, - "currency": "USDT", - "minNotional": 0.0, - "maxNotional": 25000.0, + "minNotional": 150000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 11.0, + "maxLeverage": 20.0, "info": { - "bracket": "1", - "initialLeverage": "11", - "notionalCap": "25000", - "notionalFloor": "0", + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "300000", + "notionalFloor": "150000", "maintMarginRatio": "0.025", - "cum": "0.0" + "cum": "950.0" } }, { - "tier": 2.0, + "tier": 5.0, + "symbol": "USUAL/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 100000.0, + "minNotional": 300000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "2", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "100000", - "notionalFloor": "25000", + "notionalCap": "1500000", + "notionalFloor": "300000", "maintMarginRatio": "0.05", - "cum": "625.0" + "cum": "8450.0" } }, { - "tier": 3.0, + "tier": 6.0, + "symbol": "USUAL/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 250000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "3", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "250000", - "notionalFloor": "100000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.1", - "cum": "5625.0" + "cum": "83450.0" } }, { - "tier": 4.0, + "tier": 7.0, + "symbol": "USUAL/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 1000000.0, + "minNotional": 3000000.0, + "maxNotional": 3750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "4", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "250000", + "notionalCap": "3750000", + "notionalFloor": "3000000", "maintMarginRatio": "0.125", - "cum": "11875.0" + "cum": "158450.0" } }, { - "tier": 5.0, + "tier": 8.0, + "symbol": "USUAL/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 1500000.0, + "minNotional": 3750000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "5", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1500000", - "notionalFloor": "1000000", + "notionalCap": "7500000", + "notionalFloor": "3750000", "maintMarginRatio": "0.25", - "cum": "136875.0" + "cum": "627200.0" } }, { - "tier": 6.0, + "tier": 9.0, + "symbol": "USUAL/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 7500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "15000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "511875.0" + "cum": "2502200.0" } } ], - "UNI/USDT:USDT": [ + "UXLINK/USDT:USDT": [ { "tier": 1.0, + "symbol": "UXLINK/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.006, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "10000", - "notionalFloor": "0", - "maintMarginRatio": "0.006", - "cum": "0.0" - } - }, - { - "tier": 2.0, - "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 50.0, - "info": { - "bracket": "2", - "initialLeverage": "50", - "notionalCap": "50000", - "notionalFloor": "10000", + "notionalCap": "5000", + "notionalFloor": "0", "maintMarginRatio": "0.01", - "cum": "40.0" + "cum": "0.0" } }, { - "tier": 3.0, + "tier": 2.0, + "symbol": "UXLINK/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 80000.0, + "minNotional": 5000.0, + "maxNotional": 16000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 40.0, + "maxLeverage": 50.0, "info": { - "bracket": "3", - "initialLeverage": "40", - "notionalCap": "80000", - "notionalFloor": "50000", + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "16000", + "notionalFloor": "5000", "maintMarginRatio": "0.015", - "cum": "290.0" + "cum": "25.0" } }, { - "tier": 4.0, + "tier": 3.0, + "symbol": "UXLINK/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 300000.0, + "minNotional": 16000.0, + "maxNotional": 80000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "25", - "notionalCap": "300000", - "notionalFloor": "80000", + "notionalCap": "80000", + "notionalFloor": "16000", "maintMarginRatio": "0.02", - "cum": "690.0" + "cum": "105.0" } }, { - "tier": 5.0, + "tier": 4.0, + "symbol": "UXLINK/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 900000.0, + "minNotional": 80000.0, + "maxNotional": 160000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "900000", - "notionalFloor": "300000", + "notionalCap": "160000", + "notionalFloor": "80000", "maintMarginRatio": "0.025", - "cum": "2190.0" + "cum": "505.0" } }, { - "tier": 6.0, + "tier": 5.0, + "symbol": "UXLINK/USDT:USDT", "currency": "USDT", - "minNotional": 900000.0, - "maxNotional": 3000000.0, + "minNotional": 160000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "3000000", - "notionalFloor": "900000", + "notionalCap": "800000", + "notionalFloor": "160000", "maintMarginRatio": "0.05", - "cum": "24690.0" + "cum": "4505.0" } }, { - "tier": 7.0, + "tier": 6.0, + "symbol": "UXLINK/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "minNotional": 800000.0, + "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "1600000", + "notionalFloor": "800000", "maintMarginRatio": "0.1", - "cum": "174690.0" + "cum": "44505.0" } }, { - "tier": 8.0, + "tier": 7.0, + "symbol": "UXLINK/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "minNotional": 1600000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "7500000", - "notionalFloor": "6000000", + "notionalCap": "2000000", + "notionalFloor": "1600000", "maintMarginRatio": "0.125", - "cum": "324690.0" + "cum": "84505.0" } }, { - "tier": 9.0, + "tier": 8.0, + "symbol": "UXLINK/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 18000000.0, + "minNotional": 2000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "18000000", - "notionalFloor": "7500000", + "notionalCap": "4000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.25", - "cum": "1262190.0" + "cum": "334505.0" } }, { - "tier": 10.0, + "tier": 9.0, + "symbol": "UXLINK/USDT:USDT", "currency": "USDT", - "minNotional": 18000000.0, - "maxNotional": 30000000.0, + "minNotional": 4000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "18000000", + "notionalCap": "8000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "5762190.0" + "cum": "1334505.0" } } ], - "USDC/USDT:USDT": [ + "VANA/USDT:USDT": [ { "tier": 1.0, + "symbol": "VANA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.006, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.006", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "VANA/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "minNotional": 10000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "50000", - "notionalFloor": "5000", - "maintMarginRatio": "0.01", - "cum": "20.0" + "initialLeverage": "50", + "notionalCap": "20000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "VANA/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 900000.0, + "minNotional": 20000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "100000", + "notionalFloor": "20000", + "maintMarginRatio": "0.02", + "cum": "150.0" + } + }, + { + "tier": 4.0, + "symbol": "VANA/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "900000", - "notionalFloor": "50000", + "notionalCap": "200000", + "notionalFloor": "100000", "maintMarginRatio": "0.025", - "cum": "770.0" + "cum": "650.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "VANA/USDT:USDT", "currency": "USDT", - "minNotional": 900000.0, - "maxNotional": 1800000.0, + "minNotional": 200000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "1800000", - "notionalFloor": "900000", + "notionalCap": "1000000", + "notionalFloor": "200000", "maintMarginRatio": "0.05", - "cum": "23270.0" + "cum": "5650.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "VANA/USDT:USDT", "currency": "USDT", - "minNotional": 1800000.0, - "maxNotional": 4800000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "4800000", - "notionalFloor": "1800000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.1", - "cum": "113270.0" + "cum": "55650.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "VANA/USDT:USDT", "currency": "USDT", - "minNotional": 4800000.0, - "maxNotional": 6000000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "6000000", - "notionalFloor": "4800000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "233270.0" + "cum": "105650.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "VANA/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 18000000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "18000000", - "notionalFloor": "6000000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.25", - "cum": "983270.0" + "cum": "418150.0" } }, { - "tier": 8.0, + "tier": 9.0, + "symbol": "VANA/USDT:USDT", "currency": "USDT", - "minNotional": 18000000.0, - "maxNotional": 30000000.0, + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "18000000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "5483270.0" + "cum": "1668150.0" } } ], - "USTC/USDT:USDT": [ + "VANRY/USDT:USDT": [ { "tier": 1.0, + "symbol": "VANRY/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -41436,6 +53028,7 @@ }, { "tier": 2.0, + "symbol": "VANRY/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -41452,6 +53045,7 @@ }, { "tier": 3.0, + "symbol": "VANRY/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 100000.0, @@ -41468,6 +53062,7 @@ }, { "tier": 4.0, + "symbol": "VANRY/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 200000.0, @@ -41484,6 +53079,7 @@ }, { "tier": 5.0, + "symbol": "VANRY/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, @@ -41500,6 +53096,7 @@ }, { "tier": 6.0, + "symbol": "VANRY/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -41516,6 +53113,7 @@ }, { "tier": 7.0, + "symbol": "VANRY/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -41531,9 +53129,10 @@ } } ], - "UXLINK/USDT:USDT": [ + "VELODROME/USDT:USDT": [ { "tier": 1.0, + "symbol": "VELODROME/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -41550,15 +53149,16 @@ }, { "tier": 2.0, + "symbol": "VELODROME/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 16000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "16000", + "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", "cum": "25.0" @@ -41566,364 +53166,300 @@ }, { "tier": 3.0, + "symbol": "VELODROME/USDT:USDT", "currency": "USDT", - "minNotional": 16000.0, - "maxNotional": 80000.0, + "minNotional": 10000.0, + "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "80000", - "notionalFloor": "16000", + "notionalCap": "30000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "105.0" + "cum": "75.0" } }, { "tier": 4.0, + "symbol": "VELODROME/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 160000.0, + "minNotional": 30000.0, + "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "160000", - "notionalFloor": "80000", + "notionalCap": "60000", + "notionalFloor": "30000", "maintMarginRatio": "0.025", - "cum": "505.0" + "cum": "225.0" } }, { "tier": 5.0, + "symbol": "VELODROME/USDT:USDT", "currency": "USDT", - "minNotional": 160000.0, - "maxNotional": 800000.0, + "minNotional": 60000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "800000", - "notionalFloor": "160000", + "notionalCap": "300000", + "notionalFloor": "60000", "maintMarginRatio": "0.05", - "cum": "4505.0" + "cum": "1725.0" } }, { "tier": 6.0, + "symbol": "VELODROME/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 1600000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "1600000", - "notionalFloor": "800000", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "44505.0" + "cum": "16725.0" } }, { "tier": 7.0, + "symbol": "VELODROME/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 2000000.0, + "minNotional": 600000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1600000", + "notionalCap": "750000", + "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "84505.0" + "cum": "31725.0" } }, { "tier": 8.0, + "symbol": "VELODROME/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "4000000", - "notionalFloor": "2000000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "334505.0" + "cum": "125475.0" } }, { "tier": 9.0, + "symbol": "VELODROME/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "8000000", - "notionalFloor": "4000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "1334505.0" + "cum": "500475.0" } } ], - "VANRY/USDT:USDT": [ + "VET/USDT:USDT": [ { "tier": 1.0, + "symbol": "VET/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.006, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.006", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "VET/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "50", "notionalCap": "25000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "maintMarginRatio": "0.01", + "cum": "20.0" } }, { "tier": 3.0, + "symbol": "VET/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxNotional": 40000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 40.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "100000", + "initialLeverage": "40", + "notionalCap": "40000", "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "675.0" + "maintMarginRatio": "0.015", + "cum": "145.0" } }, { "tier": 4.0, + "symbol": "VET/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, + "minNotional": 40000.0, "maxNotional": 200000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "4", - "initialLeverage": "5", + "initialLeverage": "25", "notionalCap": "200000", - "notionalFloor": "100000", - "maintMarginRatio": "0.1", - "cum": "5675.0" + "notionalFloor": "40000", + "maintMarginRatio": "0.02", + "cum": "345.0" } }, { "tier": 5.0, + "symbol": "VET/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "5", - "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "200000", - "maintMarginRatio": "0.125", - "cum": "10675.0" - } - }, - { - "tier": 6.0, - "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "6", - "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "73175.0" - } - }, - { - "tier": 7.0, - "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, - "maintenanceMarginRate": 0.5, - "maxLeverage": 1.0, - "info": { - "bracket": "7", - "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", - "maintMarginRatio": "0.5", - "cum": "323175.0" - } - } - ], - "VET/USDT:USDT": [ - { - "tier": 1.0, - "currency": "USDT", - "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.006, - "maxLeverage": 50.0, - "info": { - "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", - "notionalFloor": "0", - "maintMarginRatio": "0.006", - "cum": "0.0" - } - }, - { - "tier": 2.0, - "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, - "info": { - "bracket": "2", - "initialLeverage": "25", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.01", - "cum": "20.0" - } - }, - { - "tier": 3.0, - "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "20", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.025", - "cum": "395.0" + "cum": "1345.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "VET/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 400000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "10", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "2000000", + "notionalFloor": "400000", "maintMarginRatio": "0.05", - "cum": "5395.0" + "cum": "11345.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "VET/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 1000000.0, + "minNotional": 2000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "5", - "notionalCap": "1000000", - "notionalFloor": "400000", + "notionalCap": "4000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.1", - "cum": "25395.0" + "cum": "111345.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "VET/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, + "minNotional": 4000000.0, "maxNotional": 5000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "4", "notionalCap": "5000000", - "notionalFloor": "1000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.125", - "cum": "50395.0" + "cum": "211345.0" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "VET/USDT:USDT", "currency": "USDT", "minNotional": 5000000.0, - "maxNotional": 6000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "2", - "notionalCap": "6000000", + "notionalCap": "10000000", "notionalFloor": "5000000", "maintMarginRatio": "0.25", - "cum": "675395.0" + "cum": "836345.0" } }, { - "tier": 8.0, + "tier": 10.0, + "symbol": "VET/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 10000000.0, + "minNotional": 10000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalCap": "20000000", + "notionalFloor": "10000000", "maintMarginRatio": "0.5", - "cum": "2175395.0" + "cum": "3336345.0" } } ], "VIDT/USDT:USDT": [ { "tier": 1.0, + "symbol": "VIDT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -41940,6 +53476,7 @@ }, { "tier": 2.0, + "symbol": "VIDT/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 16000.0, @@ -41956,6 +53493,7 @@ }, { "tier": 3.0, + "symbol": "VIDT/USDT:USDT", "currency": "USDT", "minNotional": 16000.0, "maxNotional": 80000.0, @@ -41972,6 +53510,7 @@ }, { "tier": 4.0, + "symbol": "VIDT/USDT:USDT", "currency": "USDT", "minNotional": 80000.0, "maxNotional": 160000.0, @@ -41988,6 +53527,7 @@ }, { "tier": 5.0, + "symbol": "VIDT/USDT:USDT", "currency": "USDT", "minNotional": 160000.0, "maxNotional": 800000.0, @@ -42004,6 +53544,7 @@ }, { "tier": 6.0, + "symbol": "VIDT/USDT:USDT", "currency": "USDT", "minNotional": 800000.0, "maxNotional": 1600000.0, @@ -42020,6 +53561,7 @@ }, { "tier": 7.0, + "symbol": "VIDT/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, "maxNotional": 2000000.0, @@ -42036,6 +53578,7 @@ }, { "tier": 8.0, + "symbol": "VIDT/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 4000000.0, @@ -42052,6 +53595,7 @@ }, { "tier": 9.0, + "symbol": "VIDT/USDT:USDT", "currency": "USDT", "minNotional": 4000000.0, "maxNotional": 8000000.0, @@ -42067,9 +53611,165 @@ } } ], + "VIRTUAL/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "VIRTUAL/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "VIRTUAL/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "20000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "VIRTUAL/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "100000", + "notionalFloor": "20000", + "maintMarginRatio": "0.02", + "cum": "150.0" + } + }, + { + "tier": 4.0, + "symbol": "VIRTUAL/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "200000", + "notionalFloor": "100000", + "maintMarginRatio": "0.025", + "cum": "650.0" + } + }, + { + "tier": 5.0, + "symbol": "VIRTUAL/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "1000000", + "notionalFloor": "200000", + "maintMarginRatio": "0.05", + "cum": "5650.0" + } + }, + { + "tier": 6.0, + "symbol": "VIRTUAL/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "55650.0" + } + }, + { + "tier": 7.0, + "symbol": "VIRTUAL/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "2500000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "105650.0" + } + }, + { + "tier": 8.0, + "symbol": "VIRTUAL/USDT:USDT", + "currency": "USDT", + "minNotional": 2500000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "2500000", + "maintMarginRatio": "0.25", + "cum": "418150.0" + } + }, + { + "tier": 9.0, + "symbol": "VIRTUAL/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "10000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.5", + "cum": "1668150.0" + } + } + ], "VOXEL/USDT:USDT": [ { "tier": 1.0, + "symbol": "VOXEL/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -42086,6 +53786,7 @@ }, { "tier": 2.0, + "symbol": "VOXEL/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 20000.0, @@ -42102,6 +53803,7 @@ }, { "tier": 3.0, + "symbol": "VOXEL/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 25000.0, @@ -42118,6 +53820,7 @@ }, { "tier": 4.0, + "symbol": "VOXEL/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 200000.0, @@ -42134,6 +53837,7 @@ }, { "tier": 5.0, + "symbol": "VOXEL/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 400000.0, @@ -42150,6 +53854,7 @@ }, { "tier": 6.0, + "symbol": "VOXEL/USDT:USDT", "currency": "USDT", "minNotional": 400000.0, "maxNotional": 500000.0, @@ -42166,6 +53871,7 @@ }, { "tier": 7.0, + "symbol": "VOXEL/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -42182,6 +53888,7 @@ }, { "tier": 8.0, + "symbol": "VOXEL/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -42200,6 +53907,7 @@ "W/USDT:USDT": [ { "tier": 1.0, + "symbol": "W/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -42216,6 +53924,7 @@ }, { "tier": 2.0, + "symbol": "W/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 20000.0, @@ -42232,6 +53941,7 @@ }, { "tier": 3.0, + "symbol": "W/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 100000.0, @@ -42248,6 +53958,7 @@ }, { "tier": 4.0, + "symbol": "W/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 200000.0, @@ -42264,6 +53975,7 @@ }, { "tier": 5.0, + "symbol": "W/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 1000000.0, @@ -42280,6 +53992,7 @@ }, { "tier": 6.0, + "symbol": "W/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -42296,6 +54009,7 @@ }, { "tier": 7.0, + "symbol": "W/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 2500000.0, @@ -42312,6 +54026,7 @@ }, { "tier": 8.0, + "symbol": "W/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, "maxNotional": 5000000.0, @@ -42328,6 +54043,7 @@ }, { "tier": 9.0, + "symbol": "W/USDT:USDT", "currency": "USDT", "minNotional": 5000000.0, "maxNotional": 10000000.0, @@ -42346,6 +54062,7 @@ "WAVES/USDT:USDT": [ { "tier": 1.0, + "symbol": "WAVES/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -42362,6 +54079,7 @@ }, { "tier": 2.0, + "symbol": "WAVES/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 50000.0, @@ -42378,6 +54096,7 @@ }, { "tier": 3.0, + "symbol": "WAVES/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, "maxNotional": 450000.0, @@ -42394,6 +54113,7 @@ }, { "tier": 4.0, + "symbol": "WAVES/USDT:USDT", "currency": "USDT", "minNotional": 450000.0, "maxNotional": 1200000.0, @@ -42410,6 +54130,7 @@ }, { "tier": 5.0, + "symbol": "WAVES/USDT:USDT", "currency": "USDT", "minNotional": 1200000.0, "maxNotional": 1500000.0, @@ -42426,6 +54147,7 @@ }, { "tier": 6.0, + "symbol": "WAVES/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, "maxNotional": 3000000.0, @@ -42442,6 +54164,7 @@ }, { "tier": 7.0, + "symbol": "WAVES/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 3500000.0, @@ -42460,6 +54183,7 @@ "WAXP/USDT:USDT": [ { "tier": 1.0, + "symbol": "WAXP/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -42476,6 +54200,7 @@ }, { "tier": 2.0, + "symbol": "WAXP/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -42492,6 +54217,7 @@ }, { "tier": 3.0, + "symbol": "WAXP/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 150000.0, @@ -42508,6 +54234,7 @@ }, { "tier": 4.0, + "symbol": "WAXP/USDT:USDT", "currency": "USDT", "minNotional": 150000.0, "maxNotional": 300000.0, @@ -42524,6 +54251,7 @@ }, { "tier": 5.0, + "symbol": "WAXP/USDT:USDT", "currency": "USDT", "minNotional": 300000.0, "maxNotional": 750000.0, @@ -42540,6 +54268,7 @@ }, { "tier": 6.0, + "symbol": "WAXP/USDT:USDT", "currency": "USDT", "minNotional": 750000.0, "maxNotional": 1500000.0, @@ -42556,6 +54285,7 @@ }, { "tier": 7.0, + "symbol": "WAXP/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, "maxNotional": 3000000.0, @@ -42574,6 +54304,7 @@ "WIF/USDC:USDC": [ { "tier": 1.0, + "symbol": "WIF/USDC:USDC", "currency": "USDC", "minNotional": 0.0, "maxNotional": 5000.0, @@ -42590,6 +54321,7 @@ }, { "tier": 2.0, + "symbol": "WIF/USDC:USDC", "currency": "USDC", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -42606,6 +54338,7 @@ }, { "tier": 3.0, + "symbol": "WIF/USDC:USDC", "currency": "USDC", "minNotional": 25000.0, "maxNotional": 80000.0, @@ -42622,6 +54355,7 @@ }, { "tier": 4.0, + "symbol": "WIF/USDC:USDC", "currency": "USDC", "minNotional": 80000.0, "maxNotional": 800000.0, @@ -42638,6 +54372,7 @@ }, { "tier": 5.0, + "symbol": "WIF/USDC:USDC", "currency": "USDC", "minNotional": 800000.0, "maxNotional": 1600000.0, @@ -42654,6 +54389,7 @@ }, { "tier": 6.0, + "symbol": "WIF/USDC:USDC", "currency": "USDC", "minNotional": 1600000.0, "maxNotional": 2000000.0, @@ -42670,6 +54406,7 @@ }, { "tier": 7.0, + "symbol": "WIF/USDC:USDC", "currency": "USDC", "minNotional": 2000000.0, "maxNotional": 4000000.0, @@ -42686,6 +54423,7 @@ }, { "tier": 8.0, + "symbol": "WIF/USDC:USDC", "currency": "USDC", "minNotional": 4000000.0, "maxNotional": 8000000.0, @@ -42704,6 +54442,7 @@ "WIF/USDT:USDT": [ { "tier": 1.0, + "symbol": "WIF/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 20000.0, @@ -42720,6 +54459,7 @@ }, { "tier": 2.0, + "symbol": "WIF/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 200000.0, @@ -42736,6 +54476,7 @@ }, { "tier": 3.0, + "symbol": "WIF/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 1000000.0, @@ -42752,6 +54493,7 @@ }, { "tier": 4.0, + "symbol": "WIF/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -42768,6 +54510,7 @@ }, { "tier": 5.0, + "symbol": "WIF/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 10000000.0, @@ -42784,6 +54527,7 @@ }, { "tier": 6.0, + "symbol": "WIF/USDT:USDT", "currency": "USDT", "minNotional": 10000000.0, "maxNotional": 20000000.0, @@ -42800,6 +54544,7 @@ }, { "tier": 7.0, + "symbol": "WIF/USDT:USDT", "currency": "USDT", "minNotional": 20000000.0, "maxNotional": 25000000.0, @@ -42816,6 +54561,7 @@ }, { "tier": 8.0, + "symbol": "WIF/USDT:USDT", "currency": "USDT", "minNotional": 25000000.0, "maxNotional": 50000000.0, @@ -42832,6 +54578,7 @@ }, { "tier": 9.0, + "symbol": "WIF/USDT:USDT", "currency": "USDT", "minNotional": 50000000.0, "maxNotional": 100000000.0, @@ -42850,6 +54597,7 @@ "WLD/USDC:USDC": [ { "tier": 1.0, + "symbol": "WLD/USDC:USDC", "currency": "USDC", "minNotional": 0.0, "maxNotional": 5000.0, @@ -42866,6 +54614,7 @@ }, { "tier": 2.0, + "symbol": "WLD/USDC:USDC", "currency": "USDC", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -42882,6 +54631,7 @@ }, { "tier": 3.0, + "symbol": "WLD/USDC:USDC", "currency": "USDC", "minNotional": 25000.0, "maxNotional": 150000.0, @@ -42898,6 +54648,7 @@ }, { "tier": 4.0, + "symbol": "WLD/USDC:USDC", "currency": "USDC", "minNotional": 150000.0, "maxNotional": 300000.0, @@ -42914,6 +54665,7 @@ }, { "tier": 5.0, + "symbol": "WLD/USDC:USDC", "currency": "USDC", "minNotional": 300000.0, "maxNotional": 3000000.0, @@ -42930,6 +54682,7 @@ }, { "tier": 6.0, + "symbol": "WLD/USDC:USDC", "currency": "USDC", "minNotional": 3000000.0, "maxNotional": 6000000.0, @@ -42946,6 +54699,7 @@ }, { "tier": 7.0, + "symbol": "WLD/USDC:USDC", "currency": "USDC", "minNotional": 6000000.0, "maxNotional": 7500000.0, @@ -42962,6 +54716,7 @@ }, { "tier": 8.0, + "symbol": "WLD/USDC:USDC", "currency": "USDC", "minNotional": 7500000.0, "maxNotional": 15000000.0, @@ -42978,6 +54733,7 @@ }, { "tier": 9.0, + "symbol": "WLD/USDC:USDC", "currency": "USDC", "minNotional": 15000000.0, "maxNotional": 30000000.0, @@ -42996,6 +54752,7 @@ "WLD/USDT:USDT": [ { "tier": 1.0, + "symbol": "WLD/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -43012,6 +54769,7 @@ }, { "tier": 2.0, + "symbol": "WLD/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 60000.0, @@ -43028,15 +54786,16 @@ }, { "tier": 3.0, + "symbol": "WLD/USDT:USDT", "currency": "USDT", "minNotional": 60000.0, - "maxNotional": 100000.0, + "maxNotional": 160000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 40.0, "info": { "bracket": "3", "initialLeverage": "40", - "notionalCap": "100000", + "notionalCap": "160000", "notionalFloor": "60000", "maintMarginRatio": "0.015", "cum": "320.0" @@ -43044,120 +54803,128 @@ }, { "tier": 4.0, + "symbol": "WLD/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 500000.0, + "minNotional": 160000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "4", "initialLeverage": "25", - "notionalCap": "500000", - "notionalFloor": "100000", + "notionalCap": "800000", + "notionalFloor": "160000", "maintMarginRatio": "0.02", - "cum": "820.0" + "cum": "1120.0" } }, { "tier": 5.0, + "symbol": "WLD/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 800000.0, + "maxNotional": 1600000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "5", "initialLeverage": "20", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "1600000", + "notionalFloor": "800000", "maintMarginRatio": "0.025", - "cum": "3320.0" + "cum": "5120.0" } }, { "tier": 6.0, + "symbol": "WLD/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 5000000.0, + "minNotional": 1600000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "6", "initialLeverage": "10", - "notionalCap": "5000000", - "notionalFloor": "1000000", + "notionalCap": "8000000", + "notionalFloor": "1600000", "maintMarginRatio": "0.05", - "cum": "28320.0" + "cum": "45120.0" } }, { "tier": 7.0, + "symbol": "WLD/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 8000000.0, + "maxNotional": 16000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "7", "initialLeverage": "5", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "16000000", + "notionalFloor": "8000000", "maintMarginRatio": "0.1", - "cum": "278320.0" + "cum": "445120.0" } }, { "tier": 8.0, + "symbol": "WLD/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 12500000.0, + "minNotional": 16000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "8", "initialLeverage": "4", - "notionalCap": "12500000", - "notionalFloor": "10000000", + "notionalCap": "20000000", + "notionalFloor": "16000000", "maintMarginRatio": "0.125", - "cum": "528320.0" + "cum": "845120.0" } }, { "tier": 9.0, + "symbol": "WLD/USDT:USDT", "currency": "USDT", - "minNotional": 12500000.0, - "maxNotional": 25000000.0, + "minNotional": 20000000.0, + "maxNotional": 40000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "25000000", - "notionalFloor": "12500000", + "notionalCap": "40000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.25", - "cum": "2090820.0" + "cum": "3345120.0" } }, { "tier": 10.0, + "symbol": "WLD/USDT:USDT", "currency": "USDT", - "minNotional": 25000000.0, - "maxNotional": 50000000.0, + "minNotional": 40000000.0, + "maxNotional": 80000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "25000000", + "notionalCap": "80000000", + "notionalFloor": "40000000", "maintMarginRatio": "0.5", - "cum": "8340820.0" + "cum": "13345120.0" } } ], "WOO/USDT:USDT": [ { "tier": 1.0, + "symbol": "WOO/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -43174,6 +54941,7 @@ }, { "tier": 2.0, + "symbol": "WOO/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -43190,6 +54958,7 @@ }, { "tier": 3.0, + "symbol": "WOO/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 100000.0, @@ -43206,6 +54975,7 @@ }, { "tier": 4.0, + "symbol": "WOO/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 250000.0, @@ -43222,6 +54992,7 @@ }, { "tier": 5.0, + "symbol": "WOO/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, "maxNotional": 1000000.0, @@ -43238,6 +55009,7 @@ }, { "tier": 6.0, + "symbol": "WOO/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 5000000.0, @@ -43256,6 +55028,7 @@ "XAI/USDT:USDT": [ { "tier": 1.0, + "symbol": "XAI/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -43272,6 +55045,7 @@ }, { "tier": 2.0, + "symbol": "XAI/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -43288,6 +55062,7 @@ }, { "tier": 3.0, + "symbol": "XAI/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 80000.0, @@ -43304,6 +55079,7 @@ }, { "tier": 4.0, + "symbol": "XAI/USDT:USDT", "currency": "USDT", "minNotional": 80000.0, "maxNotional": 800000.0, @@ -43320,6 +55096,7 @@ }, { "tier": 5.0, + "symbol": "XAI/USDT:USDT", "currency": "USDT", "minNotional": 800000.0, "maxNotional": 1600000.0, @@ -43336,6 +55113,7 @@ }, { "tier": 6.0, + "symbol": "XAI/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, "maxNotional": 2000000.0, @@ -43352,6 +55130,7 @@ }, { "tier": 7.0, + "symbol": "XAI/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 4000000.0, @@ -43368,6 +55147,7 @@ }, { "tier": 8.0, + "symbol": "XAI/USDT:USDT", "currency": "USDT", "minNotional": 4000000.0, "maxNotional": 8000000.0, @@ -43386,14 +55166,15 @@ "XEM/USDT:USDT": [ { "tier": 1.0, + "symbol": "XEM/USDT:USDT", "currency": "USDT", "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", @@ -43402,14 +55183,15 @@ }, { "tier": 2.0, + "symbol": "XEM/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -43418,14 +55200,15 @@ }, { "tier": 3.0, + "symbol": "XEM/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 400000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "400000", "notionalFloor": "25000", "maintMarginRatio": "0.05", @@ -43434,6 +55217,7 @@ }, { "tier": 4.0, + "symbol": "XEM/USDT:USDT", "currency": "USDT", "minNotional": 400000.0, "maxNotional": 1000000.0, @@ -43450,6 +55234,7 @@ }, { "tier": 5.0, + "symbol": "XEM/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -43466,15 +55251,16 @@ }, { "tier": 6.0, + "symbol": "XEM/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, - "maxNotional": 6000000.0, + "maxNotional": 2100000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "6", "initialLeverage": "2", - "notionalCap": "6000000", + "notionalCap": "2100000", "notionalFloor": "2000000", "maintMarginRatio": "0.25", "cum": "295650.0" @@ -43482,154 +55268,181 @@ }, { "tier": 7.0, + "symbol": "XEM/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 10000000.0, + "minNotional": 2100000.0, + "maxNotional": 2200000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "7", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalCap": "2200000", + "notionalFloor": "2100000", "maintMarginRatio": "0.5", - "cum": "1795650.0" + "cum": "820650.0" } } ], "XLM/USDT:USDT": [ { "tier": 1.0, + "symbol": "XLM/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "75", "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "XLM/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 150000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "150000", + "initialLeverage": "50", + "notionalCap": "100000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "100.0" + "maintMarginRatio": "0.015", + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "XLM/USDT:USDT", "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.03, - "maxLeverage": 15.0, + "minNotional": 100000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "15", - "notionalCap": "250000", - "notionalFloor": "150000", - "maintMarginRatio": "0.03", - "cum": "850.0" + "initialLeverage": "25", + "notionalCap": "500000", + "notionalFloor": "100000", + "maintMarginRatio": "0.02", + "cum": "550.0" } }, { "tier": 4.0, + "symbol": "XLM/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, + "minNotional": 500000.0, "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "4", - "initialLeverage": "10", + "initialLeverage": "20", "notionalCap": "1000000", - "notionalFloor": "250000", - "maintMarginRatio": "0.05", - "cum": "5850.0" + "notionalFloor": "500000", + "maintMarginRatio": "0.025", + "cum": "3050.0" } }, { "tier": 5.0, + "symbol": "XLM/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "5000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.05", + "cum": "28050.0" + } + }, + { + "tier": 6.0, + "symbol": "XLM/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "10000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.1", - "cum": "55850.0" + "cum": "278050.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "XLM/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 5000000.0, + "minNotional": 10000000.0, + "maxNotional": 12500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "5000000", - "notionalFloor": "2000000", + "notionalCap": "12500000", + "notionalFloor": "10000000", "maintMarginRatio": "0.125", - "cum": "105850.0" + "cum": "528050.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "XLM/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 12500000.0, + "maxNotional": 25000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "25000000", + "notionalFloor": "12500000", "maintMarginRatio": "0.25", - "cum": "730850.0" + "cum": "2090550.0" } }, { - "tier": 8.0, + "tier": 9.0, + "symbol": "XLM/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "minNotional": 25000000.0, + "maxNotional": 50000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "50000000", + "notionalFloor": "25000000", "maintMarginRatio": "0.5", - "cum": "3230850.0" + "cum": "8340550.0" } } ], "XMR/USDT:USDT": [ { "tier": 1.0, + "symbol": "XMR/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -43646,6 +55459,7 @@ }, { "tier": 2.0, + "symbol": "XMR/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 150000.0, @@ -43662,6 +55476,7 @@ }, { "tier": 3.0, + "symbol": "XMR/USDT:USDT", "currency": "USDT", "minNotional": 150000.0, "maxNotional": 250000.0, @@ -43678,6 +55493,7 @@ }, { "tier": 4.0, + "symbol": "XMR/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, "maxNotional": 1000000.0, @@ -43694,6 +55510,7 @@ }, { "tier": 5.0, + "symbol": "XMR/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -43710,6 +55527,7 @@ }, { "tier": 6.0, + "symbol": "XMR/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 5000000.0, @@ -43726,6 +55544,7 @@ }, { "tier": 7.0, + "symbol": "XMR/USDT:USDT", "currency": "USDT", "minNotional": 5000000.0, "maxNotional": 10000000.0, @@ -43742,6 +55561,7 @@ }, { "tier": 8.0, + "symbol": "XMR/USDT:USDT", "currency": "USDT", "minNotional": 10000000.0, "maxNotional": 20000000.0, @@ -43760,6 +55580,7 @@ "XRP/USDC:USDC": [ { "tier": 1.0, + "symbol": "XRP/USDC:USDC", "currency": "USDC", "minNotional": 0.0, "maxNotional": 5000.0, @@ -43776,6 +55597,7 @@ }, { "tier": 2.0, + "symbol": "XRP/USDC:USDC", "currency": "USDC", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -43792,6 +55614,7 @@ }, { "tier": 3.0, + "symbol": "XRP/USDC:USDC", "currency": "USDC", "minNotional": 10000.0, "maxNotional": 50000.0, @@ -43808,6 +55631,7 @@ }, { "tier": 4.0, + "symbol": "XRP/USDC:USDC", "currency": "USDC", "minNotional": 50000.0, "maxNotional": 750000.0, @@ -43824,6 +55648,7 @@ }, { "tier": 5.0, + "symbol": "XRP/USDC:USDC", "currency": "USDC", "minNotional": 750000.0, "maxNotional": 3000000.0, @@ -43840,6 +55665,7 @@ }, { "tier": 6.0, + "symbol": "XRP/USDC:USDC", "currency": "USDC", "minNotional": 3000000.0, "maxNotional": 10000000.0, @@ -43856,6 +55682,7 @@ }, { "tier": 7.0, + "symbol": "XRP/USDC:USDC", "currency": "USDC", "minNotional": 10000000.0, "maxNotional": 12000000.0, @@ -43872,6 +55699,7 @@ }, { "tier": 8.0, + "symbol": "XRP/USDC:USDC", "currency": "USDC", "minNotional": 12000000.0, "maxNotional": 20000000.0, @@ -43888,6 +55716,7 @@ }, { "tier": 9.0, + "symbol": "XRP/USDC:USDC", "currency": "USDC", "minNotional": 20000000.0, "maxNotional": 30000000.0, @@ -43904,6 +55733,7 @@ }, { "tier": 10.0, + "symbol": "XRP/USDC:USDC", "currency": "USDC", "minNotional": 30000000.0, "maxNotional": 50000000.0, @@ -43922,6 +55752,7 @@ "XRP/USDT:USDT": [ { "tier": 1.0, + "symbol": "XRP/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -43938,6 +55769,7 @@ }, { "tier": 2.0, + "symbol": "XRP/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 20000.0, @@ -43954,6 +55786,7 @@ }, { "tier": 3.0, + "symbol": "XRP/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 160000.0, @@ -43970,15 +55803,16 @@ }, { "tier": 4.0, + "symbol": "XRP/USDT:USDT", "currency": "USDT", "minNotional": 160000.0, - "maxNotional": 800000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "4", "initialLeverage": "25", - "notionalCap": "800000", + "notionalCap": "1000000", "notionalFloor": "160000", "maintMarginRatio": "0.02", "cum": "1685.0" @@ -43986,104 +55820,111 @@ }, { "tier": 5.0, + "symbol": "XRP/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 1600000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "5", "initialLeverage": "20", - "notionalCap": "1600000", - "notionalFloor": "800000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.025", - "cum": "5685.0" + "cum": "6685.0" } }, { "tier": 6.0, + "symbol": "XRP/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 8000000.0, + "minNotional": 2000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "6", "initialLeverage": "10", - "notionalCap": "8000000", - "notionalFloor": "1600000", + "notionalCap": "10000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.05", - "cum": "45685.0" + "cum": "56685.0" } }, { "tier": 7.0, + "symbol": "XRP/USDT:USDT", "currency": "USDT", - "minNotional": 8000000.0, - "maxNotional": 16000000.0, + "minNotional": 10000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "7", "initialLeverage": "5", - "notionalCap": "16000000", - "notionalFloor": "8000000", + "notionalCap": "20000000", + "notionalFloor": "10000000", "maintMarginRatio": "0.1", - "cum": "445685.0" + "cum": "556685.0" } }, { "tier": 8.0, + "symbol": "XRP/USDT:USDT", "currency": "USDT", - "minNotional": 16000000.0, - "maxNotional": 20000000.0, + "minNotional": 20000000.0, + "maxNotional": 25000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "8", "initialLeverage": "4", - "notionalCap": "20000000", - "notionalFloor": "16000000", + "notionalCap": "25000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.125", - "cum": "845685.0" + "cum": "1056685.0" } }, { "tier": 9.0, + "symbol": "XRP/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 40000000.0, + "minNotional": 25000000.0, + "maxNotional": 50000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "40000000", - "notionalFloor": "20000000", + "notionalCap": "50000000", + "notionalFloor": "25000000", "maintMarginRatio": "0.25", - "cum": "3345685.0" + "cum": "4181685.0" } }, { "tier": 10.0, + "symbol": "XRP/USDT:USDT", "currency": "USDT", - "minNotional": 40000000.0, - "maxNotional": 80000000.0, + "minNotional": 50000000.0, + "maxNotional": 100000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "80000000", - "notionalFloor": "40000000", + "notionalCap": "100000000", + "notionalFloor": "50000000", "maintMarginRatio": "0.5", - "cum": "13345685.0" + "cum": "16681685.0" } } ], "XTZ/USDT:USDT": [ { "tier": 1.0, + "symbol": "XTZ/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -44100,6 +55941,7 @@ }, { "tier": 2.0, + "symbol": "XTZ/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 150000.0, @@ -44116,6 +55958,7 @@ }, { "tier": 3.0, + "symbol": "XTZ/USDT:USDT", "currency": "USDT", "minNotional": 150000.0, "maxNotional": 250000.0, @@ -44132,6 +55975,7 @@ }, { "tier": 4.0, + "symbol": "XTZ/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, "maxNotional": 1000000.0, @@ -44148,6 +55992,7 @@ }, { "tier": 5.0, + "symbol": "XTZ/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -44164,6 +56009,7 @@ }, { "tier": 6.0, + "symbol": "XTZ/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 5000000.0, @@ -44180,6 +56026,7 @@ }, { "tier": 7.0, + "symbol": "XTZ/USDT:USDT", "currency": "USDT", "minNotional": 5000000.0, "maxNotional": 10000000.0, @@ -44196,6 +56043,7 @@ }, { "tier": 8.0, + "symbol": "XTZ/USDT:USDT", "currency": "USDT", "minNotional": 10000000.0, "maxNotional": 15000000.0, @@ -44214,6 +56062,7 @@ "XVG/USDT:USDT": [ { "tier": 1.0, + "symbol": "XVG/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 25000.0, @@ -44230,6 +56079,7 @@ }, { "tier": 2.0, + "symbol": "XVG/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 200000.0, @@ -44246,6 +56096,7 @@ }, { "tier": 3.0, + "symbol": "XVG/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, @@ -44262,6 +56113,7 @@ }, { "tier": 4.0, + "symbol": "XVG/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -44278,6 +56130,7 @@ }, { "tier": 5.0, + "symbol": "XVG/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 3000000.0, @@ -44294,6 +56147,7 @@ }, { "tier": 6.0, + "symbol": "XVG/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 5000000.0, @@ -44312,120 +56166,162 @@ "XVS/USDT:USDT": [ { "tier": 1.0, + "symbol": "XVS/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "20", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "XVS/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "15", - "notionalCap": "25000", + "initialLeverage": "50", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.015", "cum": "25.0" } }, { "tier": 3.0, + "symbol": "XVS/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "XVS/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "325.0" + } + }, + { + "tier": 5.0, + "symbol": "XVS/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "3", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "2825.0" } }, { - "tier": 4.0, + "tier": 6.0, + "symbol": "XVS/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "10650.0" + "cum": "27825.0" } }, { - "tier": 5.0, + "tier": 7.0, + "symbol": "XVS/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "5", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "1250000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "23150.0" + "cum": "52825.0" } }, { - "tier": 6.0, + "tier": 8.0, + "symbol": "XVS/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, + "minNotional": 1250000.0, "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "2", "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalFloor": "1250000", "maintMarginRatio": "0.25", - "cum": "148150.0" + "cum": "209075.0" } }, { - "tier": 7.0, + "tier": 9.0, + "symbol": "XVS/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "9", "initialLeverage": "1", "notionalCap": "5000000", "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "898150.0" + "cum": "959075.0" } } ], "YFI/USDT:USDT": [ { "tier": 1.0, + "symbol": "YFI/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -44442,6 +56338,7 @@ }, { "tier": 2.0, + "symbol": "YFI/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 50000.0, @@ -44458,6 +56355,7 @@ }, { "tier": 3.0, + "symbol": "YFI/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, "maxNotional": 400000.0, @@ -44474,6 +56372,7 @@ }, { "tier": 4.0, + "symbol": "YFI/USDT:USDT", "currency": "USDT", "minNotional": 400000.0, "maxNotional": 1000000.0, @@ -44490,6 +56389,7 @@ }, { "tier": 5.0, + "symbol": "YFI/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -44506,6 +56406,7 @@ }, { "tier": 6.0, + "symbol": "YFI/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 6000000.0, @@ -44522,6 +56423,7 @@ }, { "tier": 7.0, + "symbol": "YFI/USDT:USDT", "currency": "USDT", "minNotional": 6000000.0, "maxNotional": 10000000.0, @@ -44540,6 +56442,7 @@ "YGG/USDT:USDT": [ { "tier": 1.0, + "symbol": "YGG/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -44556,6 +56459,7 @@ }, { "tier": 2.0, + "symbol": "YGG/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -44572,6 +56476,7 @@ }, { "tier": 3.0, + "symbol": "YGG/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 200000.0, @@ -44588,6 +56493,7 @@ }, { "tier": 4.0, + "symbol": "YGG/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 500000.0, @@ -44604,6 +56510,7 @@ }, { "tier": 5.0, + "symbol": "YGG/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -44620,6 +56527,7 @@ }, { "tier": 6.0, + "symbol": "YGG/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 3000000.0, @@ -44636,6 +56544,7 @@ }, { "tier": 7.0, + "symbol": "YGG/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 5000000.0, @@ -44654,6 +56563,7 @@ "ZEC/USDT:USDT": [ { "tier": 1.0, + "symbol": "ZEC/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 50000.0, @@ -44670,6 +56580,7 @@ }, { "tier": 2.0, + "symbol": "ZEC/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, "maxNotional": 150000.0, @@ -44686,6 +56597,7 @@ }, { "tier": 3.0, + "symbol": "ZEC/USDT:USDT", "currency": "USDT", "minNotional": 150000.0, "maxNotional": 250000.0, @@ -44702,6 +56614,7 @@ }, { "tier": 4.0, + "symbol": "ZEC/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, "maxNotional": 500000.0, @@ -44718,6 +56631,7 @@ }, { "tier": 5.0, + "symbol": "ZEC/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -44734,6 +56648,7 @@ }, { "tier": 6.0, + "symbol": "ZEC/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -44750,6 +56665,7 @@ }, { "tier": 7.0, + "symbol": "ZEC/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 5000000.0, @@ -44768,136 +56684,162 @@ "ZEN/USDT:USDT": [ { "tier": 1.0, + "symbol": "ZEN/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "ZEN/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 20000.0, + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "ZEN/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 150000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { - "bracket": "2", + "bracket": "3", "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "5000", + "notionalCap": "150000", + "notionalFloor": "30000", "maintMarginRatio": "0.02", - "cum": "25.0" + "cum": "200.0" } }, { - "tier": 3.0, + "tier": 4.0, + "symbol": "ZEN/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 25000.0, + "minNotional": 150000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "20000", + "notionalCap": "300000", + "notionalFloor": "150000", "maintMarginRatio": "0.025", - "cum": "125.0" + "cum": "950.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "ZEN/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 300000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "1500000", + "notionalFloor": "300000", "maintMarginRatio": "0.05", - "cum": "750.0" + "cum": "8450.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "ZEN/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.1", - "cum": "10750.0" + "cum": "83450.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "ZEN/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 3000000.0, + "maxNotional": 3750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "3750000", + "notionalFloor": "3000000", "maintMarginRatio": "0.125", - "cum": "20750.0" + "cum": "158450.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "ZEN/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 3750000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "7500000", + "notionalFloor": "3750000", "maintMarginRatio": "0.25", - "cum": "83250.0" + "cum": "627200.0" } }, { - "tier": 8.0, + "tier": 9.0, + "symbol": "ZEN/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 7500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "15000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "333250.0" + "cum": "2502200.0" } } ], "ZETA/USDT:USDT": [ { "tier": 1.0, + "symbol": "ZETA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -44914,6 +56856,7 @@ }, { "tier": 2.0, + "symbol": "ZETA/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 16000.0, @@ -44930,6 +56873,7 @@ }, { "tier": 3.0, + "symbol": "ZETA/USDT:USDT", "currency": "USDT", "minNotional": 16000.0, "maxNotional": 80000.0, @@ -44946,6 +56890,7 @@ }, { "tier": 4.0, + "symbol": "ZETA/USDT:USDT", "currency": "USDT", "minNotional": 80000.0, "maxNotional": 160000.0, @@ -44962,6 +56907,7 @@ }, { "tier": 5.0, + "symbol": "ZETA/USDT:USDT", "currency": "USDT", "minNotional": 160000.0, "maxNotional": 800000.0, @@ -44978,6 +56924,7 @@ }, { "tier": 6.0, + "symbol": "ZETA/USDT:USDT", "currency": "USDT", "minNotional": 800000.0, "maxNotional": 1600000.0, @@ -44994,6 +56941,7 @@ }, { "tier": 7.0, + "symbol": "ZETA/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, "maxNotional": 2000000.0, @@ -45010,6 +56958,7 @@ }, { "tier": 8.0, + "symbol": "ZETA/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 4000000.0, @@ -45026,6 +56975,7 @@ }, { "tier": 9.0, + "symbol": "ZETA/USDT:USDT", "currency": "USDT", "minNotional": 4000000.0, "maxNotional": 8000000.0, @@ -45044,6 +56994,7 @@ "ZIL/USDT:USDT": [ { "tier": 1.0, + "symbol": "ZIL/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -45060,6 +57011,7 @@ }, { "tier": 2.0, + "symbol": "ZIL/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 50000.0, @@ -45076,6 +57028,7 @@ }, { "tier": 3.0, + "symbol": "ZIL/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, "maxNotional": 600000.0, @@ -45092,6 +57045,7 @@ }, { "tier": 4.0, + "symbol": "ZIL/USDT:USDT", "currency": "USDT", "minNotional": 600000.0, "maxNotional": 1600000.0, @@ -45108,6 +57062,7 @@ }, { "tier": 5.0, + "symbol": "ZIL/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, "maxNotional": 2000000.0, @@ -45124,6 +57079,7 @@ }, { "tier": 6.0, + "symbol": "ZIL/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 6000000.0, @@ -45140,6 +57096,7 @@ }, { "tier": 7.0, + "symbol": "ZIL/USDT:USDT", "currency": "USDT", "minNotional": 6000000.0, "maxNotional": 10000000.0, @@ -45158,6 +57115,7 @@ "ZK/USDT:USDT": [ { "tier": 1.0, + "symbol": "ZK/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -45174,6 +57132,7 @@ }, { "tier": 2.0, + "symbol": "ZK/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 20000.0, @@ -45190,6 +57149,7 @@ }, { "tier": 3.0, + "symbol": "ZK/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, "maxNotional": 100000.0, @@ -45206,6 +57166,7 @@ }, { "tier": 4.0, + "symbol": "ZK/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, "maxNotional": 200000.0, @@ -45222,6 +57183,7 @@ }, { "tier": 5.0, + "symbol": "ZK/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, "maxNotional": 1000000.0, @@ -45238,6 +57200,7 @@ }, { "tier": 6.0, + "symbol": "ZK/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 2000000.0, @@ -45254,6 +57217,7 @@ }, { "tier": 7.0, + "symbol": "ZK/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 2500000.0, @@ -45270,6 +57234,7 @@ }, { "tier": 8.0, + "symbol": "ZK/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, "maxNotional": 5000000.0, @@ -45286,6 +57251,7 @@ }, { "tier": 9.0, + "symbol": "ZK/USDT:USDT", "currency": "USDT", "minNotional": 5000000.0, "maxNotional": 10000000.0, @@ -45304,6 +57270,7 @@ "ZRO/USDT:USDT": [ { "tier": 1.0, + "symbol": "ZRO/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 10000.0, @@ -45320,6 +57287,7 @@ }, { "tier": 2.0, + "symbol": "ZRO/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 30000.0, @@ -45336,6 +57304,7 @@ }, { "tier": 3.0, + "symbol": "ZRO/USDT:USDT", "currency": "USDT", "minNotional": 30000.0, "maxNotional": 150000.0, @@ -45352,6 +57321,7 @@ }, { "tier": 4.0, + "symbol": "ZRO/USDT:USDT", "currency": "USDT", "minNotional": 150000.0, "maxNotional": 300000.0, @@ -45368,6 +57338,7 @@ }, { "tier": 5.0, + "symbol": "ZRO/USDT:USDT", "currency": "USDT", "minNotional": 300000.0, "maxNotional": 1500000.0, @@ -45384,6 +57355,7 @@ }, { "tier": 6.0, + "symbol": "ZRO/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, "maxNotional": 3000000.0, @@ -45400,6 +57372,7 @@ }, { "tier": 7.0, + "symbol": "ZRO/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 3750000.0, @@ -45416,6 +57389,7 @@ }, { "tier": 8.0, + "symbol": "ZRO/USDT:USDT", "currency": "USDT", "minNotional": 3750000.0, "maxNotional": 7500000.0, @@ -45432,6 +57406,7 @@ }, { "tier": 9.0, + "symbol": "ZRO/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, "maxNotional": 15000000.0, @@ -45450,130 +57425,155 @@ "ZRX/USDT:USDT": [ { "tier": 1.0, + "symbol": "ZRX/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, { "tier": 2.0, + "symbol": "ZRX/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "20000", + "initialLeverage": "50", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.015", "cum": "25.0" } }, { "tier": 3.0, + "symbol": "ZRX/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 25000.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "ZRX/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { - "bracket": "3", + "bracket": "4", "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "20000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "125.0" + "cum": "325.0" } }, { - "tier": 4.0, + "tier": 5.0, + "symbol": "ZRX/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, + "minNotional": 100000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", + "notionalCap": "500000", + "notionalFloor": "100000", "maintMarginRatio": "0.05", - "cum": "750.0" + "cum": "2825.0" } }, { - "tier": 5.0, + "tier": 6.0, + "symbol": "ZRX/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "10750.0" + "cum": "27825.0" } }, { - "tier": 6.0, + "tier": 7.0, + "symbol": "ZRX/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "1250000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "20750.0" + "cum": "52825.0" } }, { - "tier": 7.0, + "tier": 8.0, + "symbol": "ZRX/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 1250000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "2500000", + "notionalFloor": "1250000", "maintMarginRatio": "0.25", - "cum": "83250.0" + "cum": "209075.0" } }, { - "tier": 8.0, + "tier": 9.0, + "symbol": "ZRX/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 2500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "5000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "333250.0" + "cum": "834075.0" } } ] diff --git a/freqtrade/exchange/binance_public_data.py b/freqtrade/exchange/binance_public_data.py new file mode 100644 index 00000000000..fdc9a993da2 --- /dev/null +++ b/freqtrade/exchange/binance_public_data.py @@ -0,0 +1,281 @@ +""" +Fetch daily-archived OHLCV data from https://data.binance.vision/ +""" + +import asyncio +import logging +import zipfile +from datetime import date, timedelta +from io import BytesIO +from typing import Any + +import aiohttp +import pandas as pd +from pandas import DataFrame + +from freqtrade.enums import CandleType +from freqtrade.misc import chunks +from freqtrade.util.datetime_helpers import dt_from_ts, dt_now + + +logger = logging.getLogger(__name__) + + +class Http404(Exception): + def __init__(self, msg, date, url): + super().__init__(msg) + self.date = date + self.url = url + + +class BadHttpStatus(Exception): + """Not 200/404""" + + pass + + +async def download_archive_ohlcv( + candle_type: CandleType, + pair: str, + timeframe: str, + *, + since_ms: int, + until_ms: int | None, + markets: dict[str, Any], + stop_on_404: bool = True, +) -> DataFrame: + """ + Fetch OHLCV data from https://data.binance.vision + The function makes its best effort to download data within the time range + [`since_ms`, `until_ms`] -- including `since_ms`, but excluding `until_ms`. + If `stop_one_404` is True, this returned DataFrame is guaranteed to start from `since_ms` + with no gaps in the data. + + :candle_type: Currently only spot and futures are supported + :pair: symbol name in CCXT convention + :since_ms: the start timestamp of data, including itself + :until_ms: the end timestamp of data, excluding itself + :param until_ms: `None` indicates the timestamp of the latest available data + :markets: the CCXT markets dict, when it's None, the function will load the markets data + from a new `ccxt.binance` instance + :param stop_on_404: Stop to download the following data when a 404 returned + :return: the date range is between [since_ms, until_ms), return an empty DataFrame if no data + available in the time range + """ + try: + if candle_type == CandleType.SPOT: + asset_type_url_segment = "spot" + elif candle_type == CandleType.FUTURES: + asset_type_url_segment = "futures/um" + else: + raise ValueError(f"Unsupported CandleType: {candle_type}") + + symbol = markets[pair]["id"] + + start = dt_from_ts(since_ms) + end = dt_from_ts(until_ms) if until_ms else dt_now() + + # We use two days ago as the last available day because the daily archives are daily + # uploaded and have several hours delay + last_available_date = dt_now() - timedelta(days=2) + end = min(end, last_available_date) + if start >= end: + return DataFrame() + df = await _download_archive_ohlcv( + asset_type_url_segment, symbol, pair, timeframe, start, end, stop_on_404 + ) + logger.debug( + f"Downloaded data for {pair} from https://data.binance.vision with length {len(df)}." + ) + except Exception as e: + logger.warning( + "An exception occurred during fast download from Binance, falling back to " + "the slower REST API, this can take more time.", + exc_info=e, + ) + df = DataFrame() + + if not df.empty: + # only return the data within the requested time range + return df.loc[(df["date"] >= start) & (df["date"] < end)] + else: + return df + + +def concat_safe(dfs) -> DataFrame: + if all(df is None for df in dfs): + return DataFrame() + else: + return pd.concat(dfs) + + +async def _download_archive_ohlcv( + asset_type_url_segment: str, + symbol: str, + pair: str, + timeframe: str, + start: date, + end: date, + stop_on_404: bool, +) -> DataFrame: + # daily dataframes, `None` indicates missing data in that day (when `stop_on_404` is False) + dfs: list[DataFrame | None] = [] + # the current day being processing, starting at 1. + current_day = 0 + + connector = aiohttp.TCPConnector(limit=100) + async with aiohttp.ClientSession(connector=connector, trust_env=True) as session: + # the HTTP connections has been throttled by TCPConnector + for dates in chunks(list(date_range(start, end)), 1000): + tasks = [ + asyncio.create_task( + get_daily_ohlcv(asset_type_url_segment, symbol, timeframe, date, session) + ) + for date in dates + ] + for task in tasks: + current_day += 1 + try: + df = await task + except Http404 as e: + if stop_on_404: + logger.debug(f"Failed to download {e.url} due to 404.") + + # A 404 error on the first day indicates missing data + # on https://data.binance.vision, we provide the warning and the advice. + # https://github.com/freqtrade/freqtrade/blob/acc53065e5fa7ab5197073276306dc9dc3adbfa3/tests/exchange_online/test_binance_compare_ohlcv.py#L7 + if current_day == 1: + logger.warning( + f"Fast download is unavailable due to missing data: " + f"{e.url}. Falling back to the slower REST API, " + "which may take more time." + ) + if pair in ["BTC/USDT:USDT", "ETH/USDT:USDT", "BCH/USDT:USDT"]: + logger.warning( + f"To avoid the delay, you can first download {pair} using " + "`--timerange -20200101`, and then download the " + "remaining data with `--timerange 20200101-`." + ) + else: + logger.warning( + f"Binance fast download for {pair} stopped at {e.date} due to " + f"missing data: {e.url}, falling back to rest API for the " + "remaining data, this can take more time." + ) + await cancel_and_await_tasks(tasks[tasks.index(task) + 1 :]) + return concat_safe(dfs) + else: + dfs.append(None) + except BaseException as e: + logger.warning(f"An exception raised: : {e}") + # Directly return the existing data, do not allow the gap within the data + await cancel_and_await_tasks(tasks[tasks.index(task) + 1 :]) + return concat_safe(dfs) + else: + dfs.append(df) + return concat_safe(dfs) + + +async def cancel_and_await_tasks(unawaited_tasks): + """Cancel and await the tasks""" + logger.debug("Try to cancel uncompleted download tasks.") + for task in unawaited_tasks: + task.cancel() + await asyncio.gather(*unawaited_tasks, return_exceptions=True) + logger.debug("All download tasks were awaited.") + + +def date_range(start: date, end: date): + date = start + while date <= end: + yield date + date += timedelta(days=1) + + +def binance_vision_zip_name(symbol: str, timeframe: str, date: date) -> str: + return f"{symbol}-{timeframe}-{date.strftime('%Y-%m-%d')}.zip" + + +def binance_vision_zip_url( + asset_type_url_segment: str, symbol: str, timeframe: str, date: date +) -> str: + """ + example urls: + https://data.binance.vision/data/spot/daily/klines/BTCUSDT/1s/BTCUSDT-1s-2023-10-27.zip + https://data.binance.vision/data/futures/um/daily/klines/BTCUSDT/1h/BTCUSDT-1h-2023-10-27.zip + """ + url = ( + f"https://data.binance.vision/data/{asset_type_url_segment}/daily/klines/{symbol}" + f"/{timeframe}/{binance_vision_zip_name(symbol, timeframe, date)}" + ) + return url + + +async def get_daily_ohlcv( + asset_type_url_segment: str, + symbol: str, + timeframe: str, + date: date, + session: aiohttp.ClientSession, + retry_count: int = 3, + retry_delay: float = 0.0, +) -> DataFrame: + """ + Get daily OHLCV from https://data.binance.vision + See https://github.com/binance/binance-public-data + + :asset_type_url_segment: `spot` or `futures/um` + :symbol: binance symbol name, e.g. BTCUSDT + :timeframe: e.g. 1m, 1h + :date: the returned DataFrame will cover the entire day of `date` in UTC + :session: an aiohttp.ClientSession instance + :retry_count: times to retry before returning the exceptions + :retry_delay: the time to wait before every retry + :return: A dataframe containing columns date,open,high,low,close,volume + """ + + url = binance_vision_zip_url(asset_type_url_segment, symbol, timeframe, date) + + logger.debug(f"download data from binance: {url}") + + retry = 0 + while True: + if retry > 0: + sleep_secs = retry * retry_delay + logger.debug( + f"[{retry}/{retry_count}] retry to download {url} after {sleep_secs} seconds" + ) + await asyncio.sleep(sleep_secs) + try: + async with session.get(url) as resp: + if resp.status == 200: + content = await resp.read() + logger.debug(f"Successfully downloaded {url}") + with zipfile.ZipFile(BytesIO(content)) as zipf: + with zipf.open(zipf.namelist()[0]) as csvf: + # https://github.com/binance/binance-public-data/issues/283 + first_byte = csvf.read(1)[0] + if chr(first_byte).isdigit(): + header = None + else: + header = 0 + csvf.seek(0) + + df = pd.read_csv( + csvf, + usecols=[0, 1, 2, 3, 4, 5], + names=["date", "open", "high", "low", "close", "volume"], + header=header, + ) + df["date"] = pd.to_datetime(df["date"], unit="ms", utc=True) + return df + elif resp.status == 404: + logger.debug(f"Failed to download {url}") + raise Http404(f"404: {url}", date, url) + else: + raise BadHttpStatus(f"{resp.status} - {resp.reason}") + except Exception as e: + retry += 1 + if isinstance(e, Http404) or retry > retry_count: + logger.debug(f"Failed to get data from {url}: {e}") + raise diff --git a/freqtrade/exchange/bitpanda.py b/freqtrade/exchange/bitpanda.py index cca961cb76f..05c5af6ac13 100644 --- a/freqtrade/exchange/bitpanda.py +++ b/freqtrade/exchange/bitpanda.py @@ -2,7 +2,6 @@ import logging from datetime import datetime, timezone -from typing import Optional from freqtrade.exchange import Exchange @@ -17,7 +16,7 @@ class Bitpanda(Exchange): """ def get_trades_for_order( - self, order_id: str, pair: str, since: datetime, params: Optional[dict] = None + self, order_id: str, pair: str, since: datetime, params: dict | None = None ) -> list: """ Fetch Orders using the "fetch_my_trades" endpoint and filter them by order-id. diff --git a/freqtrade/exchange/bybit.py b/freqtrade/exchange/bybit.py index 9c70cf7a06d..72cfe52c09d 100644 --- a/freqtrade/exchange/bybit.py +++ b/freqtrade/exchange/bybit.py @@ -2,16 +2,16 @@ import logging from datetime import datetime, timedelta -from typing import Any, Optional +from typing import Any import ccxt from freqtrade.constants import BuySell -from freqtrade.enums import CandleType, MarginMode, PriceType, TradingMode +from freqtrade.enums import MarginMode, PriceType, TradingMode from freqtrade.exceptions import DDosProtection, ExchangeError, OperationalException, TemporaryError from freqtrade.exchange import Exchange from freqtrade.exchange.common import retrier -from freqtrade.exchange.exchange_types import FtHas +from freqtrade.exchange.exchange_types import CcxtOrder, FtHas from freqtrade.util.datetime_helpers import dt_now, dt_ts @@ -47,6 +47,7 @@ class Bybit(Exchange): "ohlcv_has_history": True, "mark_ohlcv_timeframe": "4h", "funding_fee_timeframe": "8h", + "funding_fee_candle_limit": 200, "stoploss_on_exchange": True, "stoploss_order_types": {"limit": "limit", "market": "market"}, # bybit response parsing fails to populate stopLossPrice @@ -114,14 +115,6 @@ def additional_exchange_init(self) -> None: except ccxt.BaseError as e: raise OperationalException(e) from e - def ohlcv_candle_limit( - self, timeframe: str, candle_type: CandleType, since_ms: Optional[int] = None - ) -> int: - if candle_type in (CandleType.FUNDING_RATE): - return 200 - - return super().ohlcv_candle_limit(timeframe, candle_type, since_ms) - def _lev_prep(self, pair: str, leverage: float, side: BuySell, accept_fail: bool = False): if self.trading_mode != TradingMode.SPOT: params = {"leverage": leverage} @@ -147,6 +140,17 @@ def _get_params( params["position_idx"] = 0 return params + def _order_needs_price(self, side: BuySell, ordertype: str) -> bool: + # Bybit requires price for market orders - but only for classic accounts, + # and only in spot mode + return ( + ordertype != "market" + or ( + side == "buy" and not self.unified_account and self.trading_mode == TradingMode.SPOT + ) + or self._ft_has.get("marketOrderRequiresPrice", False) + ) + def dry_run_liquidation_price( self, pair: str, @@ -157,7 +161,7 @@ def dry_run_liquidation_price( leverage: float, wallet_balance: float, # Or margin balance open_trades: list, - ) -> Optional[float]: + ) -> float | None: """ Important: Must be fetching data from cached values as this is used by backtesting! PERPETUAL: @@ -229,7 +233,9 @@ def get_funding_fees( logger.warning(f"Could not update funding fees for {pair}.") return 0.0 - def fetch_orders(self, pair: str, since: datetime, params: Optional[dict] = None) -> list[dict]: + def fetch_orders( + self, pair: str, since: datetime, params: dict | None = None + ) -> list[CcxtOrder]: """ Fetch all orders for a pair "since" :param pair: Pair for the query @@ -246,7 +252,7 @@ def fetch_orders(self, pair: str, since: datetime, params: Optional[dict] = None return orders - def fetch_order(self, order_id: str, pair: str, params: Optional[dict] = None) -> dict: + def fetch_order(self, order_id: str, pair: str, params: dict | None = None) -> CcxtOrder: if self.exchange_has("fetchOrder"): # Set acknowledged to True to avoid ccxt exception params = {"acknowledged": True} diff --git a/freqtrade/exchange/common.py b/freqtrade/exchange/common.py index b32216b0519..4fd9cea634c 100644 --- a/freqtrade/exchange/common.py +++ b/freqtrade/exchange/common.py @@ -1,8 +1,9 @@ import asyncio import logging import time +from collections.abc import Callable from functools import wraps -from typing import Any, Callable, Optional, TypeVar, cast, overload +from typing import Any, TypeVar, cast, overload from freqtrade.constants import ExchangeConfig from freqtrade.exceptions import DDosProtection, RetryableOrderError, TemporaryError @@ -57,6 +58,7 @@ def _get_logging_mixin(): "bybit", "gate", "htx", + "hyperliquid", "kraken", "okx", ] @@ -172,7 +174,7 @@ def retrier(_func: F, *, retries=API_RETRY_COUNT) -> F: ... def retrier(*, retries=API_RETRY_COUNT) -> Callable[[F], F]: ... -def retrier(_func: Optional[F] = None, *, retries=API_RETRY_COUNT): +def retrier(_func: F | None = None, *, retries=API_RETRY_COUNT): def decorator(f: F) -> F: @wraps(f) def wrapper(*args, **kwargs): @@ -185,7 +187,7 @@ def wrapper(*args, **kwargs): logger.warning(msg + f"Retrying still for {count} times.") count -= 1 kwargs.update({"count": count}) - if isinstance(ex, (DDosProtection, RetryableOrderError)): + if isinstance(ex, DDosProtection | RetryableOrderError): # increasing backoff backoff_delay = calculate_backoff(count + 1, retries) logger.info(f"Applying DDosProtection backoff delay: {backoff_delay}") diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index f7fb8a9c7b2..bba6c5aaf05 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -7,12 +7,12 @@ import inspect import logging import signal -from collections.abc import Coroutine +from collections.abc import Coroutine, Generator from copy import deepcopy from datetime import datetime, timedelta, timezone from math import floor, isnan from threading import Lock -from typing import Any, Literal, Optional, Union +from typing import Any, Literal, TypeGuard import ccxt import ccxt.pro as ccxt_pro @@ -70,6 +70,7 @@ ) from freqtrade.exchange.exchange_types import ( CcxtBalances, + CcxtOrder, CcxtPosition, FtHas, OHLCVResponse, @@ -169,7 +170,7 @@ def __init__( self, config: Config, *, - exchange_config: Optional[ExchangeConfig] = None, + exchange_config: ExchangeConfig | None = None, validate: bool = True, load_leverage_tiers: bool = False, ) -> None: @@ -181,7 +182,7 @@ def __init__( self._api: ccxt.Exchange self._api_async: ccxt_pro.Exchange self._ws_async: ccxt_pro.Exchange = None - self._exchange_ws: Optional[ExchangeWS] = None + self._exchange_ws: ExchangeWS | None = None self._markets: dict = {} self._trading_fees: dict[str, Any] = {} self._leverage_tiers: dict[str, list[dict]] = {} @@ -198,9 +199,9 @@ def __init__( # Timestamp of last markets refresh self._last_markets_refresh: int = 0 - # Cache for 10 minutes ... self._cache_lock = Lock() - self._fetch_tickers_cache: TTLCache = TTLCache(maxsize=2, ttl=60 * 10) + # Cache for 10 minutes ... + self._fetch_tickers_cache: TTLCache = TTLCache(maxsize=4, ttl=60 * 10) # Cache values for 300 to avoid frequent polling of the exchange for prices # Caching only applies to RPC methods, so prices for open trades are still # refreshed once every iteration. @@ -378,7 +379,7 @@ def _init_ccxt( logger.info("Applying additional ccxt config: %s", ccxt_kwargs) if self._ccxt_params: # Inject static options after the above output to not confuse users. - ccxt_kwargs = deep_merge_dicts(self._ccxt_params, ccxt_kwargs) + ccxt_kwargs = deep_merge_dicts(self._ccxt_params, deepcopy(ccxt_kwargs)) if ccxt_kwargs: ex_config.update(ccxt_kwargs) try: @@ -452,28 +453,31 @@ def _log_exchange_response(self, endpoint: str, response, *, add_info=None) -> N logger.info(f"API {endpoint}: {add_info_str}{response}") def ohlcv_candle_limit( - self, timeframe: str, candle_type: CandleType, since_ms: Optional[int] = None + self, timeframe: str, candle_type: CandleType, since_ms: int | None = None ) -> int: """ Exchange ohlcv candle limit Uses ohlcv_candle_limit_per_timeframe if the exchange has different limits per timeframe (e.g. bittrex), otherwise falls back to ohlcv_candle_limit - TODO: this is most likely no longer needed since only bittrex needed this. :param timeframe: Timeframe to check :param candle_type: Candle-type :param since_ms: Starting timestamp :return: Candle limit as integer """ + + fallback_val = self._ft_has.get("ohlcv_candle_limit") + if candle_type == CandleType.FUNDING_RATE: + fallback_val = self._ft_has.get("funding_fee_candle_limit", fallback_val) return int( self._ft_has.get("ohlcv_candle_limit_per_timeframe", {}).get( - timeframe, str(self._ft_has.get("ohlcv_candle_limit")) + timeframe, str(fallback_val) ) ) def get_markets( self, - base_currencies: Optional[list[str]] = None, - quote_currencies: Optional[list[str]] = None, + base_currencies: list[str] | None = None, + quote_currencies: list[str] | None = None, spot_only: bool = False, margin_only: bool = False, futures_only: bool = False, @@ -522,6 +526,7 @@ def get_pair_base_currency(self, pair: str) -> str: def market_is_future(self, market: dict[str, Any]) -> bool: return ( market.get(self._ft_has["ccxt_futures_name"], False) is True + and market.get("type", False) == "swap" and market.get("linear", False) is True ) @@ -566,7 +571,7 @@ def trades(self, pair_interval: PairWithTimeframe, copy: bool = True) -> DataFra else: return DataFrame(columns=DEFAULT_TRADES_COLUMNS) - def get_contract_size(self, pair: str) -> Optional[float]: + def get_contract_size(self, pair: str) -> float | None: if self.trading_mode == TradingMode.FUTURES: market = self.markets.get(pair, {}) contract_size: float = 1.0 @@ -587,7 +592,7 @@ def _trades_contracts_to_amount(self, trades: list) -> list: trade["amount"] = trade["amount"] * contract_size return trades - def _order_contracts_to_amount(self, order: dict) -> dict: + def _order_contracts_to_amount(self, order: CcxtOrder) -> CcxtOrder: if "symbol" in order and order["symbol"] is not None: contract_size = self.get_contract_size(order["symbol"]) if contract_size != 1: @@ -700,16 +705,24 @@ def validate_stakecurrency(self, stake_currency: str) -> None: f"Available currencies are: {', '.join(quote_currencies)}" ) - def get_valid_pair_combination(self, curr_1: str, curr_2: str) -> str: + def get_valid_pair_combination(self, curr_1: str, curr_2: str) -> Generator[str, None, None]: """ Get valid pair combination of curr_1 and curr_2 by trying both combinations. """ - for pair in [f"{curr_1}/{curr_2}", f"{curr_2}/{curr_1}"]: + yielded = False + for pair in ( + f"{curr_1}/{curr_2}", + f"{curr_2}/{curr_1}", + f"{curr_1}/{curr_2}:{curr_2}", + f"{curr_2}/{curr_1}:{curr_1}", + ): if pair in self.markets and self.markets[pair].get("active"): - return pair - raise ValueError(f"Could not combine {curr_1} and {curr_2} to get a valid pair.") + yielded = True + yield pair + if not yielded: + raise ValueError(f"Could not combine {curr_1} and {curr_2} to get a valid pair.") - def validate_timeframes(self, timeframe: Optional[str]) -> None: + def validate_timeframes(self, timeframe: str | None) -> None: """ Check if timeframe from config is a supported timeframe on the exchange """ @@ -839,7 +852,7 @@ def validate_required_startup_candles(self, startup_candles: int, timeframe: str def validate_trading_mode_and_margin_mode( self, trading_mode: TradingMode, - margin_mode: Optional[MarginMode], # Only None when trading_mode = TradingMode.SPOT + margin_mode: MarginMode | None, # Only None when trading_mode = TradingMode.SPOT ): """ Checks if freqtrade can perform trades using the configured @@ -855,7 +868,7 @@ def validate_trading_mode_and_margin_mode( f"Freqtrade does not support {mm_value} {trading_mode} on {self.name}" ) - def get_option(self, param: str, default: Optional[Any] = None) -> Any: + def get_option(self, param: str, default: Any | None = None) -> Any: """ Get parameter value from _ft_has """ @@ -872,7 +885,7 @@ def exchange_has(self, endpoint: str) -> bool: return self._ft_has["exchange_has_overrides"][endpoint] return endpoint in self._api_async.has and self._api_async.has[endpoint] - def get_precision_amount(self, pair: str) -> Optional[float]: + def get_precision_amount(self, pair: str) -> float | None: """ Returns the amount precision of the exchange. :param pair: Pair to get precision for @@ -880,7 +893,7 @@ def get_precision_amount(self, pair: str) -> Optional[float]: """ return self.markets.get(pair, {}).get("precision", {}).get("amount", None) - def get_precision_price(self, pair: str) -> Optional[float]: + def get_precision_price(self, pair: str) -> float | None: """ Returns the price precision of the exchange. :param pair: Pair to get precision for @@ -920,8 +933,8 @@ def price_get_one_pip(self, pair: str, price: float) -> float: return 1 / pow(10, precision) def get_min_pair_stake_amount( - self, pair: str, price: float, stoploss: float, leverage: Optional[float] = 1.0 - ) -> Optional[float]: + self, pair: str, price: float, stoploss: float, leverage: float | None = 1.0 + ) -> float | None: return self._get_stake_amount_limit(pair, price, stoploss, "min", leverage) def get_max_pair_stake_amount(self, pair: str, price: float, leverage: float = 1.0) -> float: @@ -939,8 +952,8 @@ def _get_stake_amount_limit( price: float, stoploss: float, limit: Literal["min", "max"], - leverage: Optional[float] = 1.0, - ) -> Optional[float]: + leverage: float | None = 1.0, + ) -> float | None: isMin = limit == "min" try: @@ -997,20 +1010,20 @@ def create_dry_run_order( self, pair: str, ordertype: str, - side: str, + side: BuySell, amount: float, rate: float, leverage: float, - params: Optional[dict] = None, + params: dict | None = None, stop_loss: bool = False, - ) -> dict[str, Any]: + ) -> CcxtOrder: now = dt_now() order_id = f"dry_run_{side}_{pair}_{now.timestamp()}" # Rounding here must respect to contract sizes _amount = self._contracts_to_amount( pair, self.amount_to_precision(pair, self._amount_to_contracts(pair, amount)) ) - dry_order: dict[str, Any] = { + dry_order: CcxtOrder = { "id": order_id, "symbol": pair, "price": rate, @@ -1026,14 +1039,13 @@ def create_dry_run_order( "status": "open", "fee": None, "info": {}, - "leverage": leverage, } if stop_loss: dry_order["info"] = {"stopPrice": dry_order["price"]} dry_order[self._ft_has["stop_price_prop"]] = dry_order["price"] # Workaround to avoid filling stoploss orders immediately dry_order["ft_order_type"] = "stoploss" - orderbook: Optional[OrderBook] = None + orderbook: OrderBook | None = None if self.exchange_has("fetchL2OrderBook"): orderbook = self.fetch_l2_order_book(pair, 20) if ordertype == "limit" and orderbook: @@ -1055,7 +1067,7 @@ def create_dry_run_order( "filled": _amount, "remaining": 0.0, "status": "closed", - "cost": (dry_order["amount"] * average), + "cost": (_amount * average), } ) # market orders will always incurr taker fees @@ -1072,9 +1084,9 @@ def create_dry_run_order( def add_dry_order_fee( self, pair: str, - dry_order: dict[str, Any], + dry_order: CcxtOrder, taker_or_maker: MakerTaker, - ) -> dict[str, Any]: + ) -> CcxtOrder: fee = self.get_fee(pair, taker_or_maker=taker_or_maker) dry_order.update( { @@ -1088,7 +1100,7 @@ def add_dry_order_fee( return dry_order def get_dry_market_fill_price( - self, pair: str, side: str, amount: float, rate: float, orderbook: Optional[OrderBook] + self, pair: str, side: str, amount: float, rate: float, orderbook: OrderBook | None ) -> float: """ Get the market order fill price based on orderbook interpolation @@ -1136,7 +1148,7 @@ def _dry_is_price_crossed( pair: str, side: str, limit: float, - orderbook: Optional[OrderBook] = None, + orderbook: OrderBook | None = None, offset: float = 0.0, ) -> bool: if not self.exchange_has("fetchL2OrderBook"): @@ -1158,8 +1170,8 @@ def _dry_is_price_crossed( return False def check_dry_limit_order_filled( - self, order: dict[str, Any], immediate: bool = False, orderbook: Optional[OrderBook] = None - ) -> dict[str, Any]: + self, order: CcxtOrder, immediate: bool = False, orderbook: OrderBook | None = None + ) -> CcxtOrder: """ Check dry-run limit order fill and update fee (if it filled). """ @@ -1186,7 +1198,7 @@ def check_dry_limit_order_filled( return order - def fetch_dry_run_order(self, order_id) -> dict[str, Any]: + def fetch_dry_run_order(self, order_id) -> CcxtOrder: """ Return dry-run order Only call if running in dry-run mode. @@ -1230,10 +1242,10 @@ def _get_params( params.update({"reduceOnly": True}) return params - def _order_needs_price(self, ordertype: str) -> bool: + def _order_needs_price(self, side: BuySell, ordertype: str) -> bool: return ( ordertype != "market" - or self._api.options.get("createMarketBuyOrderRequiresPrice", False) + or (side == "buy" and self._api.options.get("createMarketBuyOrderRequiresPrice", False)) or self._ft_has.get("marketOrderRequiresPrice", False) ) @@ -1248,7 +1260,7 @@ def create_order( leverage: float, reduceOnly: bool = False, time_in_force: str = "GTC", - ) -> dict: + ) -> CcxtOrder: if self._config["dry_run"]: dry_order = self.create_dry_run_order( pair, ordertype, side, amount, self.price_to_precision(pair, rate), leverage @@ -1260,7 +1272,7 @@ def create_order( try: # Set the precision for amount and price(rate) as accepted by the exchange amount = self.amount_to_precision(pair, self._amount_to_contracts(pair, amount)) - needs_price = self._order_needs_price(ordertype) + needs_price = self._order_needs_price(side, ordertype) rate_for_order = self.price_to_precision(pair, rate) if needs_price else None if not reduceOnly: @@ -1306,7 +1318,7 @@ def create_order( except ccxt.BaseError as e: raise OperationalException(e) from e - def stoploss_adjust(self, stop_loss: float, order: dict, side: str) -> bool: + def stoploss_adjust(self, stop_loss: float, order: CcxtOrder, side: str) -> bool: """ Verify stop_loss against stoploss-order value (limit or price) Returns True if adjustment is necessary. @@ -1367,7 +1379,7 @@ def create_stoploss( order_types: dict, side: BuySell, leverage: float, - ) -> dict: + ) -> CcxtOrder: """ creates a stoploss order. requires `_ft_has['stoploss_order_types']` to be set as a dict mapping limit and market @@ -1460,7 +1472,7 @@ def create_stoploss( except ccxt.BaseError as e: raise OperationalException(e) from e - def fetch_order_emulated(self, order_id: str, pair: str, params: dict) -> dict: + def fetch_order_emulated(self, order_id: str, pair: str, params: dict) -> CcxtOrder: """ Emulated fetch_order if the exchange doesn't support fetch_order, but requires separate calls for open and closed orders. @@ -1494,7 +1506,7 @@ def fetch_order_emulated(self, order_id: str, pair: str, params: dict) -> dict: raise OperationalException(e) from e @retrier(retries=API_FETCH_ORDER_RETRY_COUNT) - def fetch_order(self, order_id: str, pair: str, params: Optional[dict] = None) -> dict: + def fetch_order(self, order_id: str, pair: str, params: dict | None = None) -> CcxtOrder: if self._config["dry_run"]: return self.fetch_dry_run_order(order_id) if params is None: @@ -1523,12 +1535,14 @@ def fetch_order(self, order_id: str, pair: str, params: Optional[dict] = None) - except ccxt.BaseError as e: raise OperationalException(e) from e - def fetch_stoploss_order(self, order_id: str, pair: str, params: Optional[dict] = None) -> dict: + def fetch_stoploss_order( + self, order_id: str, pair: str, params: dict | None = None + ) -> CcxtOrder: return self.fetch_order(order_id, pair, params) def fetch_order_or_stoploss_order( self, order_id: str, pair: str, stoploss_order: bool = False - ) -> dict: + ) -> CcxtOrder: """ Simple wrapper calling either fetch_order or fetch_stoploss_order depending on the stoploss_order parameter @@ -1540,7 +1554,7 @@ def fetch_order_or_stoploss_order( return self.fetch_stoploss_order(order_id, pair) return self.fetch_order(order_id, pair) - def check_order_canceled_empty(self, order: dict) -> bool: + def check_order_canceled_empty(self, order: CcxtOrder) -> bool: """ Verify if an order has been cancelled without being partially filled :param order: Order dict as returned from fetch_order() @@ -1549,7 +1563,7 @@ def check_order_canceled_empty(self, order: dict) -> bool: return order.get("status") in NON_OPEN_EXCHANGE_STATES and order.get("filled") == 0.0 @retrier - def cancel_order(self, order_id: str, pair: str, params: Optional[dict] = None) -> dict: + def cancel_order(self, order_id: str, pair: str, params: dict | None = None) -> dict[str, Any]: if self._config["dry_run"]: try: order = self.fetch_dry_run_order(order_id) @@ -1577,19 +1591,17 @@ def cancel_order(self, order_id: str, pair: str, params: Optional[dict] = None) except ccxt.BaseError as e: raise OperationalException(e) from e - def cancel_stoploss_order( - self, order_id: str, pair: str, params: Optional[dict] = None - ) -> dict: + def cancel_stoploss_order(self, order_id: str, pair: str, params: dict | None = None) -> dict: return self.cancel_order(order_id, pair, params) - def is_cancel_order_result_suitable(self, corder) -> bool: + def is_cancel_order_result_suitable(self, corder) -> TypeGuard[CcxtOrder]: if not isinstance(corder, dict): return False required = ("fee", "status", "amount") return all(corder.get(k, None) is not None for k in required) - def cancel_order_with_result(self, order_id: str, pair: str, amount: float) -> dict: + def cancel_order_with_result(self, order_id: str, pair: str, amount: float) -> CcxtOrder: """ Cancel order returning a result. Creates a fake result if cancel order returns a non-usable result @@ -1620,7 +1632,9 @@ def cancel_order_with_result(self, order_id: str, pair: str, amount: float) -> d return order - def cancel_stoploss_order_with_result(self, order_id: str, pair: str, amount: float) -> dict: + def cancel_stoploss_order_with_result( + self, order_id: str, pair: str, amount: float + ) -> CcxtOrder: """ Cancel stoploss order returning a result. Creates a fake result if cancel order returns a non-usable result @@ -1651,6 +1665,7 @@ def get_balances(self) -> CcxtBalances: balances.pop("total", None) balances.pop("used", None) + self._log_exchange_response("fetch_balances", balances) return balances except ccxt.DDoSProtection as e: raise DDosProtection(e) from e @@ -1662,7 +1677,7 @@ def get_balances(self) -> CcxtBalances: raise OperationalException(e) from e @retrier - def fetch_positions(self, pair: Optional[str] = None) -> list[CcxtPosition]: + def fetch_positions(self, pair: str | None = None) -> list[CcxtPosition]: """ Fetch positions from the exchange. If no pair is given, all positions are returned. @@ -1686,7 +1701,7 @@ def fetch_positions(self, pair: Optional[str] = None) -> list[CcxtPosition]: except ccxt.BaseError as e: raise OperationalException(e) from e - def _fetch_orders_emulate(self, pair: str, since_ms: int) -> list[dict]: + def _fetch_orders_emulate(self, pair: str, since_ms: int) -> list[CcxtOrder]: orders = [] if self.exchange_has("fetchClosedOrders"): orders = self._api.fetch_closed_orders(pair, since=since_ms) @@ -1696,7 +1711,9 @@ def _fetch_orders_emulate(self, pair: str, since_ms: int) -> list[dict]: return orders @retrier(retries=0) - def fetch_orders(self, pair: str, since: datetime, params: Optional[dict] = None) -> list[dict]: + def fetch_orders( + self, pair: str, since: datetime, params: dict | None = None + ) -> list[CcxtOrder]: """ Fetch all orders for a pair "since" :param pair: Pair for the query @@ -1712,7 +1729,9 @@ def fetch_orders(self, pair: str, since: datetime, params: Optional[dict] = None if not params: params = {} try: - orders: list[dict] = self._api.fetch_orders(pair, since=since_ms, params=params) + orders: list[CcxtOrder] = self._api.fetch_orders( + pair, since=since_ms, params=params + ) except ccxt.NotSupported: # Some exchanges don't support fetchOrders # attempt to fetch open and closed orders separately @@ -1757,7 +1776,7 @@ def fetch_trading_fees(self) -> dict[str, Any]: raise OperationalException(e) from e @retrier - def fetch_bids_asks(self, symbols: Optional[list[str]] = None, cached: bool = False) -> dict: + def fetch_bids_asks(self, symbols: list[str] | None = None, *, cached: bool = False) -> dict: """ :param symbols: List of symbols to fetch :param cached: Allow cached result @@ -1790,23 +1809,37 @@ def fetch_bids_asks(self, symbols: Optional[list[str]] = None, cached: bool = Fa raise OperationalException(e) from e @retrier - def get_tickers(self, symbols: Optional[list[str]] = None, cached: bool = False) -> Tickers: + def get_tickers( + self, + symbols: list[str] | None = None, + *, + cached: bool = False, + market_type: TradingMode | None = None, + ) -> Tickers: """ + :param symbols: List of symbols to fetch :param cached: Allow cached result + :param market_type: Market type to fetch - either spot or futures. :return: fetch_tickers result """ tickers: Tickers if not self.exchange_has("fetchTickers"): return {} + cache_key = f"fetch_tickers_{market_type}" if market_type else "fetch_tickers" if cached: with self._cache_lock: - tickers = self._fetch_tickers_cache.get("fetch_tickers") # type: ignore + tickers = self._fetch_tickers_cache.get(cache_key) # type: ignore if tickers: return tickers try: - tickers = self._api.fetch_tickers(symbols) + # Re-map futures to swap + market_types = { + TradingMode.FUTURES: "swap", + } + params = {"type": market_types.get(market_type, market_type)} if market_type else {} + tickers = self._api.fetch_tickers(symbols, params) with self._cache_lock: - self._fetch_tickers_cache["fetch_tickers"] = tickers + self._fetch_tickers_cache[cache_key] = tickers return tickers except ccxt.NotSupported as e: raise OperationalException( @@ -1830,7 +1863,39 @@ def get_tickers(self, symbols: Optional[list[str]] = None, cached: bool = False) except ccxt.BaseError as e: raise OperationalException(e) from e - # Pricing info + def get_conversion_rate(self, coin: str, currency: str) -> float | None: + """ + Quick and cached way to get conversion rate one currency to the other. + Can then be used as "rate * amount" to convert between currencies. + :param coin: Coin to convert + :param currency: Currency to convert to + :returns: Conversion rate from coin to currency + :raises: ExchangeErrors + """ + if coin == currency: + return 1.0 + tickers = self.get_tickers(cached=True) + try: + for pair in self.get_valid_pair_combination(coin, currency): + ticker: Ticker | None = tickers.get(pair, None) + if not ticker: + tickers_other: Tickers = self.get_tickers( + cached=True, + market_type=( + TradingMode.SPOT + if self.trading_mode != TradingMode.SPOT + else TradingMode.FUTURES + ), + ) + ticker = tickers_other.get(pair, None) + if ticker: + rate: float | None = ticker.get("last", None) + if rate and pair.startswith(currency) and not pair.endswith(currency): + rate = 1.0 / rate + return rate + except ValueError: + return None + return None @retrier def fetch_ticker(self, pair: str) -> Ticker: @@ -1850,7 +1915,7 @@ def fetch_ticker(self, pair: str) -> Ticker: @staticmethod def get_next_limit_in_list( - limit: int, limit_range: Optional[list[int]], range_required: bool = True + limit: int, limit_range: list[int] | None, range_required: bool = True ): """ Get next greater value in the list. @@ -1914,8 +1979,8 @@ def get_rate( refresh: bool, side: EntryExit, is_short: bool, - order_book: Optional[OrderBook] = None, - ticker: Optional[Ticker] = None, + order_book: OrderBook | None = None, + ticker: Ticker | None = None, ) -> float: """ Calculates bid/ask target @@ -1964,7 +2029,7 @@ def get_rate( def _get_rate_from_ticker( self, side: EntryExit, ticker: Ticker, conf_strategy: dict[str, Any], price_side: BidAsk - ) -> Optional[float]: + ) -> float | None: """ Get rate from ticker. """ @@ -2043,7 +2108,7 @@ def get_rates(self, pair: str, refresh: bool, is_short: bool) -> tuple[float, fl @retrier def get_trades_for_order( - self, order_id: str, pair: str, since: datetime, params: Optional[dict] = None + self, order_id: str, pair: str, since: datetime, params: dict | None = None ) -> list: """ Fetch Orders using the "fetch_my_trades" endpoint and filter them by order-id. @@ -2090,7 +2155,7 @@ def get_trades_for_order( except ccxt.BaseError as e: raise OperationalException(e) from e - def get_order_id_conditional(self, order: dict[str, Any]) -> str: + def get_order_id_conditional(self, order: CcxtOrder) -> str: return order["id"] @retrier @@ -2139,7 +2204,7 @@ def get_fee( raise OperationalException(e) from e @staticmethod - def order_has_fee(order: dict) -> bool: + def order_has_fee(order: CcxtOrder) -> bool: """ Verifies if the passed in order dict has the needed keys to extract fees, and that these keys (currency, cost) are not empty. @@ -2158,7 +2223,7 @@ def order_has_fee(order: dict) -> bool: def calculate_fee_rate( self, fee: dict, symbol: str, cost: float, amount: float - ) -> Optional[float]: + ) -> float | None: """ Calculate fee rate if it's not given by the exchange. :param fee: ccxt Fee dict - must contain cost / currency / rate @@ -2186,10 +2251,13 @@ def calculate_fee_rate( # If cost is None or 0.0 -> falsy, return None return None try: - comb = self.get_valid_pair_combination(fee_curr, self._config["stake_currency"]) - tick = self.fetch_ticker(comb) - - fee_to_quote_rate = safe_value_fallback2(tick, tick, "last", "ask") + for comb in self.get_valid_pair_combination( + fee_curr, self._config["stake_currency"] + ): + tick = self.fetch_ticker(comb) + fee_to_quote_rate = safe_value_fallback2(tick, tick, "last", "ask") + if tick: + break except (ValueError, ExchangeError): fee_to_quote_rate = self._config["exchange"].get("unknown_fee_rate", None) if not fee_to_quote_rate: @@ -2197,8 +2265,8 @@ def calculate_fee_rate( return round((fee_cost * fee_to_quote_rate) / cost, 8) def extract_cost_curr_rate( - self, fee: dict, symbol: str, cost: float, amount: float - ) -> tuple[float, str, Optional[float]]: + self, fee: dict[str, Any], symbol: str, cost: float, amount: float + ) -> tuple[float, str, float | None]: """ Extract tuple of cost, currency, rate. Requires order_has_fee to run first! @@ -2223,7 +2291,7 @@ def get_historic_ohlcv( since_ms: int, candle_type: CandleType, is_new_pair: bool = False, - until_ms: Optional[int] = None, + until_ms: int | None = None, ) -> DataFrame: """ Get candle history using asyncio and returns the list of candles. @@ -2232,8 +2300,9 @@ def get_historic_ohlcv( :param pair: Pair to download :param timeframe: Timeframe to get data for :param since_ms: Timestamp in milliseconds to get history from - :param until_ms: Timestamp in milliseconds to get history up to :param candle_type: '', mark, index, premiumIndex, or funding_rate + :param is_new_pair: used by binance subclass to allow "fast" new pair downloading + :param until_ms: Timestamp in milliseconds to get history up to :return: Dataframe with candle (OHLCV) data """ pair, _, _, data, _ = self.loop.run_until_complete( @@ -2242,11 +2311,10 @@ def get_historic_ohlcv( timeframe=timeframe, since_ms=since_ms, until_ms=until_ms, - is_new_pair=is_new_pair, candle_type=candle_type, ) ) - logger.info(f"Downloaded data for {pair} with length {len(data)}.") + logger.debug(f"Downloaded data for {pair} from ccxt with length {len(data)}.") return ohlcv_to_dataframe(data, timeframe, pair, fill_missing=False, drop_incomplete=True) async def _async_get_historic_ohlcv( @@ -2255,13 +2323,11 @@ async def _async_get_historic_ohlcv( timeframe: str, since_ms: int, candle_type: CandleType, - is_new_pair: bool = False, raise_: bool = False, - until_ms: Optional[int] = None, + until_ms: int | None = None, ) -> OHLCVResponse: """ Download historic ohlcv - :param is_new_pair: used by binance subclass to allow "fast" new pair downloading :param candle_type: Any of the enum CandleType (must match trading mode!) """ @@ -2302,7 +2368,7 @@ def _build_coroutine( pair: str, timeframe: str, candle_type: CandleType, - since_ms: Optional[int], + since_ms: int | None, cache: bool, ) -> Coroutine[Any, Any, OHLCVResponse]: not_all_data = cache and self.required_candle_call_count > 1 @@ -2371,7 +2437,7 @@ def _build_coroutine( ) def _build_ohlcv_dl_jobs( - self, pair_list: ListPairsWithTimeframes, since_ms: Optional[int], cache: bool + self, pair_list: ListPairsWithTimeframes, since_ms: int | None, cache: bool ) -> tuple[list[Coroutine], list[PairWithTimeframe]]: """ Build Coroutines to execute as part of refresh_latest_ohlcv @@ -2448,9 +2514,9 @@ def refresh_latest_ohlcv( self, pair_list: ListPairsWithTimeframes, *, - since_ms: Optional[int] = None, + since_ms: int | None = None, cache: bool = True, - drop_incomplete: Optional[bool] = None, + drop_incomplete: bool | None = None, ) -> dict[PairWithTimeframe, DataFrame]: """ Refresh in-memory OHLCV asynchronously and set `_klines` with the result @@ -2544,7 +2610,7 @@ async def _async_get_candle_history( pair: str, timeframe: str, candle_type: CandleType, - since_ms: Optional[int] = None, + since_ms: int | None = None, ) -> OHLCVResponse: """ Asynchronously get candle history data using fetch_ohlcv @@ -2618,7 +2684,7 @@ async def _fetch_funding_rate_history( pair: str, timeframe: str, limit: int, - since_ms: Optional[int] = None, + since_ms: int | None = None, ) -> list[list]: """ Fetch funding rate history - used to selectively override this by subclasses. @@ -2677,7 +2743,7 @@ def _process_trades_df( async def _build_trades_dl_jobs( self, pairwt: PairWithTimeframe, data_handler, cache: bool - ) -> tuple[PairWithTimeframe, Optional[DataFrame]]: + ) -> tuple[PairWithTimeframe, DataFrame | None]: """ Build coroutines to refresh trades for (they're then called through async.gather) """ @@ -2821,7 +2887,7 @@ def _now_is_time_to_refresh_trades( @retrier_async async def _async_fetch_trades( - self, pair: str, since: Optional[int] = None, params: Optional[dict] = None + self, pair: str, since: int | None = None, params: dict | None = None ) -> tuple[list[list], Any]: """ Asynchronously gets trade history using fetch_trades. @@ -2880,8 +2946,16 @@ def _get_trade_pagination_next_value(self, trades: list[dict]): else: return trades[-1].get("timestamp") + async def _async_get_trade_history_id_startup( + self, pair: str, since: int | None + ) -> tuple[list[list], str]: + """ + override for initial trade_history_id call + """ + return await self._async_fetch_trades(pair, since=since) + async def _async_get_trade_history_id( - self, pair: str, until: int, since: Optional[int] = None, from_id: Optional[str] = None + self, pair: str, until: int, since: int | None = None, from_id: str | None = None ) -> tuple[str, list[list]]: """ Asynchronously gets trade history using fetch_trades @@ -2906,7 +2980,7 @@ async def _async_get_trade_history_id( # of up to an hour. # e.g. Binance returns the "last 1000" candles within a 1h time interval # - so we will miss the first trades. - t, from_id = await self._async_fetch_trades(pair, since=since) + t, from_id = await self._async_get_trade_history_id_startup(pair, since=since) trades.extend(t[x]) while True: try: @@ -2936,7 +3010,7 @@ async def _async_get_trade_history_id( return (pair, trades) async def _async_get_trade_history_time( - self, pair: str, until: int, since: Optional[int] = None + self, pair: str, until: int, since: int | None = None ) -> tuple[str, list[list]]: """ Asynchronously gets trade history using fetch_trades, @@ -2977,9 +3051,9 @@ async def _async_get_trade_history_time( async def _async_get_trade_history( self, pair: str, - since: Optional[int] = None, - until: Optional[int] = None, - from_id: Optional[str] = None, + since: int | None = None, + until: int | None = None, + from_id: str | None = None, ) -> tuple[str, list[list]]: """ Async wrapper handling downloading trades using either time or id based methods. @@ -3008,9 +3082,9 @@ async def _async_get_trade_history( def get_historic_trades( self, pair: str, - since: Optional[int] = None, - until: Optional[int] = None, - from_id: Optional[str] = None, + since: int | None = None, + until: int | None = None, + from_id: str | None = None, ) -> tuple[str, list]: """ Get trade history data using asyncio. @@ -3039,7 +3113,7 @@ def get_historic_trades( return self.loop.run_until_complete(task) @retrier - def _get_funding_fees_from_exchange(self, pair: str, since: Union[datetime, int]) -> float: + def _get_funding_fees_from_exchange(self, pair: str, since: datetime | int) -> float: """ Returns the sum of all funding fees that were exchanged for a pair within a timeframe Dry-run handling happens as part of _calculate_funding_fees. @@ -3170,8 +3244,8 @@ def cache_leverage_tiers(self, tiers: dict[str, list[dict]], stake_currency: str file_dump_json(filename, data) def load_cached_leverage_tiers( - self, stake_currency: str, cache_time: Optional[timedelta] = None - ) -> Optional[dict[str, list[dict]]]: + self, stake_currency: str, cache_time: timedelta | None = None + ) -> dict[str, list[dict]] | None: """ Load cached leverage tiers from disk :param cache_time: The maximum age of the cache before it is considered outdated @@ -3216,7 +3290,7 @@ def parse_leverage_tier(self, tier) -> dict: "maintAmt": float(info["cum"]) if "cum" in info else None, } - def get_max_leverage(self, pair: str, stake_amount: Optional[float]) -> float: + def get_max_leverage(self, pair: str, stake_amount: float | None) -> float: """ Returns the maximum leverage that a pair can be traded at :param pair: The base/quote currency pair being traded @@ -3294,7 +3368,7 @@ def get_max_leverage(self, pair: str, stake_amount: Optional[float]) -> float: def _set_leverage( self, leverage: float, - pair: Optional[str] = None, + pair: str | None = None, accept_fail: bool = False, ): """ @@ -3346,7 +3420,7 @@ def set_margin_mode( pair: str, margin_mode: MarginMode, accept_fail: bool = False, - params: Optional[dict] = None, + params: dict | None = None, ): """ Set's the margin mode on the exchange to cross or isolated for a specific pair @@ -3381,7 +3455,7 @@ def _fetch_and_calculate_funding_fees( amount: float, is_short: bool, open_date: datetime, - close_date: Optional[datetime] = None, + close_date: datetime | None = None, ) -> float: """ Fetches and calculates the sum of all funding fees that occurred for a pair @@ -3434,7 +3508,7 @@ def _fetch_and_calculate_funding_fees( @staticmethod def combine_funding_and_mark( - funding_rates: DataFrame, mark_rates: DataFrame, futures_funding_rate: Optional[int] = None + funding_rates: DataFrame, mark_rates: DataFrame, futures_funding_rate: int | None = None ) -> DataFrame: """ Combine funding-rates and mark-rates dataframes @@ -3475,7 +3549,7 @@ def calculate_funding_fees( is_short: bool, open_date: datetime, close_date: datetime, - time_in_ratio: Optional[float] = None, + time_in_ratio: float | None = None, ) -> float: """ calculates the sum of all funding fees that occurred for a pair during a futures trade @@ -3533,8 +3607,8 @@ def get_liquidation_price( stake_amount: float, leverage: float, wallet_balance: float, - open_trades: Optional[list] = None, - ) -> Optional[float]: + open_trades: list | None = None, + ) -> float | None: """ Set's the margin mode on the exchange to cross or isolated for a specific pair """ @@ -3582,7 +3656,7 @@ def dry_run_liquidation_price( leverage: float, wallet_balance: float, # Or margin balance open_trades: list, - ) -> Optional[float]: + ) -> float | None: """ Important: Must be fetching data from cached values as this is used by backtesting! PERPETUAL: @@ -3633,7 +3707,7 @@ def get_maintenance_ratio_and_amt( self, pair: str, notional_value: float, - ) -> tuple[float, Optional[float]]: + ) -> tuple[float, float | None]: """ Important: Must be fetching data from cached values as this is used by backtesting! :param pair: Market symbol diff --git a/freqtrade/exchange/exchange_types.py b/freqtrade/exchange/exchange_types.py index e9c58ec3856..69741dc6562 100644 --- a/freqtrade/exchange/exchange_types.py +++ b/freqtrade/exchange/exchange_types.py @@ -1,4 +1,4 @@ -from typing import Optional, TypedDict +from typing import Any, Literal, TypedDict from freqtrade.enums import CandleType @@ -11,7 +11,7 @@ class FtHas(TypedDict, total=False): # Stoploss on exchange stoploss_on_exchange: bool stop_price_param: str - stop_price_prop: str + stop_price_prop: Literal["stopPrice", "stopLossPrice"] stop_price_type_field: str stop_price_type_value_mapping: dict stoploss_order_types: dict[str, str] @@ -35,16 +35,17 @@ class FtHas(TypedDict, total=False): trades_has_history: bool trades_pagination_overlap: bool # Orderbook - l2_limit_range: Optional[list[int]] + l2_limit_range: list[int] | None l2_limit_range_required: bool # Futures ccxt_futures_name: str # usually swap mark_ohlcv_price: str mark_ohlcv_timeframe: str funding_fee_timeframe: str + funding_fee_candle_limit: int floor_leverage: bool needs_trading_fees: bool - order_props_in_contracts: list[str] + order_props_in_contracts: list[Literal["amount", "cost", "filled", "remaining"]] # Websocket control ws_enabled: bool @@ -52,14 +53,14 @@ class FtHas(TypedDict, total=False): class Ticker(TypedDict): symbol: str - ask: Optional[float] - askVolume: Optional[float] - bid: Optional[float] - bidVolume: Optional[float] - last: Optional[float] - quoteVolume: Optional[float] - baseVolume: Optional[float] - percentage: Optional[float] + ask: float | None + askVolume: float | None + bid: float | None + bidVolume: float | None + last: float | None + quoteVolume: float | None + baseVolume: float | None + percentage: float | None # Several more - only listing required. @@ -70,9 +71,9 @@ class OrderBook(TypedDict): symbol: str bids: list[tuple[float, float]] asks: list[tuple[float, float]] - timestamp: Optional[int] - datetime: Optional[str] - nonce: Optional[int] + timestamp: int | None + datetime: str | None + nonce: int | None class CcxtBalance(TypedDict): @@ -89,10 +90,12 @@ class CcxtPosition(TypedDict): side: str contracts: float leverage: float - collateral: Optional[float] - initialMargin: Optional[float] - liquidationPrice: Optional[float] + collateral: float | None + initialMargin: float | None + liquidationPrice: float | None +CcxtOrder = dict[str, Any] + # pair, timeframe, candleType, OHLCV, drop last?, OHLCVResponse = tuple[str, str, CandleType, list, bool] diff --git a/freqtrade/exchange/exchange_utils.py b/freqtrade/exchange/exchange_utils.py index f7b53a8361d..1c989424248 100644 --- a/freqtrade/exchange/exchange_utils.py +++ b/freqtrade/exchange/exchange_utils.py @@ -5,7 +5,7 @@ import inspect from datetime import datetime, timedelta, timezone from math import ceil, floor -from typing import Any, Optional +from typing import Any import ccxt from ccxt import ( @@ -33,20 +33,18 @@ CcxtModuleType = Any -def is_exchange_known_ccxt( - exchange_name: str, ccxt_module: Optional[CcxtModuleType] = None -) -> bool: +def is_exchange_known_ccxt(exchange_name: str, ccxt_module: CcxtModuleType | None = None) -> bool: return exchange_name in ccxt_exchanges(ccxt_module) -def ccxt_exchanges(ccxt_module: Optional[CcxtModuleType] = None) -> list[str]: +def ccxt_exchanges(ccxt_module: CcxtModuleType | None = None) -> list[str]: """ Return the list of all exchanges known to ccxt """ return ccxt_module.exchanges if ccxt_module is not None else ccxt.exchanges -def available_exchanges(ccxt_module: Optional[CcxtModuleType] = None) -> list[str]: +def available_exchanges(ccxt_module: CcxtModuleType | None = None) -> list[str]: """ Return exchanges available to the bot, i.e. non-bad exchanges in the ccxt list """ @@ -54,7 +52,7 @@ def available_exchanges(ccxt_module: Optional[CcxtModuleType] = None) -> list[st return [x for x in exchanges if validate_exchange(x)[0]] -def validate_exchange(exchange: str) -> tuple[bool, str, Optional[ccxt.Exchange]]: +def validate_exchange(exchange: str) -> tuple[bool, str, ccxt.Exchange | None]: """ returns: can_use, reason, exchange_object with Reason including both missing and missing_opt @@ -137,9 +135,7 @@ def list_available_exchanges(all_exchanges: bool) -> list[ValidExchangesType]: return exchanges_valid -def date_minus_candles( - timeframe: str, candle_count: int, date: Optional[datetime] = None -) -> datetime: +def date_minus_candles(timeframe: str, candle_count: int, date: datetime | None = None) -> datetime: """ subtract X candles from a date. :param timeframe: timeframe in string format (e.g. "5m") @@ -166,7 +162,7 @@ def market_is_active(market: dict) -> bool: return market.get("active", True) is not False -def amount_to_contracts(amount: float, contract_size: Optional[float]) -> float: +def amount_to_contracts(amount: float, contract_size: float | None) -> float: """ Convert amount to contracts. :param amount: amount to convert @@ -179,7 +175,7 @@ def amount_to_contracts(amount: float, contract_size: Optional[float]) -> float: return amount -def contracts_to_amount(num_contracts: float, contract_size: Optional[float]) -> float: +def contracts_to_amount(num_contracts: float, contract_size: float | None) -> float: """ Takes num-contracts and converts it to contract size :param num_contracts: number of contracts @@ -194,7 +190,7 @@ def contracts_to_amount(num_contracts: float, contract_size: Optional[float]) -> def amount_to_precision( - amount: float, amount_precision: Optional[float], precisionMode: Optional[int] + amount: float, amount_precision: float | None, precisionMode: int | None ) -> float: """ Returns the amount to buy or sell to a precision the Exchange accepts @@ -224,9 +220,9 @@ def amount_to_precision( def amount_to_contract_precision( amount, - amount_precision: Optional[float], - precisionMode: Optional[int], - contract_size: Optional[float], + amount_precision: float | None, + precisionMode: int | None, + contract_size: float | None, ) -> float: """ Returns the amount to buy or sell to a precision the Exchange accepts @@ -285,8 +281,8 @@ def __price_to_precision_significant_digits( def price_to_precision( price: float, - price_precision: Optional[float], - precisionMode: Optional[int], + price_precision: float | None, + precisionMode: int | None, *, rounding_mode: int = ROUND, ) -> float: @@ -312,7 +308,9 @@ def price_to_precision( decimal_to_precision( price, rounding_mode=rounding_mode, - precision=price_precision, + precision=int(price_precision) + if precisionMode != TICK_SIZE + else price_precision, counting_mode=precisionMode, ) ) diff --git a/freqtrade/exchange/exchange_utils_timeframe.py b/freqtrade/exchange/exchange_utils_timeframe.py index 67cf1b5d6a5..494df58f216 100644 --- a/freqtrade/exchange/exchange_utils_timeframe.py +++ b/freqtrade/exchange/exchange_utils_timeframe.py @@ -1,5 +1,4 @@ from datetime import datetime, timezone -from typing import Optional import ccxt from ccxt import ROUND_DOWN, ROUND_UP @@ -51,7 +50,7 @@ def timeframe_to_resample_freq(timeframe: str) -> str: return resample_interval -def timeframe_to_prev_date(timeframe: str, date: Optional[datetime] = None) -> datetime: +def timeframe_to_prev_date(timeframe: str, date: datetime | None = None) -> datetime: """ Use Timeframe and determine the candle start date for this date. Does not round when given a candle start date. @@ -66,7 +65,7 @@ def timeframe_to_prev_date(timeframe: str, date: Optional[datetime] = None) -> d return dt_from_ts(new_timestamp) -def timeframe_to_next_date(timeframe: str, date: Optional[datetime] = None) -> datetime: +def timeframe_to_next_date(timeframe: str, date: datetime | None = None) -> datetime: """ Use Timeframe and determine next candle. :param timeframe: timeframe in string format (e.g. "5m") diff --git a/freqtrade/exchange/gate.py b/freqtrade/exchange/gate.py index 70f8772106d..d9473043f3a 100644 --- a/freqtrade/exchange/gate.py +++ b/freqtrade/exchange/gate.py @@ -2,12 +2,15 @@ import logging from datetime import datetime -from typing import Any, Optional + +import ccxt from freqtrade.constants import BuySell from freqtrade.enums import MarginMode, PriceType, TradingMode +from freqtrade.exceptions import DDosProtection, OperationalException, TemporaryError from freqtrade.exchange import Exchange -from freqtrade.exchange.exchange_types import FtHas +from freqtrade.exchange.common import retrier +from freqtrade.exchange.exchange_types import CcxtOrder, FtHas from freqtrade.misc import safe_value_fallback2 @@ -24,6 +27,8 @@ class Gate(Exchange): may still not work as expected. """ + unified_account = False + _ft_has: FtHas = { "ohlcv_candle_limit": 1000, "order_time_in_force": ["GTC", "IOC"], @@ -38,6 +43,7 @@ class Gate(Exchange): _ft_has_futures: FtHas = { "needs_trading_fees": True, "marketOrderRequiresPrice": False, + "funding_fee_candle_limit": 90, "stop_price_type_field": "price_type", "stop_price_type_value_mapping": { PriceType.LAST: 0, @@ -53,6 +59,35 @@ class Gate(Exchange): (TradingMode.FUTURES, MarginMode.ISOLATED) ] + @retrier + def additional_exchange_init(self) -> None: + """ + Additional exchange initialization logic. + .api will be available at this point. + Must be overridden in child methods if required. + """ + try: + if not self._config["dry_run"]: + # TODO: This should work with 4.4.34 and later. + self._api.load_unified_status() + is_unified = self._api.options.get("unifiedAccount") + + # Returns a tuple of bools, first for margin, second for Account + if is_unified: + self.unified_account = True + logger.info("Gate: Unified account.") + else: + self.unified_account = False + logger.info("Gate: Classic account.") + except ccxt.DDoSProtection as e: + raise DDosProtection(e) from e + except (ccxt.OperationFailed, ccxt.ExchangeError) as e: + raise TemporaryError( + f"Error in additional_exchange_init due to {e.__class__.__name__}. Message: {e}" + ) from e + except ccxt.BaseError as e: + raise OperationalException(e) from e + def _get_params( self, side: BuySell, @@ -74,7 +109,7 @@ def _get_params( return params def get_trades_for_order( - self, order_id: str, pair: str, since: datetime, params: Optional[dict] = None + self, order_id: str, pair: str, since: datetime, params: dict | None = None ) -> list: trades = super().get_trades_for_order(order_id, pair, since, params) @@ -99,10 +134,12 @@ def get_trades_for_order( } return trades - def get_order_id_conditional(self, order: dict[str, Any]) -> str: + 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: Optional[dict] = None) -> dict: + 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. @@ -119,7 +156,5 @@ def fetch_stoploss_order(self, order_id: str, pair: str, params: Optional[dict] return order1 return order - def cancel_stoploss_order( - self, order_id: str, pair: str, params: Optional[dict] = None - ) -> dict: + 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/hyperliquid.py b/freqtrade/exchange/hyperliquid.py index 144edbf3a0e..6588af0da2b 100644 --- a/freqtrade/exchange/hyperliquid.py +++ b/freqtrade/exchange/hyperliquid.py @@ -1,10 +1,14 @@ """Hyperliquid exchange subclass""" import logging +from datetime import datetime -from freqtrade.enums import TradingMode +from freqtrade.constants import BuySell +from freqtrade.enums import MarginMode, TradingMode +from freqtrade.exceptions import ExchangeError, OperationalException from freqtrade.exchange import Exchange -from freqtrade.exchange.exchange_types import FtHas +from freqtrade.exchange.exchange_types import CcxtOrder, FtHas +from freqtrade.util.datetime_helpers import dt_from_ts logger = logging.getLogger(__name__) @@ -16,20 +20,162 @@ class Hyperliquid(Exchange): """ _ft_has: FtHas = { - # Only the most recent 5000 candles are available according to the - # exchange's API documentation. "ohlcv_has_history": False, "ohlcv_candle_limit": 5000, - "trades_has_history": False, # Trades endpoint doesn't seem available. + "l2_limit_range": [20], + "trades_has_history": False, + "tickers_have_bid_ask": False, + "stoploss_on_exchange": False, "exchange_has_overrides": {"fetchTrades": False}, + "marketOrderRequiresPrice": True, } + _ft_has_futures: FtHas = { + "stoploss_on_exchange": True, + "stoploss_order_types": {"limit": "limit"}, + "stop_price_prop": "stopPrice", + "funding_fee_timeframe": "1h", + "funding_fee_candle_limit": 500, + } + + _supported_trading_mode_margin_pairs: list[tuple[TradingMode, MarginMode]] = [ + (TradingMode.FUTURES, MarginMode.ISOLATED) + ] @property def _ccxt_config(self) -> dict: - # Parameters to add directly to ccxt sync/async initialization. - # ccxt defaults to swap mode. + # ccxt Hyperliquid defaults to swap config = {} if self.trading_mode == TradingMode.SPOT: config.update({"options": {"defaultType": "spot"}}) config.update(super()._ccxt_config) return config + + def get_max_leverage(self, pair: str, stake_amount: float | None) -> float: + # There are no leverage tiers + if self.trading_mode == TradingMode.FUTURES: + return self.markets[pair]["limits"]["leverage"]["max"] + else: + return 1.0 + + def _lev_prep(self, pair: str, leverage: float, side: BuySell, accept_fail: bool = False): + if self.trading_mode != TradingMode.SPOT: + # Hyperliquid expects leverage to be an int + leverage = int(leverage) + # Hyperliquid needs the parameter leverage. + # Don't use _set_leverage(), as this sets margin back to cross + self.set_margin_mode(pair, self.margin_mode, params={"leverage": leverage}) + + def dry_run_liquidation_price( + self, + pair: str, + open_rate: float, # Entry price of position + is_short: bool, + amount: float, + stake_amount: float, + leverage: float, + wallet_balance: float, # Or margin balance + open_trades: list, + ) -> float | None: + """ + Optimized + Docs: https://hyperliquid.gitbook.io/hyperliquid-docs/trading/liquidations + Below can be done in fewer lines of code, but like this it matches the documentation. + + Tested with 196 unique ccxt fetch_positions() position outputs + - Only first output per position where pnl=0.0 + - Compare against returned liquidation price + Positions: 197 Average deviation: 0.00028980% Max deviation: 0.01309453% + Positions info: + {'leverage': {1.0: 23, 2.0: 155, 3.0: 8, 4.0: 7, 5.0: 4}, + 'side': {'long': 133, 'short': 64}, + 'symbol': {'BTC/USDC:USDC': 81, + 'DOGE/USDC:USDC': 20, + 'ETH/USDC:USDC': 53, + 'SOL/USDC:USDC': 43}} + """ + # Defining/renaming variables to match the documentation + isolated_margin = wallet_balance + position_size = amount + price = open_rate + position_value = price * position_size + max_leverage = self.markets[pair]["limits"]["leverage"]["max"] + + # Docs: The maintenance margin is half of the initial margin at max leverage, + # which varies from 3-50x. In other words, the maintenance margin is between 1% + # (for 50x max leverage assets) and 16.7% (for 3x max leverage assets) + # depending on the asset + # The key thing here is 'Half of the initial margin at max leverage'. + # A bit ambiguous, but this interpretation leads to accurate results: + # 1. Start from the position value + # 2. Assume max leverage, calculate the initial margin by dividing the position value + # by the max leverage + # 3. Divide this by 2 + maintenance_margin_required = position_value / max_leverage / 2 + + # Docs: margin_available (isolated) = isolated_margin - maintenance_margin_required + margin_available = isolated_margin - maintenance_margin_required + + # Docs: The maintenance margin is half of the initial margin at max leverage + # The docs don't explicitly specify maintenance leverage, but this works. + # Double because of the statement 'half of the initial margin at max leverage' + maintenance_leverage = max_leverage * 2 + + # Docs: l = 1 / MAINTENANCE_LEVERAGE (Using 'll' to comply with PEP8: E741) + ll = 1 / maintenance_leverage + + # Docs: side = 1 for long and -1 for short + side = -1 if is_short else 1 + + # Docs: liq_price = price - side * margin_available / position_size / (1 - l * side) + liq_price = price - side * margin_available / position_size / (1 - ll * side) + + if self.trading_mode == TradingMode.FUTURES: + return liq_price + else: + raise OperationalException( + "Freqtrade only supports isolated futures for leverage trading" + ) + + def get_funding_fees( + self, pair: str, amount: float, is_short: bool, open_date: datetime + ) -> float: + """ + Fetch funding fees, either from the exchange (live) or calculates them + based on funding rate/mark price history + :param pair: The quote/base pair of the trade + :param is_short: trade direction + :param amount: Trade amount + :param open_date: Open date of the trade + :return: funding fee since open_date + :raises: ExchangeError if something goes wrong. + """ + # Hyperliquid does not have fetchFundingHistory + if self.trading_mode == TradingMode.FUTURES: + try: + return self._fetch_and_calculate_funding_fees(pair, amount, is_short, open_date) + except ExchangeError: + logger.warning(f"Could not update funding fees for {pair}.") + return 0.0 + + def fetch_order(self, order_id: str, pair: str, params: dict | None = None) -> CcxtOrder: + order = super().fetch_order(order_id, pair, params) + + if ( + order["average"] is None + and order["status"] in ("canceled", "closed") + and order["filled"] > 0 + ): + # Hyperliquid does not fill the average price in the order response + # Fetch trades to calculate the average price to have the actual price + # the order was executed at + trades = self.get_trades_for_order(order_id, pair, since=dt_from_ts(order["timestamp"])) + + if trades: + total_amount = sum(t["amount"] for t in trades) + order["average"] = ( + sum(t["price"] * t["amount"] for t in trades) / total_amount + if total_amount + else None + ) + + return order diff --git a/freqtrade/exchange/kraken.py b/freqtrade/exchange/kraken.py index 7dea0e4353e..8573d611d76 100644 --- a/freqtrade/exchange/kraken.py +++ b/freqtrade/exchange/kraken.py @@ -2,7 +2,7 @@ import logging from datetime import datetime -from typing import Any, Optional +from typing import Any import ccxt from pandas import DataFrame @@ -50,11 +50,33 @@ def market_is_tradable(self, market: dict[str, Any]) -> bool: return parent_check and market.get("darkpool", False) is False - def get_tickers(self, symbols: Optional[list[str]] = None, cached: bool = False) -> Tickers: + def get_tickers( + self, + symbols: list[str] | None = None, + *, + cached: bool = False, + market_type: TradingMode | None = None, + ) -> Tickers: # Only fetch tickers for current stake currency # Otherwise the request for kraken becomes too large. symbols = list(self.get_markets(quote_currencies=[self._config["stake_currency"]])) - return super().get_tickers(symbols=symbols, cached=cached) + return super().get_tickers(symbols=symbols, cached=cached, market_type=market_type) + + def consolidate_balances(self, balances: CcxtBalances) -> CcxtBalances: + """ + Consolidate balances for the same currency. + Kraken returns ".F" balances if rewards is enabled. + """ + consolidated: CcxtBalances = {} + for currency, balance in balances.items(): + base_currency = currency[:-2] if currency.endswith(".F") else currency + if base_currency in consolidated: + consolidated[base_currency]["free"] += balance["free"] + consolidated[base_currency]["used"] += balance["used"] + consolidated[base_currency]["total"] += balance["total"] + else: + consolidated[base_currency] = balance + return consolidated @retrier def get_balances(self) -> CcxtBalances: @@ -68,6 +90,10 @@ def get_balances(self) -> CcxtBalances: balances.pop("free", None) balances.pop("total", None) balances.pop("used", None) + self._log_exchange_response("fetch_balances", balances) + + # Consolidate balances + balances = self.consolidate_balances(balances) orders = self._api.fetch_open_orders() order_list = [ @@ -86,6 +112,7 @@ def get_balances(self) -> CcxtBalances: balances[bal]["used"] = sum(order[1] for order in order_list if order[0] == bal) balances[bal]["free"] = balances[bal]["total"] - balances[bal]["used"] + self._log_exchange_response("fetch_balances2", balances) return balances except ccxt.DDoSProtection as e: raise DDosProtection(e) from e @@ -99,7 +126,7 @@ def get_balances(self) -> CcxtBalances: def _set_leverage( self, leverage: float, - pair: Optional[str] = None, + pair: str | None = None, accept_fail: bool = False, ): """ @@ -137,7 +164,7 @@ def calculate_funding_fees( is_short: bool, open_date: datetime, close_date: datetime, - time_in_ratio: Optional[float] = None, + time_in_ratio: float | None = None, ) -> float: """ # ! This method will always error when run by Freqtrade because time_in_ratio is never diff --git a/freqtrade/exchange/kucoin.py b/freqtrade/exchange/kucoin.py index fc4433f0ba5..de033dcc015 100644 --- a/freqtrade/exchange/kucoin.py +++ b/freqtrade/exchange/kucoin.py @@ -4,7 +4,7 @@ from freqtrade.constants import BuySell from freqtrade.exchange import Exchange -from freqtrade.exchange.exchange_types import FtHas +from freqtrade.exchange.exchange_types import CcxtOrder, FtHas logger = logging.getLogger(__name__) @@ -47,7 +47,7 @@ def create_order( leverage: float, reduceOnly: bool = False, time_in_force: str = "GTC", - ) -> dict: + ) -> CcxtOrder: res = super().create_order( pair=pair, ordertype=ordertype, diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index fbbf2175798..e9784f12e32 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -1,6 +1,5 @@ import logging from datetime import timedelta -from typing import Any, Optional import ccxt @@ -14,7 +13,7 @@ ) from freqtrade.exchange import Exchange, date_minus_candles from freqtrade.exchange.common import API_RETRY_COUNT, retrier -from freqtrade.exchange.exchange_types import FtHas +from freqtrade.exchange.exchange_types import CcxtOrder, FtHas from freqtrade.misc import safe_value_fallback2 from freqtrade.util import dt_now, dt_ts @@ -60,7 +59,7 @@ class Okx(Exchange): _ccxt_params: dict = {"options": {"brokerId": "ffb5405ad327SUDE"}} def ohlcv_candle_limit( - self, timeframe: str, candle_type: CandleType, since_ms: Optional[int] = None + self, timeframe: str, candle_type: CandleType, since_ms: int | None = None ) -> int: """ Exchange ohlcv candle limit @@ -191,7 +190,7 @@ def _get_stop_params(self, side: BuySell, ordertype: str, stop_price: float) -> params["posSide"] = self._get_posSide(side, True) return params - def _convert_stop_order(self, pair: str, order_id: str, order: dict) -> dict: + def _convert_stop_order(self, pair: str, order_id: str, order: CcxtOrder) -> CcxtOrder: if ( order.get("status", "open") == "closed" and (real_order_id := order.get("info", {}).get("ordId")) is not None @@ -209,7 +208,9 @@ def _convert_stop_order(self, pair: str, order_id: str, order: dict) -> dict: return order @retrier(retries=API_RETRY_COUNT) - def fetch_stoploss_order(self, order_id: str, pair: str, params: Optional[dict] = None) -> dict: + def fetch_stoploss_order( + self, order_id: str, pair: str, params: dict | None = None + ) -> CcxtOrder: if self._config["dry_run"]: return self.fetch_dry_run_order(order_id) @@ -231,7 +232,7 @@ def fetch_stoploss_order(self, order_id: str, pair: str, params: Optional[dict] return self._fetch_stop_order_fallback(order_id, pair) - def _fetch_stop_order_fallback(self, order_id: str, pair: str) -> dict: + def _fetch_stop_order_fallback(self, order_id: str, pair: str) -> CcxtOrder: params2 = {"stop": True, "ordType": "conditional"} for method in ( self._api.fetch_open_orders, @@ -256,14 +257,12 @@ def _fetch_stop_order_fallback(self, order_id: str, pair: str) -> dict: raise OperationalException(e) from e raise RetryableOrderError(f"StoplossOrder not found (pair: {pair} id: {order_id}).") - def get_order_id_conditional(self, order: dict[str, Any]) -> str: + def get_order_id_conditional(self, order: CcxtOrder) -> str: if order.get("type", "") == "stop": return safe_value_fallback2(order, order, "id_stop", "id") return order["id"] - def cancel_stoploss_order( - self, order_id: str, pair: str, params: Optional[dict] = None - ) -> dict: + def cancel_stoploss_order(self, order_id: str, pair: str, params: dict | None = None) -> dict: params1 = {"stop": True} # 'ordType': 'conditional' # @@ -273,7 +272,7 @@ def cancel_stoploss_order( params=params1, ) - def _fetch_orders_emulate(self, pair: str, since_ms: int) -> list[dict]: + def _fetch_orders_emulate(self, pair: str, since_ms: int) -> list[CcxtOrder]: orders = [] orders = self._api.fetch_closed_orders(pair, since=since_ms) diff --git a/freqtrade/freqai/RL/BaseEnvironment.py b/freqtrade/freqai/RL/BaseEnvironment.py index 021a2fc58fc..d9142046c03 100644 --- a/freqtrade/freqai/RL/BaseEnvironment.py +++ b/freqtrade/freqai/RL/BaseEnvironment.py @@ -2,7 +2,6 @@ import random from abc import abstractmethod from enum import Enum -from typing import Optional, Union import gymnasium as gym import numpy as np @@ -140,7 +139,7 @@ def reset_env( self._end_tick: int = len(self.prices) - 1 self._done: bool = False self._current_tick: int = self._start_tick - self._last_trade_tick: Optional[int] = None + self._last_trade_tick: int | None = None self._position = Positions.Neutral self._position_history: list = [None] self.total_reward: float = 0 @@ -173,8 +172,8 @@ def seed(self, seed: int = 1): def tensorboard_log( self, metric: str, - value: Optional[Union[int, float]] = None, - inc: Optional[bool] = None, + value: int | float | None = None, + inc: bool | None = None, category: str = "custom", ): """ diff --git a/freqtrade/freqai/RL/BaseReinforcementLearningModel.py b/freqtrade/freqai/RL/BaseReinforcementLearningModel.py index 5da88adb665..3c3c84804c3 100644 --- a/freqtrade/freqai/RL/BaseReinforcementLearningModel.py +++ b/freqtrade/freqai/RL/BaseReinforcementLearningModel.py @@ -2,9 +2,10 @@ import importlib import logging from abc import abstractmethod +from collections.abc import Callable from datetime import datetime, timezone from pathlib import Path -from typing import Any, Callable, Optional, Union +from typing import Any import gymnasium as gym import numpy as np @@ -49,9 +50,9 @@ def __init__(self, **kwargs) -> None: ) th.set_num_threads(self.max_threads) self.reward_params = self.freqai_info["rl_config"]["model_reward_parameters"] - self.train_env: Union[VecMonitor, SubprocVecEnv, gym.Env] = gym.Env() - self.eval_env: Union[VecMonitor, SubprocVecEnv, gym.Env] = gym.Env() - self.eval_callback: Optional[MaskableEvalCallback] = None + self.train_env: VecMonitor | SubprocVecEnv | gym.Env = gym.Env() + self.eval_env: VecMonitor | SubprocVecEnv | gym.Env = gym.Env() + self.eval_callback: MaskableEvalCallback | None = None self.model_type = self.freqai_info["rl_config"]["model_type"] self.rl_config = self.freqai_info["rl_config"] self.df_raw: DataFrame = DataFrame() diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 4663c41b02f..cac76ece537 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -5,7 +5,7 @@ import shutil from datetime import datetime, timezone from pathlib import Path -from typing import Any, Optional +from typing import Any import numpy as np import numpy.typing as npt @@ -111,7 +111,7 @@ def __init__( def set_paths( self, pair: str, - trained_timestamp: Optional[int] = None, + trained_timestamp: int | None = None, ) -> None: """ Set the paths to the data for the present coin/botloop @@ -849,7 +849,7 @@ def use_strategy_to_populate_indicators( # noqa: C901 dataframe = strategy.set_freqai_targets(dataframe.copy(), metadata=metadata) dataframe = self.remove_special_chars_from_feature_names(dataframe) - self.get_unique_classes_from_labels(dataframe) + self.get_unique_classes_from_labels(dataframe) if self.config.get("reduce_df_footprint", False): dataframe = reduce_dataframe_footprint(dataframe) diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index 950f40ca426..7d7d605d7e3 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -5,7 +5,7 @@ from collections import deque from datetime import datetime, timezone from pathlib import Path -from typing import Any, Literal, Optional +from typing import Any, Literal import datasieve.transforms as ds import numpy as np @@ -106,7 +106,7 @@ def __init__(self, config: Config) -> None: self._threads: list[threading.Thread] = [] self._stop_event = threading.Event() self.metadata: dict[str, Any] = self.dd.load_global_metadata_from_disk() - self.data_provider: Optional[DataProvider] = None + self.data_provider: DataProvider | None = None self.max_system_threads = max(int(psutil.cpu_count() * 2 - 2), 1) self.can_short = True # overridden in start() with strategy.can_short self.model: Any = None @@ -185,6 +185,7 @@ def _on_stop(self): Callback for Subclasses to override to include logic for shutting down resources when SIGINT is sent. """ + self.dd.save_historic_predictions_to_disk() return def shutdown(self): @@ -198,9 +199,16 @@ def shutdown(self): self.data_provider = None self._on_stop() - logger.info("Waiting on Training iteration") - for _thread in self._threads: - _thread.join() + if self.freqai_info.get("wait_for_training_iteration_on_reload", True): + logger.info("Waiting on Training iteration") + for _thread in self._threads: + _thread.join() + else: + logger.warning( + "Breaking current training iteration because " + "you set wait_for_training_iteration_on_reload to " + " False." + ) def start_scanning(self, *args, **kwargs) -> None: """ @@ -286,7 +294,9 @@ def start_backtesting( # tr_backtest is the backtesting time range e.g. the week directly # following tr_train. Both of these windows slide through the # entire backtest - for tr_train, tr_backtest in zip(dk.training_timeranges, dk.backtesting_timeranges): + for tr_train, tr_backtest in zip( + dk.training_timeranges, dk.backtesting_timeranges, strict=False + ): (_, _) = self.dd.get_pair_dict_info(pair) train_it += 1 total_trains = len(dk.backtesting_timeranges) diff --git a/freqtrade/freqai/prediction_models/ReinforcementLearner.py b/freqtrade/freqai/prediction_models/ReinforcementLearner.py index 5bd119fbeb1..87c3450dcdc 100644 --- a/freqtrade/freqai/prediction_models/ReinforcementLearner.py +++ b/freqtrade/freqai/prediction_models/ReinforcementLearner.py @@ -1,6 +1,6 @@ import logging from pathlib import Path -from typing import Any, Optional +from typing import Any import torch as th from stable_baselines3.common.callbacks import ProgressBarCallback @@ -78,7 +78,7 @@ def fit(self, data_dictionary: dict[str, Any], dk: FreqaiDataKitchen, **kwargs): model = self.dd.model_dictionary[dk.pair] model.set_env(self.train_env) callbacks: list[Any] = [self.eval_callback, self.tensorboard_callback] - progressbar_callback: Optional[ProgressBarCallback] = None + progressbar_callback: ProgressBarCallback | None = None if self.rl_config.get("progress_bar", False): progressbar_callback = ProgressBarCallback() callbacks.insert(0, progressbar_callback) diff --git a/freqtrade/freqai/prediction_models/XGBoostRFRegressor.py b/freqtrade/freqai/prediction_models/XGBoostRFRegressor.py index 12231ed13f3..140186075f1 100644 --- a/freqtrade/freqai/prediction_models/XGBoostRFRegressor.py +++ b/freqtrade/freqai/prediction_models/XGBoostRFRegressor.py @@ -5,7 +5,6 @@ from freqtrade.freqai.base_models.BaseRegressionModel import BaseRegressionModel from freqtrade.freqai.data_kitchen import FreqaiDataKitchen -from freqtrade.freqai.tensorboard import TBCallback logger = logging.getLogger(__name__) @@ -45,7 +44,12 @@ def fit(self, data_dictionary: dict, dk: FreqaiDataKitchen, **kwargs) -> Any: model = XGBRFRegressor(**self.model_training_parameters) - model.set_params(callbacks=[TBCallback(dk.data_path)]) + # Callbacks are not supported for XGBRFRegressor, and version 2.1.x started to throw + # the following error: + # NotImplementedError: `early_stopping_rounds` and `callbacks` are not implemented + # for random forest. + + # model.set_params(callbacks=[TBCallback(dk.data_path)]) model.fit( X=X, y=y, @@ -55,6 +59,6 @@ def fit(self, data_dictionary: dict, dk: FreqaiDataKitchen, **kwargs) -> Any: xgb_model=xgb_model, ) # set the callbacks to empty so that we can serialize to disk later - model.set_params(callbacks=[]) + # model.set_params(callbacks=[]) return model diff --git a/freqtrade/freqai/tensorboard/TensorboardCallback.py b/freqtrade/freqai/tensorboard/TensorboardCallback.py index 2b2b532f351..0ffbb5838fa 100644 --- a/freqtrade/freqai/tensorboard/TensorboardCallback.py +++ b/freqtrade/freqai/tensorboard/TensorboardCallback.py @@ -1,5 +1,5 @@ from enum import Enum -from typing import Any, Union +from typing import Any from stable_baselines3.common.callbacks import BaseCallback from stable_baselines3.common.logger import HParam @@ -27,7 +27,7 @@ def _on_training_start(self) -> None: # "batch_size": self.model.batch_size, # "n_steps": self.model.n_steps, } - metric_dict: dict[str, Union[float, int]] = { + metric_dict: dict[str, float | int] = { "eval/mean_reward": 0, "rollout/ep_rew_mean": 0, "rollout/ep_len_mean": 0, diff --git a/freqtrade/freqai/tensorboard/tensorboard.py b/freqtrade/freqai/tensorboard/tensorboard.py index 81f48047e2d..76bd5c2f821 100644 --- a/freqtrade/freqai/tensorboard/tensorboard.py +++ b/freqtrade/freqai/tensorboard/tensorboard.py @@ -45,7 +45,7 @@ def after_iteration( return False evals = ["validation", "train"] - for metric, eval_ in zip(evals_log.items(), evals): + for metric, eval_ in zip(evals_log.items(), evals, strict=False): for metric_name, log in metric[1].items(): score = log[-1][0] if isinstance(log[-1], tuple) else log[-1] self.writer.add_scalar(f"{eval_}-{metric_name}", score, epoch) diff --git a/freqtrade/freqai/torch/PyTorchModelTrainer.py b/freqtrade/freqai/torch/PyTorchModelTrainer.py index 02aa712d573..8682cff69c3 100644 --- a/freqtrade/freqai/torch/PyTorchModelTrainer.py +++ b/freqtrade/freqai/torch/PyTorchModelTrainer.py @@ -1,6 +1,6 @@ import logging from pathlib import Path -from typing import Any, Optional +from typing import Any import pandas as pd import torch @@ -50,8 +50,8 @@ def __init__( self.criterion = criterion self.model_meta_data = model_meta_data self.device = device - self.n_epochs: Optional[int] = kwargs.get("n_epochs", 10) - self.n_steps: Optional[int] = kwargs.get("n_steps", None) + self.n_epochs: int | None = kwargs.get("n_epochs", 10) + self.n_steps: int | None = kwargs.get("n_steps", None) if self.n_steps is None and not self.n_epochs: raise Exception("Either `n_steps` or `n_epochs` should be set.") diff --git a/freqtrade/freqai/utils.py b/freqtrade/freqai/utils.py index 9e14fa9306b..d2a15046d56 100644 --- a/freqtrade/freqai/utils.py +++ b/freqtrade/freqai/utils.py @@ -107,7 +107,7 @@ def plot_feature_importance( # Extract feature importance from model models = {} if "FreqaiMultiOutputRegressor" in str(model.__class__): - for estimator, label in zip(model.estimators_, dk.label_list): + for estimator, label in zip(model.estimators_, dk.label_list, strict=False): models[label] = estimator else: models[dk.label_list[0]] = model diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 0ca107b1751..52175e6876c 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -9,7 +9,7 @@ from math import isclose from threading import Lock from time import sleep -from typing import Any, Optional +from typing import Any from schedule import Scheduler @@ -43,6 +43,7 @@ timeframe_to_next_date, timeframe_to_seconds, ) +from freqtrade.exchange.exchange_types import CcxtOrder from freqtrade.leverage.liquidation_price import update_liquidation_prices from freqtrade.misc import safe_value_fallback, safe_value_fallback2 from freqtrade.mixins import LoggingMixin @@ -111,7 +112,7 @@ def __init__(self, config: Config) -> None: self.trading_mode: TradingMode = self.config.get("trading_mode", TradingMode.SPOT) self.margin_mode: MarginMode = self.config.get("margin_mode", MarginMode.NONE) - self.last_process: Optional[datetime] = None + self.last_process: datetime | None = None # RPC runs in separate threads, can start handling external commands just after # initialization, even before Freqtradebot has a chance to start its throttling, @@ -325,7 +326,7 @@ def check_for_open_trades(self): } self.rpc.send_msg(msg) - def _refresh_active_whitelist(self, trades: Optional[list[Trade]] = None) -> list[str]: + def _refresh_active_whitelist(self, trades: list[Trade] | None = None) -> list[str]: """ Refresh active whitelist from pairlist or edge and extend it with pairs that have open trades. @@ -579,7 +580,7 @@ def handle_onexchange_order(self, trade: Trade) -> bool: logger.warning( f"{trade} has a total of {trade.amount} {trade.base_currency}, " f"but the Wallet shows a total of {total} {trade.base_currency}. " - f"Adjusting trade amount to {total}." + f"Adjusting trade amount to {total}. " "This may however lead to further issues." ) trade.amount = total @@ -587,7 +588,7 @@ def handle_onexchange_order(self, trade: Trade) -> bool: logger.warning( f"{trade} has a total of {trade.amount} {trade.base_currency}, " f"but the Wallet shows a total of {total} {trade.base_currency}. " - "Refusing to adjust as the difference is too large." + "Refusing to adjust as the difference is too large. " "This may however lead to further issues." ) if prev_trade_amount != trade.amount: @@ -862,14 +863,14 @@ def execute_entry( self, pair: str, stake_amount: float, - price: Optional[float] = None, + price: float | None = None, *, is_short: bool = False, - ordertype: Optional[str] = None, - enter_tag: Optional[str] = None, - trade: Optional[Trade] = None, + ordertype: str | None = None, + enter_tag: str | None = None, + trade: Trade | None = None, mode: EntryExecuteMode = "initial", - leverage_: Optional[float] = None, + leverage_: float | None = None, ) -> bool: """ Executes an entry for the given pair @@ -1078,13 +1079,13 @@ def cancel_stoploss_on_exchange(self, trade: Trade) -> Trade: def get_valid_enter_price_and_stake( self, pair: str, - price: Optional[float], + price: float | None, stake_amount: float, trade_side: LongShort, - entry_tag: Optional[str], - trade: Optional[Trade], + entry_tag: str | None, + trade: Trade | None, mode: EntryExecuteMode, - leverage_: Optional[float], + leverage_: float | None, ) -> tuple[float, float, float]: """ Validate and eventually adjust (within limits) limit, amount and leverage @@ -1180,7 +1181,7 @@ def _notify_enter( self, trade: Trade, order: Order, - order_type: Optional[str], + order_type: str | None, fill: bool = False, sub_trade: bool = False, ) -> None: @@ -1195,6 +1196,13 @@ def _notify_enter( current_rate = self.exchange.get_rate( trade.pair, side="entry", is_short=trade.is_short, refresh=False ) + stake_amount = trade.stake_amount + if not fill and trade.nr_of_successful_entries > 0: + # If we have open orders, we need to add the stake amount of the open orders + # as it's not yet included in the trade.stake_amount + stake_amount += sum( + o.stake_amount for o in trade.open_orders if o.ft_order_side == trade.entry_side + ) msg: RPCEntryMsg = { "trade_id": trade.id, @@ -1208,12 +1216,12 @@ def _notify_enter( "limit": open_rate, # Deprecated (?) "open_rate": open_rate, "order_type": order_type or "unknown", - "stake_amount": trade.stake_amount, + "stake_amount": stake_amount, "stake_currency": self.config["stake_currency"], "base_currency": self.exchange.get_pair_base_currency(trade.pair), "quote_currency": self.exchange.get_pair_quote_currency(trade.pair), "fiat_currency": self.config.get("fiat_display_currency", None), - "amount": order.safe_amount_after_fee if fill else (order.amount or trade.amount), + "amount": order.safe_amount_after_fee if fill else (order.safe_amount or trade.amount), "open_date": trade.open_date_utc or datetime.now(timezone.utc), "current_rate": current_rate, "sub_trade": sub_trade, @@ -1295,7 +1303,7 @@ def exit_positions(self, trades: list[Trade]) -> int: logger.warning( f"Unable to handle stoploss on exchange for {trade.pair}: {exception}" ) - # Check if we can sell our current pair + # Check if we can exit our current pair if not trade.has_open_orders and trade.is_open and self.handle_trade(trade): trades_closed += 1 @@ -1344,7 +1352,7 @@ def handle_trade(self, trade: Trade) -> bool: return False def _check_and_execute_exit( - self, trade: Trade, exit_rate: float, enter: bool, exit_: bool, exit_tag: Optional[str] + self, trade: Trade, exit_rate: float, enter: bool, exit_: bool, exit_tag: str | None ) -> bool: """ Check and execute trade exit @@ -1466,7 +1474,7 @@ def handle_stoploss_on_exchange(self, trade: Trade) -> bool: return False - def handle_trailing_stoploss_on_exchange(self, trade: Trade, order: dict) -> None: + def handle_trailing_stoploss_on_exchange(self, trade: Trade, order: CcxtOrder) -> None: """ Check to see if stoploss on exchange should be updated in case of trailing stoploss on exchange @@ -1504,7 +1512,7 @@ def handle_trailing_stoploss_on_exchange(self, trade: Trade, order: dict) -> Non f"Could not create trailing stoploss order for pair {trade.pair}." ) - def manage_trade_stoploss_orders(self, trade: Trade, stoploss_orders: list[dict]): + def manage_trade_stoploss_orders(self, trade: Trade, stoploss_orders: list[CcxtOrder]): """ Perform required actions according to existing stoploss orders of trade :param trade: Corresponding Trade @@ -1580,7 +1588,9 @@ def manage_open_orders(self) -> None: else: self.replace_order(order, open_order, trade) - def handle_cancel_order(self, order: dict, order_obj: Order, trade: Trade, reason: str) -> None: + def handle_cancel_order( + self, order: CcxtOrder, order_obj: Order, trade: Trade, reason: str + ) -> None: """ Check if current analyzed order timed out and cancel if necessary. :param order: Order dict grabbed with exchange.fetch_order() @@ -1602,7 +1612,7 @@ def handle_cancel_order(self, order: dict, order_obj: Order, trade: Trade, reaso self.emergency_exit(trade, order["price"], order["amount"]) def emergency_exit( - self, trade: Trade, price: float, sub_trade_amt: Optional[float] = None + self, trade: Trade, price: float, sub_trade_amt: float | None = None ) -> None: try: self.execute_trade_exit( @@ -1632,7 +1642,7 @@ def replace_order_failed(self, trade: Trade, msg: str) -> None: ) trade.delete() - def replace_order(self, order: dict, order_obj: Optional[Order], trade: Trade) -> None: + def replace_order(self, order: CcxtOrder, order_obj: Order | None, trade: Trade) -> None: """ Check if current analyzed entry order should be replaced or simply cancelled. To simply cancel the existing order(no replacement) adjust_entry_price() should return None @@ -1736,10 +1746,10 @@ def cancel_all_open_orders(self) -> None: def handle_cancel_enter( self, trade: Trade, - order: dict, + order: CcxtOrder, order_obj: Order, reason: str, - replacing: Optional[bool] = False, + replacing: bool | None = False, ) -> bool: """ entry cancel - cancel order @@ -1820,7 +1830,9 @@ def handle_cancel_enter( ) return was_trade_fully_canceled - def handle_cancel_exit(self, trade: Trade, order: dict, order_obj: Order, reason: str) -> bool: + def handle_cancel_exit( + self, trade: Trade, order: CcxtOrder, order_obj: Order, reason: str + ) -> bool: """ exit order cancel - cancel order and update trade :return: True if exit order was cancelled, false otherwise @@ -1931,9 +1943,9 @@ def execute_trade_exit( limit: float, exit_check: ExitCheckTuple, *, - exit_tag: Optional[str] = None, - ordertype: Optional[str] = None, - sub_trade_amt: Optional[float] = None, + exit_tag: str | None = None, + ordertype: str | None = None, + sub_trade_amt: float | None = None, ) -> bool: """ Executes a trade exit for the given trade and limit @@ -2042,10 +2054,10 @@ def execute_trade_exit( def _notify_exit( self, trade: Trade, - order_type: Optional[str], + order_type: str | None, fill: bool = False, sub_trade: bool = False, - order: Optional[Order] = None, + order: Order | None = None, ) -> None: """ Sends rpc notification when a sell occurred. @@ -2158,7 +2170,7 @@ def _notify_exit_cancel( # Send the message self.rpc.send_msg(msg) - def order_obj_or_raise(self, order_id: str, order_obj: Optional[Order]) -> Order: + def order_obj_or_raise(self, order_id: str, order_obj: Order | None) -> Order: if not order_obj: raise DependencyException( f"Order_obj not found for {order_id}. This should not have happened." @@ -2172,8 +2184,8 @@ def order_obj_or_raise(self, order_id: str, order_obj: Optional[Order]) -> Order def update_trade_state( self, trade: Trade, - order_id: Optional[str], - action_order: Optional[dict[str, Any]] = None, + order_id: str | None, + action_order: CcxtOrder | None = None, *, stoploss_order: bool = False, send_msg: bool = True, @@ -2284,7 +2296,7 @@ def order_close_notify(self, trade: Trade, order: Order, stoploss_order: bool, s def handle_protections(self, pair: str, side: LongShort) -> None: # Lock pair for one candle to prevent immediate re-entries - self.strategy.lock_pair(pair, datetime.now(timezone.utc), reason="Auto lock") + self.strategy.lock_pair(pair, datetime.now(timezone.utc), reason="Auto lock", side=side) prot_trig = self.protections.stop_per_pair(pair, side=side) if prot_trig: msg: RPCProtectionMsg = { @@ -2310,7 +2322,7 @@ def apply_fee_conditional( amount: float, fee_abs: float, order_obj: Order, - ) -> Optional[float]: + ) -> float | None: """ Applies the fee to amount (either from Order or from Trades). Can eat into dust if more than the required asset is available. @@ -2338,7 +2350,7 @@ def apply_fee_conditional( return fee_abs return None - def handle_order_fee(self, trade: Trade, order_obj: Order, order: dict[str, Any]) -> None: + def handle_order_fee(self, trade: Trade, order_obj: Order, order: CcxtOrder) -> None: # Try update amount (binance-fix) try: fee_abs = self.get_real_amount(trade, order, order_obj) @@ -2347,7 +2359,7 @@ def handle_order_fee(self, trade: Trade, order_obj: Order, order: dict[str, Any] except DependencyException as exception: logger.warning("Could not update trade amount: %s", exception) - def get_real_amount(self, trade: Trade, order: dict, order_obj: Order) -> Optional[float]: + def get_real_amount(self, trade: Trade, order: CcxtOrder, order_obj: Order) -> float | None: """ Detect and update trade fee. Calls trade.update_fee() upon correct detection. @@ -2407,8 +2419,8 @@ def _trades_valid_for_fee(self, trades: list[dict[str, Any]]) -> bool: return True def fee_detection_from_trades( - self, trade: Trade, order: dict, order_obj: Order, order_amount: float, trades: list - ) -> Optional[float]: + self, trade: Trade, order: CcxtOrder, order_obj: Order, order_amount: float, trades: list + ) -> float | None: """ fee-detection fallback to Trades. Either uses provided trades list or the result of fetch_my_trades to get correct fee. @@ -2419,7 +2431,7 @@ def fee_detection_from_trades( ) if len(trades) == 0: - logger.info("Applying fee on amount for %s failed: myTrade-Dict empty found", trade) + logger.info("Applying fee on amount for %s failed: myTrade-dict empty found", trade) return None fee_currency = None amount = 0 diff --git a/freqtrade/ft_types/backtest_result_type.py b/freqtrade/ft_types/backtest_result_type.py index 25a89034941..27cdb612685 100644 --- a/freqtrade/ft_types/backtest_result_type.py +++ b/freqtrade/ft_types/backtest_result_type.py @@ -1,4 +1,4 @@ -from typing import Any, Optional +from typing import Any from typing_extensions import TypedDict @@ -26,7 +26,7 @@ class BacktestHistoryEntryType(BacktestMetadataType): filename: str strategy: str notes: str - backtest_start_ts: Optional[int] - backtest_end_ts: Optional[int] - timeframe: Optional[str] - timeframe_detail: Optional[str] + backtest_start_ts: int | None + backtest_end_ts: int | None + timeframe: str | None + timeframe_detail: str | None diff --git a/freqtrade/ft_types/valid_exchanges_type.py b/freqtrade/ft_types/valid_exchanges_type.py index 89a06ba403d..d6b93f4b2f5 100644 --- a/freqtrade/ft_types/valid_exchanges_type.py +++ b/freqtrade/ft_types/valid_exchanges_type.py @@ -1,5 +1,4 @@ # Used for list-exchanges -from typing import Optional from typing_extensions import TypedDict @@ -17,5 +16,5 @@ class ValidExchangesType(TypedDict): comment: str dex: bool is_alias: bool - alias_for: Optional[str] + alias_for: str | None trade_modes: list[TradeModeType] diff --git a/freqtrade/leverage/liquidation_price.py b/freqtrade/leverage/liquidation_price.py index af6ef0d4414..b48190d84aa 100644 --- a/freqtrade/leverage/liquidation_price.py +++ b/freqtrade/leverage/liquidation_price.py @@ -1,5 +1,4 @@ import logging -from typing import Optional from freqtrade.enums import MarginMode from freqtrade.exceptions import DependencyException @@ -12,7 +11,7 @@ def update_liquidation_prices( - trade: Optional[LocalTrade] = None, + trade: LocalTrade | None = None, *, exchange: Exchange, wallets: Wallets, @@ -28,10 +27,13 @@ def update_liquidation_prices( total_wallet_stake = 0.0 if dry_run: # Parameters only needed for cross margin - total_wallet_stake = wallets.get_total(stake_currency) + total_wallet_stake = wallets.get_collateral() - logger.info("Updating liquidation price for all open trades.") - open_trades = Trade.get_open_trades() + logger.info( + "Updating liquidation price for all open trades. " + f"Collateral {total_wallet_stake} {stake_currency}." + ) + open_trades: list[Trade] = Trade.get_open_trades() for t in open_trades: # TODO: This should be done in a batch update t.set_liquidation_price( diff --git a/freqtrade/main.py b/freqtrade/main.py index 712cc49cf14..bd815b74652 100755 --- a/freqtrade/main.py +++ b/freqtrade/main.py @@ -6,11 +6,11 @@ import logging import sys -from typing import Any, Optional +from typing import Any # check min. python version -if sys.version_info < (3, 10): # pragma: no cover +if sys.version_info < (3, 10): # pragma: no cover # noqa: UP036 sys.exit("Freqtrade requires Python version >= 3.10") from freqtrade import __version__ @@ -24,7 +24,7 @@ logger = logging.getLogger("freqtrade") -def main(sysargv: Optional[list[str]] = None) -> None: +def main(sysargv: list[str] | None = None) -> None: """ This function will initiate the bot and start the trading loop. :return: None diff --git a/freqtrade/misc.py b/freqtrade/misc.py index 629bd10dd86..5ea227984b4 100644 --- a/freqtrade/misc.py +++ b/freqtrade/misc.py @@ -7,7 +7,7 @@ from collections.abc import Iterator, Mapping from io import StringIO from pathlib import Path -from typing import Any, Optional, TextIO, Union +from typing import Any, TextIO from urllib.parse import urlparse import pandas as pd @@ -129,10 +129,10 @@ def round_dict(d, n): return {k: (round(v, n) if isinstance(v, float) else v) for k, v in d.items()} -DictMap = Union[dict[str, Any], Mapping[str, Any]] +DictMap = dict[str, Any] | Mapping[str, Any] -def safe_value_fallback(obj: DictMap, key1: str, key2: Optional[str] = None, default_value=None): +def safe_value_fallback(obj: DictMap, key1: str, key2: str | None = None, default_value=None): """ Search a value in obj, return this if it's not None. Then search key2 in obj - return that if it's not none - then use default_value. @@ -161,7 +161,7 @@ def safe_value_fallback2(dict1: DictMap, dict2: DictMap, key1: str, key2: str, d return default_value -def plural(num: float, singular: str, plural: Optional[str] = None) -> str: +def plural(num: float, singular: str, plural: str | None = None) -> str: return singular if (num == 1 or num == -1) else plural or singular + "s" diff --git a/freqtrade/mixins/logging_mixin.py b/freqtrade/mixins/logging_mixin.py index 44fb4f63a43..58399e7383e 100644 --- a/freqtrade/mixins/logging_mixin.py +++ b/freqtrade/mixins/logging_mixin.py @@ -1,4 +1,4 @@ -from typing import Callable +from collections.abc import Callable from cachetools import TTLCache, cached diff --git a/freqtrade/optimize/analysis/lookahead_helpers.py b/freqtrade/optimize/analysis/lookahead_helpers.py index dccf2cb73fb..631a9549f8b 100644 --- a/freqtrade/optimize/analysis/lookahead_helpers.py +++ b/freqtrade/optimize/analysis/lookahead_helpers.py @@ -1,7 +1,7 @@ import logging import time from pathlib import Path -from typing import Any, Union +from typing import Any import pandas as pd from rich.text import Text @@ -10,7 +10,7 @@ from freqtrade.exceptions import OperationalException from freqtrade.optimize.analysis.lookahead import LookaheadAnalysis from freqtrade.resolvers import StrategyResolver -from freqtrade.util import print_rich_table +from freqtrade.util import get_dry_run_wallet, print_rich_table logger = logging.getLogger(__name__) @@ -21,7 +21,7 @@ class LookaheadAnalysisSubFunctions: def text_table_lookahead_analysis_instances( config: dict[str, Any], lookahead_instances: list[LookaheadAnalysis], - caption: Union[str, None] = None, + caption: str | None = None, ): headers = [ "filename", @@ -163,7 +163,7 @@ def calculate_config_overrides(config: Config): config["max_open_trades"] = len(config["pairs"]) min_dry_run_wallet = 1000000000 - if config["dry_run_wallet"] < min_dry_run_wallet: + if get_dry_run_wallet(config) < min_dry_run_wallet: logger.info( "Dry run wallet was not set to 1 billion, pushing it up there " "just to avoid false positives" @@ -243,7 +243,7 @@ def start(config: Config): # report the results if lookaheadAnalysis_instances: - caption: Union[str, None] = None + caption: str | None = None if any( [ any( diff --git a/freqtrade/optimize/backtest_caching.py b/freqtrade/optimize/backtest_caching.py index 766c77ddcd6..7143da00608 100644 --- a/freqtrade/optimize/backtest_caching.py +++ b/freqtrade/optimize/backtest_caching.py @@ -1,7 +1,6 @@ import hashlib from copy import deepcopy from pathlib import Path -from typing import Union import rapidjson @@ -38,7 +37,7 @@ def get_strategy_run_id(strategy) -> str: return digest.hexdigest().lower() -def get_backtest_metadata_filename(filename: Union[Path, str]) -> Path: +def get_backtest_metadata_filename(filename: Path | str) -> Path: """Return metadata filename for specified backtest results file.""" filename = Path(filename) return filename.parent / Path(f"{filename.stem}.meta{filename.suffix}") diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index 03c7bcccc1f..bf0b52e7286 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -8,7 +8,7 @@ from collections import defaultdict from copy import deepcopy from datetime import datetime, timedelta, timezone -from typing import Any, Optional +from typing import Any from numpy import nan from pandas import DataFrame @@ -47,8 +47,7 @@ generate_rejected_signals, generate_trade_signal_candles, show_backtest_results, - store_backtest_analysis_results, - store_backtest_stats, + store_backtest_results, ) from freqtrade.persistence import ( CustomDataWrapper, @@ -110,7 +109,7 @@ class Backtesting: backtesting.start() """ - def __init__(self, config: Config, exchange: Optional[Exchange] = None) -> None: + def __init__(self, config: Config, exchange: Exchange | None = None) -> None: LoggingMixin.show_output = False self.config = config self.results: BacktestResultType = get_BacktestResultType_default() @@ -121,10 +120,12 @@ def __init__(self, config: Config, exchange: Optional[Exchange] = None) -> None: self.run_ids: dict[str, str] = {} self.strategylist: list[IStrategy] = [] self.all_results: dict[str, dict] = {} - self.processed_dfs: dict[str, dict] = {} + self.analysis_results: dict[str, dict[str, DataFrame]] = { + "signals": {}, + "rejected": {}, + "exited": {}, + } self.rejected_dict: dict[str, list] = {} - self.rejected_df: dict[str, dict] = {} - self.exited_dfs: dict[str, dict] = {} self._exchange_name = self.config["exchange"]["name"] if not exchange: @@ -685,7 +686,7 @@ def _call_adjust_stop(self, current_date: datetime, trade: LocalTrade, current_r ) def _try_close_open_order( - self, order: Optional[Order], trade: LocalTrade, current_date: datetime, row: tuple + self, order: Order | None, trade: LocalTrade, current_date: datetime, row: tuple ) -> bool: """ Check if an order is open and if it should've filled. @@ -732,7 +733,6 @@ def _process_exit_order( trade.close_date = current_time trade.close(order.ft_price, show_msg=False) - # logger.debug(f"{pair} - Backtesting exit {trade}") LocalTrade.close_bt_trade(trade) self.wallets.update() self.run_protections(pair, current_time, trade.trade_direction) @@ -743,8 +743,8 @@ def _get_exit_for_signal( row: tuple, exit_: ExitCheckTuple, current_time: datetime, - amount: Optional[float] = None, - ) -> Optional[LocalTrade]: + amount: float | None = None, + ) -> LocalTrade | None: if exit_.exit_flag: trade.close_date = current_time exit_reason = exit_.exit_reason @@ -823,8 +823,8 @@ def _exit_trade( sell_row: tuple, close_rate: float, amount: float, - exit_reason: Optional[str], - ) -> Optional[LocalTrade]: + exit_reason: str | None, + ) -> LocalTrade | None: self.order_id_counter += 1 exit_candle_time = sell_row[DATE_IDX].to_pydatetime() order_type = self.strategy.order_types["exit"] @@ -860,7 +860,7 @@ def _exit_trade( def _check_trade_exit( self, trade: LocalTrade, row: tuple, current_time: datetime - ) -> Optional[LocalTrade]: + ) -> LocalTrade | None: self._run_funding_fees(trade, current_time) # Check if we need to adjust our current positions @@ -910,10 +910,10 @@ def get_valid_price_and_stake( stake_amount: float, direction: LongShort, current_time: datetime, - entry_tag: Optional[str], - trade: Optional[LocalTrade], + entry_tag: str | None, + trade: LocalTrade | None, order_type: str, - price_precision: Optional[float], + price_precision: float | None, ) -> tuple[float, float, float, float]: if order_type == "limit": new_rate = strategy_safe_wrapper( @@ -1005,12 +1005,12 @@ def _enter_trade( pair: str, row: tuple, direction: LongShort, - stake_amount: Optional[float] = None, - trade: Optional[LocalTrade] = None, - requested_rate: Optional[float] = None, - requested_stake: Optional[float] = None, - entry_tag1: Optional[str] = None, - ) -> Optional[LocalTrade]: + stake_amount: float | None = None, + trade: LocalTrade | None = None, + requested_rate: float | None = None, + requested_stake: float | None = None, + entry_tag1: str | None = None, + ) -> LocalTrade | None: """ :param trade: Trade to adjust - initial entry if None :param requested_rate: Adjusted entry rate @@ -1103,6 +1103,7 @@ def _enter_trade( fee_close=self.fee, is_open=True, enter_tag=entry_tag, + timeframe=self.timeframe_min, exchange=self._exchange_name, is_short=is_short, trading_mode=self.trading_mode, @@ -1139,7 +1140,7 @@ def _enter_trade( amount=amount, filled=0, remaining=amount, - cost=amount * propose_rate + trade.fee_open, + cost=amount * propose_rate * (1 + self.fee), ft_order_tag=entry_tag, ) order._trade_bt = trade @@ -1178,7 +1179,7 @@ def trade_slot_available(self, open_trade_count: int) -> bool: self.rejected_trades += 1 return False - def check_for_trade_entry(self, row) -> Optional[LongShort]: + def check_for_trade_entry(self, row) -> LongShort | None: enter_long = row[LONG_IDX] == 1 exit_long = row[ELONG_IDX] == 1 enter_short = self._can_short and row[SHORT_IDX] == 1 @@ -1216,7 +1217,7 @@ def manage_open_orders(self, trade: LocalTrade, current_time: datetime, row: tup def check_order_cancel( self, trade: LocalTrade, order: Order, current_time: datetime - ) -> Optional[bool]: + ) -> bool | None: """ Check if current analyzed order has to be canceled. Returns True if the trade should be Deleted (initial order was canceled), @@ -1298,7 +1299,7 @@ def check_order_replace( def validate_row( self, data: dict, pair: str, row_index: int, current_time: datetime - ) -> Optional[tuple]: + ) -> tuple | None: try: # Row is treated as "current incomplete candle". # entry / exit signals are shifted by 1 to compensate for this. @@ -1332,14 +1333,41 @@ def backtest_loop( row: tuple, pair: str, current_time: datetime, - trade_dir: Optional[LongShort], + trade_dir: LongShort | None, can_enter: bool, ) -> None: + """ + Conditionally call backtest_loop_inner a 2nd time if shorting is enabled, + a position closed and a new signal in the other direction is available. + """ + if not self._can_short or trade_dir is None: + # No need to reverse position if shorting is disabled or there's no new signal + self.backtest_loop_inner(row, pair, current_time, trade_dir, can_enter) + else: + for _ in (0, 1): + a = self.backtest_loop_inner(row, pair, current_time, trade_dir, can_enter) + if not a or a == trade_dir: + # the trade didn't close or position change is in the same direction + break + + def backtest_loop_inner( + self, + row: tuple, + pair: str, + current_time: datetime, + trade_dir: LongShort | None, + can_enter: bool, + ) -> LongShort | None: """ NOTE: This method is used by Hyperopt at each iteration. Please keep it optimized. Backtesting processing for one candle/pair. """ + exiting_dir: LongShort | None = None + if not self._position_stacking and len(LocalTrade.bt_trades_open_pp[pair]) > 0: + # position_stacking not supported for now. + exiting_dir = "short" if LocalTrade.bt_trades_open_pp[pair][0].is_short else "long" + for t in list(LocalTrade.bt_trades_open_pp[pair]): # 1. Manage currently open orders of active trades if self.manage_open_orders(t, current_time, row): @@ -1358,7 +1386,7 @@ def backtest_loop( and (self._position_stacking or len(LocalTrade.bt_trades_open_pp[pair]) == 0) and not PairLocks.is_pair_locked(pair, row[DATE_IDX], trade_dir) ): - if self.trade_slot_available(LocalTrade.bt_open_open_trade_count): + if self.trade_slot_available(LocalTrade.bt_open_open_trade_count_candle): trade = self._enter_trade(pair, row, trade_dir) if trade: self.wallets.update() @@ -1380,6 +1408,10 @@ def backtest_loop( if order: self._process_exit_order(order, trade, current_time, row, pair) + if exiting_dir and len(LocalTrade.bt_trades_open_pp[pair]) == 0: + return exiting_dir + return None + def time_pair_generator( self, start_date: datetime, end_date: datetime, increment: timedelta, pairs: list[str] ): @@ -1432,6 +1464,10 @@ def backtest(self, processed: dict, start_date: datetime, end_date: datetime) -> ): if is_first_call: self.check_abort() + # Reset open trade count for this candle + # Critical to avoid exceeding max_open_trades in backtesting + # when timeframe-detail is used and trades close within the opening candle. + LocalTrade.bt_open_open_trade_count_candle = LocalTrade.bt_open_open_trade_count strategy_safe_wrapper(self.strategy.bot_loop_start, supress_error=True)( current_time=current_time ) @@ -1446,7 +1482,7 @@ def backtest(self, processed: dict, start_date: datetime, end_date: datetime) -> self.dataprovider._set_dataframe_max_index(self.required_startup + row_index) self.dataprovider._set_dataframe_max_date(current_time) current_detail_time: datetime = row[DATE_IDX].to_pydatetime() - trade_dir: Optional[LongShort] = self.check_for_trade_entry(row) + trade_dir: LongShort | None = self.check_for_trade_entry(row) if ( (trade_dir is not None or len(LocalTrade.bt_trades_open_pp[pair]) > 0) @@ -1517,12 +1553,6 @@ def backtest_one_strategy( backtest_start_time = datetime.now(timezone.utc) self._set_strategy(strat) - # Use max_open_trades in backtesting, except --disable-max-market-positions is set - if not self.config.get("use_max_market_positions", True): - logger.info("Ignoring max_open_trades (--disable-max-market-positions was used) ...") - self.strategy.max_open_trades = float("inf") - self.config.update({"max_open_trades": self.strategy.max_open_trades}) - # need to reprocess data every time to populate signals preprocessed = self.strategy.advise_all_indicators(data) @@ -1561,15 +1591,13 @@ def backtest_one_strategy( self.config.get("export", "none") == "signals" and self.dataprovider.runmode == RunMode.BACKTEST ): - self.processed_dfs[strategy_name] = generate_trade_signal_candles( - preprocessed_tmp, results, "open_date" - ) - self.rejected_df[strategy_name] = generate_rejected_signals( - preprocessed_tmp, self.rejected_dict - ) - self.exited_dfs[strategy_name] = generate_trade_signal_candles( - preprocessed_tmp, results, "close_date" - ) + signals = generate_trade_signal_candles(preprocessed_tmp, results, "open_date") + rejected = generate_rejected_signals(preprocessed_tmp, self.rejected_dict) + exited = generate_trade_signal_candles(preprocessed_tmp, results, "close_date") + + self.analysis_results["signals"][strategy_name] = signals + self.analysis_results["rejected"][strategy_name] = rejected + self.analysis_results["exited"][strategy_name] = exited return min_date, max_date @@ -1633,23 +1661,12 @@ def start(self) -> None: dt_appendix = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") if self.config.get("export", "none") in ("trades", "signals"): combined_res = combined_dataframes_with_rel_mean(data, min_date, max_date) - store_backtest_stats( - self.config["exportfilename"], + store_backtest_results( + self.config, self.results, dt_appendix, market_change_data=combined_res, - ) - - if ( - self.config.get("export", "none") == "signals" - and self.dataprovider.runmode == RunMode.BACKTEST - ): - store_backtest_analysis_results( - self.config["exportfilename"], - self.processed_dfs, - self.rejected_df, - self.exited_dfs, - dt_appendix, + analysis_results=self.analysis_results, ) # Results may be mixed up now. Sort them so they follow --strategy-list order. diff --git a/freqtrade/optimize/base_analysis.py b/freqtrade/optimize/base_analysis.py index e3e4757425c..a2fe53867cb 100644 --- a/freqtrade/optimize/base_analysis.py +++ b/freqtrade/optimize/base_analysis.py @@ -1,7 +1,7 @@ import logging from copy import deepcopy from datetime import datetime, timezone -from typing import Any, Optional +from typing import Any from pandas import DataFrame @@ -28,7 +28,7 @@ class BaseAnalysis: def __init__(self, config: dict[str, Any], strategy_obj: dict): self.failed_bias_check = True self.full_varHolder = VarHolder() - self.exchange: Optional[Any] = None + self.exchange: Any | None = None self._fee = None # pull variables the scope of the lookahead_analysis-instance diff --git a/freqtrade/optimize/hyperopt/__init__.py b/freqtrade/optimize/hyperopt/__init__.py new file mode 100644 index 00000000000..7dea075ea79 --- /dev/null +++ b/freqtrade/optimize/hyperopt/__init__.py @@ -0,0 +1,5 @@ +from freqtrade.optimize.hyperopt.hyperopt import Hyperopt +from freqtrade.optimize.hyperopt_loss.hyperopt_loss_interface import IHyperOptLoss + + +__all__ = ["Hyperopt", "IHyperOptLoss"] diff --git a/freqtrade/optimize/hyperopt/hyperopt.py b/freqtrade/optimize/hyperopt/hyperopt.py new file mode 100644 index 00000000000..253691d4ac4 --- /dev/null +++ b/freqtrade/optimize/hyperopt/hyperopt.py @@ -0,0 +1,352 @@ +# pragma pylint: disable=too-many-instance-attributes, pointless-string-statement + +""" +This module contains the hyperopt logic +""" + +import logging +import random +import sys +from datetime import datetime +from math import ceil +from multiprocessing import Manager +from pathlib import Path +from typing import Any + +import rapidjson +from joblib import Parallel, cpu_count, delayed, wrap_non_picklable_objects +from joblib.externals import cloudpickle +from rich.console import Console + +from freqtrade.constants import FTHYPT_FILEVERSION, LAST_BT_RESULT_FN, Config +from freqtrade.enums import HyperoptState +from freqtrade.exceptions import OperationalException +from freqtrade.misc import file_dump_json, plural +from freqtrade.optimize.hyperopt.hyperopt_logger import logging_mp_handle, logging_mp_setup +from freqtrade.optimize.hyperopt.hyperopt_optimizer import HyperOptimizer +from freqtrade.optimize.hyperopt.hyperopt_output import HyperoptOutput +from freqtrade.optimize.hyperopt_tools import ( + HyperoptStateContainer, + HyperoptTools, + hyperopt_serializer, +) +from freqtrade.util import get_progress_tracker + + +logger = logging.getLogger(__name__) + + +INITIAL_POINTS = 30 + +# Keep no more than SKOPT_MODEL_QUEUE_SIZE models +# in the skopt model queue, to optimize memory consumption +SKOPT_MODEL_QUEUE_SIZE = 10 + +log_queue: Any + + +class Hyperopt: + """ + Hyperopt class, this class contains all the logic to run a hyperopt simulation + + To start a hyperopt run: + hyperopt = Hyperopt(config) + hyperopt.start() + """ + + def __init__(self, config: Config) -> None: + self._hyper_out: HyperoptOutput = HyperoptOutput(streaming=True) + + self.config = config + + self.analyze_per_epoch = self.config.get("analyze_per_epoch", False) + HyperoptStateContainer.set_state(HyperoptState.STARTUP) + + if self.config.get("hyperopt"): + raise OperationalException( + "Using separate Hyperopt files has been removed in 2021.9. Please convert " + "your existing Hyperopt file to the new Hyperoptable strategy interface" + ) + + time_now = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + strategy = str(self.config["strategy"]) + self.results_file: Path = ( + self.config["user_data_dir"] + / "hyperopt_results" + / f"strategy_{strategy}_{time_now}.fthypt" + ) + self.data_pickle_file = ( + self.config["user_data_dir"] / "hyperopt_results" / "hyperopt_tickerdata.pkl" + ) + self.total_epochs = config.get("epochs", 0) + + self.current_best_loss = 100 + + self.clean_hyperopt() + + self.num_epochs_saved = 0 + self.current_best_epoch: dict[str, Any] | None = None + + if HyperoptTools.has_space(self.config, "sell"): + # Make sure use_exit_signal is enabled + self.config["use_exit_signal"] = True + + self.print_all = self.config.get("print_all", False) + self.hyperopt_table_header = 0 + self.print_colorized = self.config.get("print_colorized", False) + self.print_json = self.config.get("print_json", False) + + self.hyperopter = HyperOptimizer(self.config) + + @staticmethod + def get_lock_filename(config: Config) -> str: + return str(config["user_data_dir"] / "hyperopt.lock") + + def clean_hyperopt(self) -> None: + """ + Remove hyperopt pickle files to restart hyperopt. + """ + for f in [self.data_pickle_file, self.results_file]: + p = Path(f) + if p.is_file(): + logger.info(f"Removing `{p}`.") + p.unlink() + + def hyperopt_pickle_magic(self, bases) -> None: + """ + Hyperopt magic to allow strategy inheritance across files. + For this to properly work, we need to register the module of the imported class + to pickle as value. + """ + for modules in bases: + if modules.__name__ != "IStrategy": + cloudpickle.register_pickle_by_value(sys.modules[modules.__module__]) + self.hyperopt_pickle_magic(modules.__bases__) + + def _save_result(self, epoch: dict) -> None: + """ + Save hyperopt results to file + Store one line per epoch. + While not a valid json object - this allows appending easily. + :param epoch: result dictionary for this epoch. + """ + epoch[FTHYPT_FILEVERSION] = 2 + with self.results_file.open("a") as f: + rapidjson.dump( + epoch, + f, + default=hyperopt_serializer, + number_mode=rapidjson.NM_NATIVE | rapidjson.NM_NAN, + ) + f.write("\n") + + self.num_epochs_saved += 1 + logger.debug( + f"{self.num_epochs_saved} {plural(self.num_epochs_saved, 'epoch')} " + f"saved to '{self.results_file}'." + ) + # Store hyperopt filename + latest_filename = Path.joinpath(self.results_file.parent, LAST_BT_RESULT_FN) + file_dump_json(latest_filename, {"latest_hyperopt": str(self.results_file.name)}, log=False) + + def print_results(self, results: dict[str, Any]) -> None: + """ + Log results if it is better than any previous evaluation + TODO: this should be moved to HyperoptTools too + """ + is_best = results["is_best"] + + if self.print_all or is_best: + self._hyper_out.add_data( + self.config, + [results], + self.total_epochs, + self.print_all, + ) + + def run_optimizer_parallel(self, parallel: Parallel, asked: list[list]) -> list[dict[str, Any]]: + """Start optimizer in a parallel way""" + + def optimizer_wrapper(*args, **kwargs): + # global log queue. This must happen in the file that initializes Parallel + logging_mp_setup( + log_queue, logging.INFO if self.config["verbosity"] < 1 else logging.DEBUG + ) + + return self.hyperopter.generate_optimizer(*args, **kwargs) + + return parallel(delayed(wrap_non_picklable_objects(optimizer_wrapper))(v) for v in asked) + + def _set_random_state(self, random_state: int | None) -> int: + return random_state or random.randint(1, 2**16 - 1) # noqa: S311 + + def get_asked_points(self, n_points: int) -> tuple[list[list[Any]], list[bool]]: + """ + Enforce points returned from `self.opt.ask` have not been already evaluated + + Steps: + 1. Try to get points using `self.opt.ask` first + 2. Discard the points that have already been evaluated + 3. Retry using `self.opt.ask` up to 3 times + 4. If still some points are missing in respect to `n_points`, random sample some points + 5. Repeat until at least `n_points` points in the `asked_non_tried` list + 6. Return a list with length truncated at `n_points` + """ + + def unique_list(a_list): + new_list = [] + for item in a_list: + if item not in new_list: + new_list.append(item) + return new_list + + i = 0 + asked_non_tried: list[list[Any]] = [] + is_random_non_tried: list[bool] = [] + while i < 5 and len(asked_non_tried) < n_points: + if i < 3: + self.opt.cache_ = {} + asked = unique_list(self.opt.ask(n_points=n_points * 5 if i > 0 else n_points)) + is_random = [False for _ in range(len(asked))] + else: + asked = unique_list(self.opt.space.rvs(n_samples=n_points * 5)) + is_random = [True for _ in range(len(asked))] + is_random_non_tried += [ + rand + for x, rand in zip(asked, is_random, strict=False) + if x not in self.opt.Xi and x not in asked_non_tried + ] + asked_non_tried += [ + x for x in asked if x not in self.opt.Xi and x not in asked_non_tried + ] + i += 1 + + if asked_non_tried: + return ( + asked_non_tried[: min(len(asked_non_tried), n_points)], + is_random_non_tried[: min(len(asked_non_tried), n_points)], + ) + else: + return self.opt.ask(n_points=n_points), [False for _ in range(n_points)] + + def evaluate_result(self, val: dict[str, Any], current: int, is_random: bool): + """ + Evaluate results returned from generate_optimizer + """ + val["current_epoch"] = current + val["is_initial_point"] = current <= INITIAL_POINTS + + logger.debug("Optimizer epoch evaluated: %s", val) + + is_best = HyperoptTools.is_best_loss(val, self.current_best_loss) + # This value is assigned here and not in the optimization method + # to keep proper order in the list of results. That's because + # evaluations can take different time. Here they are aligned in the + # order they will be shown to the user. + val["is_best"] = is_best + val["is_random"] = is_random + self.print_results(val) + + if is_best: + self.current_best_loss = val["loss"] + self.current_best_epoch = val + + self._save_result(val) + + def _setup_logging_mp_workaround(self) -> None: + """ + Workaround for logging in child processes. + local_queue must be a global in the file that initializes Parallel. + """ + global log_queue + m = Manager() + log_queue = m.Queue() + + def start(self) -> None: + self.random_state = self._set_random_state(self.config.get("hyperopt_random_state")) + logger.info(f"Using optimizer random state: {self.random_state}") + self.hyperopt_table_header = -1 + self.hyperopter.prepare_hyperopt() + + cpus = cpu_count() + logger.info(f"Found {cpus} CPU cores. Let's make them scream!") + config_jobs = self.config.get("hyperopt_jobs", -1) + logger.info(f"Number of parallel jobs set as: {config_jobs}") + + self.opt = self.hyperopter.get_optimizer( + config_jobs, self.random_state, INITIAL_POINTS, SKOPT_MODEL_QUEUE_SIZE + ) + self._setup_logging_mp_workaround() + try: + with Parallel(n_jobs=config_jobs) as parallel: + jobs = parallel._effective_n_jobs() + logger.info(f"Effective number of parallel workers used: {jobs}") + console = Console( + color_system="auto" if self.print_colorized else None, + ) + + # Define progressbar + with get_progress_tracker( + console=console, + cust_callables=[self._hyper_out], + ) as pbar: + task = pbar.add_task("Epochs", total=self.total_epochs) + + start = 0 + + if self.analyze_per_epoch: + # First analysis not in parallel mode when using --analyze-per-epoch. + # This allows dataprovider to load it's informative cache. + asked, is_random = self.get_asked_points(n_points=1) + f_val0 = self.hyperopter.generate_optimizer(asked[0]) + self.opt.tell(asked, [f_val0["loss"]]) + self.evaluate_result(f_val0, 1, is_random[0]) + pbar.update(task, advance=1) + start += 1 + + evals = ceil((self.total_epochs - start) / jobs) + for i in range(evals): + # Correct the number of epochs to be processed for the last + # iteration (should not exceed self.total_epochs in total) + n_rest = (i + 1) * jobs - (self.total_epochs - start) + current_jobs = jobs - n_rest if n_rest > 0 else jobs + + asked, is_random = self.get_asked_points(n_points=current_jobs) + f_val = self.run_optimizer_parallel(parallel, asked) + self.opt.tell(asked, [v["loss"] for v in f_val]) + + for j, val in enumerate(f_val): + # Use human-friendly indexes here (starting from 1) + current = i * jobs + j + 1 + start + + self.evaluate_result(val, current, is_random[j]) + pbar.update(task, advance=1) + logging_mp_handle(log_queue) + + except KeyboardInterrupt: + print("User interrupted..") + + logger.info( + f"{self.num_epochs_saved} {plural(self.num_epochs_saved, 'epoch')} " + f"saved to '{self.results_file}'." + ) + + if self.current_best_epoch: + HyperoptTools.try_export_params( + self.config, + self.hyperopter.get_strategy_name(), + self.current_best_epoch, + ) + + HyperoptTools.show_epoch_details( + self.current_best_epoch, self.total_epochs, self.print_json + ) + elif self.num_epochs_saved > 0: + print( + f"No good result found for given optimization function in {self.num_epochs_saved} " + f"{plural(self.num_epochs_saved, 'epoch')}." + ) + else: + # This is printed when Ctrl+C is pressed quickly, before first epochs have + # a chance to be evaluated. + print("No epochs evaluated yet, no best result.") diff --git a/freqtrade/optimize/hyperopt_auto.py b/freqtrade/optimize/hyperopt/hyperopt_auto.py similarity index 96% rename from freqtrade/optimize/hyperopt_auto.py rename to freqtrade/optimize/hyperopt/hyperopt_auto.py index 9d2f89dc7cb..1da80ec02ae 100644 --- a/freqtrade/optimize/hyperopt_auto.py +++ b/freqtrade/optimize/hyperopt/hyperopt_auto.py @@ -5,8 +5,8 @@ """ import logging +from collections.abc import Callable from contextlib import suppress -from typing import Callable from freqtrade.exceptions import OperationalException @@ -14,7 +14,7 @@ with suppress(ImportError): from skopt.space import Dimension -from freqtrade.optimize.hyperopt_interface import EstimatorType, IHyperOpt +from freqtrade.optimize.hyperopt.hyperopt_interface import EstimatorType, IHyperOpt logger = logging.getLogger(__name__) diff --git a/freqtrade/optimize/hyperopt_interface.py b/freqtrade/optimize/hyperopt/hyperopt_interface.py similarity index 99% rename from freqtrade/optimize/hyperopt_interface.py rename to freqtrade/optimize/hyperopt/hyperopt_interface.py index 2c0983b526e..6382d7f8d1a 100644 --- a/freqtrade/optimize/hyperopt_interface.py +++ b/freqtrade/optimize/hyperopt/hyperopt_interface.py @@ -6,7 +6,7 @@ import logging import math from abc import ABC -from typing import Union +from typing import TypeAlias from sklearn.base import RegressorMixin from skopt.space import Categorical, Dimension, Integer @@ -20,7 +20,7 @@ logger = logging.getLogger(__name__) -EstimatorType = Union[RegressorMixin, str] +EstimatorType: TypeAlias = RegressorMixin | str class IHyperOpt(ABC): diff --git a/freqtrade/optimize/hyperopt/hyperopt_logger.py b/freqtrade/optimize/hyperopt/hyperopt_logger.py new file mode 100644 index 00000000000..d6940ee3a5f --- /dev/null +++ b/freqtrade/optimize/hyperopt/hyperopt_logger.py @@ -0,0 +1,40 @@ +import logging +from logging.handlers import QueueHandler +from multiprocessing import Queue, current_process +from queue import Empty + + +logger = logging.getLogger(__name__) + + +def logging_mp_setup(log_queue: Queue, verbosity: int): + """ + Setup logging in a child process. + Must be called in the child process before logging. + log_queue MUST be passed to the child process via inheritance + Which essentially means that the log_queue must be a global, created in the same + file as Parallel is initialized. + """ + current_proc = current_process().name + if current_proc != "MainProcess": + h = QueueHandler(log_queue) + root = logging.getLogger() + root.setLevel(verbosity) + root.addHandler(h) + + +def logging_mp_handle(q: Queue): + """ + Handle logging from a child process. + Must be called in the parent process to handle log messages from the child process. + """ + + try: + while True: + record = q.get(block=False) + if record is None: + break + logger.handle(record) + + except Empty: + pass diff --git a/freqtrade/optimize/hyperopt.py b/freqtrade/optimize/hyperopt/hyperopt_optimizer.py similarity index 58% rename from freqtrade/optimize/hyperopt.py rename to freqtrade/optimize/hyperopt/hyperopt_optimizer.py index daa4661add0..c8d18d2248b 100644 --- a/freqtrade/optimize/hyperopt.py +++ b/freqtrade/optimize/hyperopt/hyperopt_optimizer.py @@ -1,45 +1,34 @@ -# pragma pylint: disable=too-many-instance-attributes, pointless-string-statement - """ -This module contains the hyperopt logic +This module contains the hyperopt optimizer class, which needs to be pickled +and will be sent to the hyperopt worker processes. """ import logging -import random import sys import warnings from datetime import datetime, timezone -from math import ceil -from pathlib import Path -from typing import Any, Optional +from typing import Any -import rapidjson -from joblib import Parallel, cpu_count, delayed, dump, load, wrap_non_picklable_objects +from joblib import dump, load from joblib.externals import cloudpickle from pandas import DataFrame -from rich.console import Console -from freqtrade.constants import DATETIME_PRINT_FORMAT, FTHYPT_FILEVERSION, LAST_BT_RESULT_FN, Config +from freqtrade.constants import DATETIME_PRINT_FORMAT, Config from freqtrade.data.converter import trim_dataframes from freqtrade.data.history import get_timerange from freqtrade.data.metrics import calculate_market_change from freqtrade.enums import HyperoptState from freqtrade.exceptions import OperationalException -from freqtrade.misc import deep_merge_dicts, file_dump_json, plural +from freqtrade.misc import deep_merge_dicts from freqtrade.optimize.backtesting import Backtesting -# Import IHyperOpt and IHyperOptLoss to allow unpickling classes from these modules -from freqtrade.optimize.hyperopt_auto import HyperOptAuto -from freqtrade.optimize.hyperopt_loss_interface import IHyperOptLoss -from freqtrade.optimize.hyperopt_output import HyperoptOutput -from freqtrade.optimize.hyperopt_tools import ( - HyperoptStateContainer, - HyperoptTools, - hyperopt_serializer, -) +# Import IHyperOptLoss to allow unpickling classes from these modules +from freqtrade.optimize.hyperopt.hyperopt_auto import HyperOptAuto +from freqtrade.optimize.hyperopt_loss.hyperopt_loss_interface import IHyperOptLoss +from freqtrade.optimize.hyperopt_tools import HyperoptStateContainer, HyperoptTools from freqtrade.optimize.optimize_reports import generate_strategy_stats from freqtrade.resolvers.hyperopt_resolver import HyperOptLossResolver -from freqtrade.util import get_progress_tracker +from freqtrade.util.dry_run_wallet import get_dry_run_wallet # Suppress scikit-learn FutureWarnings from skopt @@ -51,22 +40,13 @@ logger = logging.getLogger(__name__) -INITIAL_POINTS = 30 - -# Keep no more than SKOPT_MODEL_QUEUE_SIZE models -# in the skopt model queue, to optimize memory consumption -SKOPT_MODEL_QUEUE_SIZE = 10 - MAX_LOSS = 100000 # just a big enough number to be bad result in loss optimization -class Hyperopt: +class HyperOptimizer: """ - Hyperopt class, this class contains all the logic to run a hyperopt simulation - - To start a hyperopt run: - hyperopt = Hyperopt(config) - hyperopt.start() + HyperoptOptimizer class + This class is sent to the hyperopt worker processes. """ def __init__(self, config: Config) -> None: @@ -79,8 +59,6 @@ def __init__(self, config: Config) -> None: self.max_open_trades_space: list[Dimension] = [] self.dimensions: list[Dimension] = [] - self._hyper_out: HyperoptOutput = HyperoptOutput(streaming=True) - self.config = config self.min_date: datetime self.max_date: datetime @@ -89,7 +67,6 @@ def __init__(self, config: Config) -> None: self.pairlist = self.backtesting.pairlists.whitelist self.custom_hyperopt: HyperOptAuto self.analyze_per_epoch = self.config.get("analyze_per_epoch", False) - HyperoptStateContainer.set_state(HyperoptState.STARTUP) if not self.config.get("hyperopt"): self.custom_hyperopt = HyperOptAuto(self.config) @@ -107,54 +84,35 @@ def __init__(self, config: Config) -> None: self.config ) self.calculate_loss = self.custom_hyperoptloss.hyperopt_loss_function - time_now = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") - strategy = str(self.config["strategy"]) - self.results_file: Path = ( - self.config["user_data_dir"] - / "hyperopt_results" - / f"strategy_{strategy}_{time_now}.fthypt" - ) + self.data_pickle_file = ( self.config["user_data_dir"] / "hyperopt_results" / "hyperopt_tickerdata.pkl" ) - self.total_epochs = config.get("epochs", 0) - - self.current_best_loss = 100 - - self.clean_hyperopt() self.market_change = 0.0 - self.num_epochs_saved = 0 - self.current_best_epoch: Optional[dict[str, Any]] = None - - # Use max_open_trades for hyperopt as well, except --disable-max-market-positions is set - if not self.config.get("use_max_market_positions", True): - logger.debug("Ignoring max_open_trades (--disable-max-market-positions was used) ...") - self.backtesting.strategy.max_open_trades = float("inf") - config.update({"max_open_trades": self.backtesting.strategy.max_open_trades}) if HyperoptTools.has_space(self.config, "sell"): # Make sure use_exit_signal is enabled self.config["use_exit_signal"] = True - self.print_all = self.config.get("print_all", False) - self.hyperopt_table_header = 0 - self.print_colorized = self.config.get("print_colorized", False) - self.print_json = self.config.get("print_json", False) + def prepare_hyperopt(self) -> None: + # Initialize spaces ... + self.init_spaces() - @staticmethod - def get_lock_filename(config: Config) -> str: - return str(config["user_data_dir"] / "hyperopt.lock") + self.prepare_hyperopt_data() - def clean_hyperopt(self) -> None: - """ - Remove hyperopt pickle files to restart hyperopt. - """ - for f in [self.data_pickle_file, self.results_file]: - p = Path(f) - if p.is_file(): - logger.info(f"Removing `{p}`.") - p.unlink() + # We don't need exchange instance anymore while running hyperopt + self.backtesting.exchange.close() + self.backtesting.exchange._api = None + self.backtesting.exchange._api_async = None + self.backtesting.exchange.loop = None # type: ignore + self.backtesting.exchange._loop_lock = None # type: ignore + self.backtesting.exchange._cache_lock = None # type: ignore + # self.backtesting.exchange = None # type: ignore + self.backtesting.pairlists = None # type: ignore + + def get_strategy_name(self) -> str: + return self.backtesting.strategy.get_strategy_name() def hyperopt_pickle_magic(self, bases) -> None: """ @@ -177,33 +135,7 @@ def _get_params_dict( # Return a dict where the keys are the names of the dimensions # and the values are taken from the list of parameters. - return {d.name: v for d, v in zip(dimensions, raw_params)} - - def _save_result(self, epoch: dict) -> None: - """ - Save hyperopt results to file - Store one line per epoch. - While not a valid json object - this allows appending easily. - :param epoch: result dictionary for this epoch. - """ - epoch[FTHYPT_FILEVERSION] = 2 - with self.results_file.open("a") as f: - rapidjson.dump( - epoch, - f, - default=hyperopt_serializer, - number_mode=rapidjson.NM_NATIVE | rapidjson.NM_NAN, - ) - f.write("\n") - - self.num_epochs_saved += 1 - logger.debug( - f"{self.num_epochs_saved} {plural(self.num_epochs_saved, 'epoch')} " - f"saved to '{self.results_file}'." - ) - # Store hyperopt filename - latest_filename = Path.joinpath(self.results_file.parent, LAST_BT_RESULT_FN) - file_dump_json(latest_filename, {"latest_hyperopt": str(self.results_file.name)}, log=False) + return {d.name: v for d, v in zip(dimensions, raw_params, strict=False)} def _get_params_details(self, params: dict) -> dict: """ @@ -257,21 +189,6 @@ def _get_no_optimize_details(self) -> dict[str, Any]: result["max_open_trades"] = {"max_open_trades": strategy.max_open_trades} return result - def print_results(self, results: dict[str, Any]) -> None: - """ - Log results if it is better than any previous evaluation - TODO: this should be moved to HyperoptTools too - """ - is_best = results["is_best"] - - if self.print_all or is_best: - self._hyper_out.add_data( - self.config, - [results], - self.total_epochs, - self.print_all, - ) - def init_spaces(self): """ Assign the dimensions in the hyperoptimization space. @@ -447,6 +364,7 @@ def _get_results_dict( config=self.config, processed=processed, backtest_stats=strat_stats, + starting_balance=get_dry_run_wallet(self.config), ) return { "loss": loss, @@ -458,7 +376,14 @@ def _get_results_dict( "total_profit": total_profit, } - def get_optimizer(self, dimensions: list[Dimension], cpu_count) -> Optimizer: + def get_optimizer( + self, + cpu_count: int, + random_state: int, + initial_points: int, + model_queue_size: int, + ) -> Optimizer: + dimensions = self.dimensions estimator = self.custom_hyperopt.generate_estimator(dimensions=dimensions) acq_optimizer = "sampling" @@ -473,21 +398,12 @@ def get_optimizer(self, dimensions: list[Dimension], cpu_count) -> Optimizer: dimensions, base_estimator=estimator, acq_optimizer=acq_optimizer, - n_initial_points=INITIAL_POINTS, + n_initial_points=initial_points, acq_optimizer_kwargs={"n_jobs": cpu_count}, - random_state=self.random_state, - model_queue_size=SKOPT_MODEL_QUEUE_SIZE, - ) - - def run_optimizer_parallel(self, parallel: Parallel, asked: list[list]) -> list[dict[str, Any]]: - """Start optimizer in a parallel way""" - return parallel( - delayed(wrap_non_picklable_objects(self.generate_optimizer))(v) for v in asked + random_state=random_state, + model_queue_size=model_queue_size, ) - def _set_random_state(self, random_state: Optional[int]) -> int: - return random_state or random.randint(1, 2**16 - 1) # noqa: S311 - def advise_and_trim(self, data: dict[str, DataFrame]) -> dict[str, DataFrame]: preprocessed = self.backtesting.strategy.advise_all_indicators(data) @@ -523,173 +439,3 @@ def prepare_hyperopt_data(self) -> None: dump(preprocessed, self.data_pickle_file) else: dump(data, self.data_pickle_file) - - def get_asked_points(self, n_points: int) -> tuple[list[list[Any]], list[bool]]: - """ - Enforce points returned from `self.opt.ask` have not been already evaluated - - Steps: - 1. Try to get points using `self.opt.ask` first - 2. Discard the points that have already been evaluated - 3. Retry using `self.opt.ask` up to 3 times - 4. If still some points are missing in respect to `n_points`, random sample some points - 5. Repeat until at least `n_points` points in the `asked_non_tried` list - 6. Return a list with length truncated at `n_points` - """ - - def unique_list(a_list): - new_list = [] - for item in a_list: - if item not in new_list: - new_list.append(item) - return new_list - - i = 0 - asked_non_tried: list[list[Any]] = [] - is_random_non_tried: list[bool] = [] - while i < 5 and len(asked_non_tried) < n_points: - if i < 3: - self.opt.cache_ = {} - asked = unique_list(self.opt.ask(n_points=n_points * 5 if i > 0 else n_points)) - is_random = [False for _ in range(len(asked))] - else: - asked = unique_list(self.opt.space.rvs(n_samples=n_points * 5)) - is_random = [True for _ in range(len(asked))] - is_random_non_tried += [ - rand - for x, rand in zip(asked, is_random) - if x not in self.opt.Xi and x not in asked_non_tried - ] - asked_non_tried += [ - x for x in asked if x not in self.opt.Xi and x not in asked_non_tried - ] - i += 1 - - if asked_non_tried: - return ( - asked_non_tried[: min(len(asked_non_tried), n_points)], - is_random_non_tried[: min(len(asked_non_tried), n_points)], - ) - else: - return self.opt.ask(n_points=n_points), [False for _ in range(n_points)] - - def evaluate_result(self, val: dict[str, Any], current: int, is_random: bool): - """ - Evaluate results returned from generate_optimizer - """ - val["current_epoch"] = current - val["is_initial_point"] = current <= INITIAL_POINTS - - logger.debug("Optimizer epoch evaluated: %s", val) - - is_best = HyperoptTools.is_best_loss(val, self.current_best_loss) - # This value is assigned here and not in the optimization method - # to keep proper order in the list of results. That's because - # evaluations can take different time. Here they are aligned in the - # order they will be shown to the user. - val["is_best"] = is_best - val["is_random"] = is_random - self.print_results(val) - - if is_best: - self.current_best_loss = val["loss"] - self.current_best_epoch = val - - self._save_result(val) - - def start(self) -> None: - self.random_state = self._set_random_state(self.config.get("hyperopt_random_state")) - logger.info(f"Using optimizer random state: {self.random_state}") - self.hyperopt_table_header = -1 - # Initialize spaces ... - self.init_spaces() - - self.prepare_hyperopt_data() - - # We don't need exchange instance anymore while running hyperopt - self.backtesting.exchange.close() - self.backtesting.exchange._api = None - self.backtesting.exchange._api_async = None - self.backtesting.exchange.loop = None # type: ignore - self.backtesting.exchange._loop_lock = None # type: ignore - self.backtesting.exchange._cache_lock = None # type: ignore - # self.backtesting.exchange = None # type: ignore - self.backtesting.pairlists = None # type: ignore - - cpus = cpu_count() - logger.info(f"Found {cpus} CPU cores. Let's make them scream!") - config_jobs = self.config.get("hyperopt_jobs", -1) - logger.info(f"Number of parallel jobs set as: {config_jobs}") - - self.opt = self.get_optimizer(self.dimensions, config_jobs) - - try: - with Parallel(n_jobs=config_jobs) as parallel: - jobs = parallel._effective_n_jobs() - logger.info(f"Effective number of parallel workers used: {jobs}") - console = Console( - color_system="auto" if self.print_colorized else None, - ) - - # Define progressbar - with get_progress_tracker( - console=console, - cust_callables=[self._hyper_out], - ) as pbar: - task = pbar.add_task("Epochs", total=self.total_epochs) - - start = 0 - - if self.analyze_per_epoch: - # First analysis not in parallel mode when using --analyze-per-epoch. - # This allows dataprovider to load it's informative cache. - asked, is_random = self.get_asked_points(n_points=1) - f_val0 = self.generate_optimizer(asked[0]) - self.opt.tell(asked, [f_val0["loss"]]) - self.evaluate_result(f_val0, 1, is_random[0]) - pbar.update(task, advance=1) - start += 1 - - evals = ceil((self.total_epochs - start) / jobs) - for i in range(evals): - # Correct the number of epochs to be processed for the last - # iteration (should not exceed self.total_epochs in total) - n_rest = (i + 1) * jobs - (self.total_epochs - start) - current_jobs = jobs - n_rest if n_rest > 0 else jobs - - asked, is_random = self.get_asked_points(n_points=current_jobs) - f_val = self.run_optimizer_parallel(parallel, asked) - self.opt.tell(asked, [v["loss"] for v in f_val]) - - for j, val in enumerate(f_val): - # Use human-friendly indexes here (starting from 1) - current = i * jobs + j + 1 + start - - self.evaluate_result(val, current, is_random[j]) - pbar.update(task, advance=1) - - except KeyboardInterrupt: - print("User interrupted..") - - logger.info( - f"{self.num_epochs_saved} {plural(self.num_epochs_saved, 'epoch')} " - f"saved to '{self.results_file}'." - ) - - if self.current_best_epoch: - HyperoptTools.try_export_params( - self.config, self.backtesting.strategy.get_strategy_name(), self.current_best_epoch - ) - - HyperoptTools.show_epoch_details( - self.current_best_epoch, self.total_epochs, self.print_json - ) - elif self.num_epochs_saved > 0: - print( - f"No good result found for given optimization function in {self.num_epochs_saved} " - f"{plural(self.num_epochs_saved, 'epoch')}." - ) - else: - # This is printed when Ctrl+C is pressed quickly, before first epochs have - # a chance to be evaluated. - print("No epochs evaluated yet, no best result.") diff --git a/freqtrade/optimize/hyperopt_output.py b/freqtrade/optimize/hyperopt/hyperopt_output.py similarity index 97% rename from freqtrade/optimize/hyperopt_output.py rename to freqtrade/optimize/hyperopt/hyperopt_output.py index c30715046b7..5327bffc17e 100644 --- a/freqtrade/optimize/hyperopt_output.py +++ b/freqtrade/optimize/hyperopt/hyperopt_output.py @@ -1,6 +1,6 @@ import sys from os import get_terminal_size -from typing import Any, Optional +from typing import Any from rich.align import Align from rich.console import Console @@ -37,7 +37,7 @@ def __init_table(self) -> None: self.table.add_column("Objective", justify="right") self.table.add_column("Max Drawdown (Acct)", justify="right") - def print(self, console: Optional[Console] = None, *, print_colorized=True): + def print(self, console: Console | None = None, *, print_colorized=True): if not console: console = Console( color_system="auto" if print_colorized else None, @@ -57,7 +57,7 @@ def add_data( stake_currency = config["stake_currency"] self._results.extend(results) - max_rows: Optional[int] = None + max_rows: int | None = None if self._streaming: try: diff --git a/freqtrade/optimize/hyperopt_loss/hyperopt_loss_calmar.py b/freqtrade/optimize/hyperopt_loss/hyperopt_loss_calmar.py index f22d59e50b5..4f1a82e1ea4 100644 --- a/freqtrade/optimize/hyperopt_loss/hyperopt_loss_calmar.py +++ b/freqtrade/optimize/hyperopt_loss/hyperopt_loss_calmar.py @@ -9,7 +9,6 @@ from pandas import DataFrame -from freqtrade.constants import Config from freqtrade.data.metrics import calculate_calmar from freqtrade.optimize.hyperopt import IHyperOptLoss @@ -24,10 +23,9 @@ class CalmarHyperOptLoss(IHyperOptLoss): @staticmethod def hyperopt_loss_function( results: DataFrame, - trade_count: int, min_date: datetime, max_date: datetime, - config: Config, + starting_balance: float, *args, **kwargs, ) -> float: @@ -36,7 +34,6 @@ def hyperopt_loss_function( Uses Calmar Ratio calculation. """ - starting_balance = config["dry_run_wallet"] calmar_ratio = calculate_calmar(results, min_date, max_date, starting_balance) # print(expected_returns_mean, max_drawdown, calmar_ratio) return -calmar_ratio diff --git a/freqtrade/optimize/hyperopt_loss_interface.py b/freqtrade/optimize/hyperopt_loss/hyperopt_loss_interface.py similarity index 96% rename from freqtrade/optimize/hyperopt_loss_interface.py rename to freqtrade/optimize/hyperopt_loss/hyperopt_loss_interface.py index a48fee7313d..ddc96d6a0ea 100644 --- a/freqtrade/optimize/hyperopt_loss_interface.py +++ b/freqtrade/optimize/hyperopt_loss/hyperopt_loss_interface.py @@ -31,6 +31,7 @@ def hyperopt_loss_function( config: Config, processed: dict[str, DataFrame], backtest_stats: dict[str, Any], + starting_balance: float, **kwargs, ) -> float: """ diff --git a/freqtrade/optimize/hyperopt_loss/hyperopt_loss_max_drawdown_relative.py b/freqtrade/optimize/hyperopt_loss/hyperopt_loss_max_drawdown_relative.py index ee7088d755e..3cd578cb403 100644 --- a/freqtrade/optimize/hyperopt_loss/hyperopt_loss_max_drawdown_relative.py +++ b/freqtrade/optimize/hyperopt_loss/hyperopt_loss_max_drawdown_relative.py @@ -7,7 +7,6 @@ from pandas import DataFrame -from freqtrade.constants import Config from freqtrade.data.metrics import calculate_underwater from freqtrade.optimize.hyperopt import IHyperOptLoss @@ -21,7 +20,9 @@ class MaxDrawDownRelativeHyperOptLoss(IHyperOptLoss): """ @staticmethod - def hyperopt_loss_function(results: DataFrame, config: Config, *args, **kwargs) -> float: + def hyperopt_loss_function( + results: DataFrame, starting_balance: float, *args, **kwargs + ) -> float: """ Objective function. @@ -31,7 +32,7 @@ def hyperopt_loss_function(results: DataFrame, config: Config, *args, **kwargs) total_profit = results["profit_abs"].sum() try: drawdown_df = calculate_underwater( - results, value_col="profit_abs", starting_balance=config["dry_run_wallet"] + results, value_col="profit_abs", starting_balance=starting_balance ) max_drawdown = abs(min(drawdown_df["drawdown"])) relative_drawdown = max(drawdown_df["drawdown_relative"]) diff --git a/freqtrade/optimize/hyperopt_loss/hyperopt_loss_multi_metric.py b/freqtrade/optimize/hyperopt_loss/hyperopt_loss_multi_metric.py index de8d117d6ae..adffdfb0bca 100644 --- a/freqtrade/optimize/hyperopt_loss/hyperopt_loss_multi_metric.py +++ b/freqtrade/optimize/hyperopt_loss/hyperopt_loss_multi_metric.py @@ -33,7 +33,6 @@ import numpy as np from pandas import DataFrame -from freqtrade.constants import Config from freqtrade.data.metrics import calculate_expectancy, calculate_max_drawdown from freqtrade.optimize.hyperopt import IHyperOptLoss @@ -57,7 +56,7 @@ class MultiMetricHyperOptLoss(IHyperOptLoss): def hyperopt_loss_function( results: DataFrame, trade_count: int, - config: Config, + starting_balance: float, **kwargs, ) -> float: total_profit = results["profit_abs"].sum() @@ -83,7 +82,7 @@ def hyperopt_loss_function( # Calculate drawdown try: drawdown = calculate_max_drawdown( - results, starting_balance=config["dry_run_wallet"], value_col="profit_abs" + results, starting_balance=starting_balance, value_col="profit_abs" ) relative_account_drawdown = drawdown.relative_account_drawdown except ValueError: diff --git a/freqtrade/optimize/hyperopt_loss/hyperopt_loss_profit_drawdown.py b/freqtrade/optimize/hyperopt_loss/hyperopt_loss_profit_drawdown.py index 61e2a6d3266..af1b33dfb7e 100644 --- a/freqtrade/optimize/hyperopt_loss/hyperopt_loss_profit_drawdown.py +++ b/freqtrade/optimize/hyperopt_loss/hyperopt_loss_profit_drawdown.py @@ -10,7 +10,6 @@ from pandas import DataFrame -from freqtrade.constants import Config from freqtrade.data.metrics import calculate_max_drawdown from freqtrade.optimize.hyperopt import IHyperOptLoss @@ -21,12 +20,14 @@ class ProfitDrawDownHyperOptLoss(IHyperOptLoss): @staticmethod - def hyperopt_loss_function(results: DataFrame, config: Config, *args, **kwargs) -> float: + def hyperopt_loss_function( + results: DataFrame, starting_balance: float, *args, **kwargs + ) -> float: total_profit = results["profit_abs"].sum() try: drawdown = calculate_max_drawdown( - results, starting_balance=config["dry_run_wallet"], value_col="profit_abs" + results, starting_balance=starting_balance, value_col="profit_abs" ) relative_account_drawdown = drawdown.relative_account_drawdown except ValueError: diff --git a/freqtrade/optimize/hyperopt_loss/hyperopt_loss_sharpe.py b/freqtrade/optimize/hyperopt_loss/hyperopt_loss_sharpe.py index 2c7042a8a71..20e4ee2b6c6 100644 --- a/freqtrade/optimize/hyperopt_loss/hyperopt_loss_sharpe.py +++ b/freqtrade/optimize/hyperopt_loss/hyperopt_loss_sharpe.py @@ -9,7 +9,6 @@ from pandas import DataFrame -from freqtrade.constants import Config from freqtrade.data.metrics import calculate_sharpe from freqtrade.optimize.hyperopt import IHyperOptLoss @@ -24,10 +23,9 @@ class SharpeHyperOptLoss(IHyperOptLoss): @staticmethod def hyperopt_loss_function( results: DataFrame, - trade_count: int, min_date: datetime, max_date: datetime, - config: Config, + starting_balance: float, *args, **kwargs, ) -> float: @@ -36,7 +34,6 @@ def hyperopt_loss_function( Uses Sharpe Ratio calculation. """ - starting_balance = config["dry_run_wallet"] sharp_ratio = calculate_sharpe(results, min_date, max_date, starting_balance) # print(expected_returns_mean, up_stdev, sharp_ratio) return -sharp_ratio diff --git a/freqtrade/optimize/hyperopt_loss/hyperopt_loss_sortino.py b/freqtrade/optimize/hyperopt_loss/hyperopt_loss_sortino.py index 32ff0c73f69..935d038e554 100644 --- a/freqtrade/optimize/hyperopt_loss/hyperopt_loss_sortino.py +++ b/freqtrade/optimize/hyperopt_loss/hyperopt_loss_sortino.py @@ -9,7 +9,6 @@ from pandas import DataFrame -from freqtrade.constants import Config from freqtrade.data.metrics import calculate_sortino from freqtrade.optimize.hyperopt import IHyperOptLoss @@ -24,10 +23,9 @@ class SortinoHyperOptLoss(IHyperOptLoss): @staticmethod def hyperopt_loss_function( results: DataFrame, - trade_count: int, min_date: datetime, max_date: datetime, - config: Config, + starting_balance: float, *args, **kwargs, ) -> float: @@ -36,7 +34,6 @@ def hyperopt_loss_function( Uses Sortino Ratio calculation. """ - starting_balance = config["dry_run_wallet"] sortino_ratio = calculate_sortino(results, min_date, max_date, starting_balance) # print(expected_returns_mean, down_stdev, sortino_ratio) return -sortino_ratio diff --git a/freqtrade/optimize/hyperopt_tools.py b/freqtrade/optimize/hyperopt_tools.py index 66e194510d2..ff4747781b4 100644 --- a/freqtrade/optimize/hyperopt_tools.py +++ b/freqtrade/optimize/hyperopt_tools.py @@ -3,7 +3,7 @@ from copy import deepcopy from datetime import datetime, timezone from pathlib import Path -from typing import Any, Optional +from typing import Any import numpy as np import rapidjson @@ -44,7 +44,7 @@ def set_state(cls, value: HyperoptState): class HyperoptTools: @staticmethod - def get_strategy_filename(config: Config, strategy_name: str) -> Optional[Path]: + def get_strategy_filename(config: Config, strategy_name: str) -> Path | None: """ Get Strategy-location (filename) from strategy_name """ @@ -188,7 +188,7 @@ def show_epoch_details( total_epochs: int, print_json: bool, no_header: bool = False, - header_str: Optional[str] = None, + header_str: str | None = None, ) -> None: """ Display details of the hyperopt result @@ -257,7 +257,7 @@ def _params_update_for_json(result_dict, params, non_optimized, space: str) -> N @staticmethod def _params_pretty_print( - params, space: str, header: str, non_optimized: Optional[dict] = None + params, space: str, header: str, non_optimized: dict | None = None ) -> None: if space in params or (non_optimized and space in non_optimized): space_params = HyperoptTools._space_params(params, space, 5) @@ -299,7 +299,7 @@ def _params_pretty_print( print(result) @staticmethod - def _space_params(params, space: str, r: Optional[int] = None) -> dict: + def _space_params(params, space: str, r: int | None = None) -> dict: d = params.get(space) if d: # Round floats to `r` digits after the decimal point if requested @@ -374,7 +374,6 @@ def export_csv_file(config: Config, results: list, csv_file: str) -> None: trials = json_normalize(results, max_level=1) trials["Best"] = "" - trials["Stake currency"] = config["stake_currency"] base_metrics = [ "Best", @@ -383,11 +382,13 @@ def export_csv_file(config: Config, results: list, csv_file: str) -> None: "results_metrics.profit_mean", "results_metrics.profit_median", "results_metrics.profit_total", - "Stake currency", + "results_metrics.stake_currency", "results_metrics.profit_total_abs", "results_metrics.holding_avg", "results_metrics.trade_count_long", "results_metrics.trade_count_short", + "results_metrics.max_drawdown_abs", + "results_metrics.max_drawdown_account", "loss", "is_initial_point", "is_best", @@ -409,6 +410,8 @@ def export_csv_file(config: Config, results: list, csv_file: str) -> None: "Avg duration", "Trade count long", "Trade count short", + "Max drawdown", + "Max drawdown percent", "Objective", "is_initial_point", "is_best", @@ -432,6 +435,9 @@ def export_csv_file(config: Config, results: list, csv_file: str) -> None: trials["Avg profit"] = trials["Avg profit"].apply( lambda x: f"{x * perc_multi:,.2f}%" if not isna(x) else "" ) + trials["Max drawdown percent"] = trials["Max drawdown percent"].apply( + lambda x: f"{x * perc_multi:,.2f}%" if not isna(x) else "" + ) trials["Objective"] = trials["Objective"].apply( lambda x: f"{x:,.5f}" if x != 100000 else "" ) diff --git a/freqtrade/optimize/optimize_reports/__init__.py b/freqtrade/optimize/optimize_reports/__init__.py index 6f3278a1c7e..c08bae4bee1 100644 --- a/freqtrade/optimize/optimize_reports/__init__.py +++ b/freqtrade/optimize/optimize_reports/__init__.py @@ -11,10 +11,7 @@ text_table_strategy, text_table_tags, ) -from freqtrade.optimize.optimize_reports.bt_storage import ( - store_backtest_analysis_results, - store_backtest_stats, -) +from freqtrade.optimize.optimize_reports.bt_storage import store_backtest_results from freqtrade.optimize.optimize_reports.optimize_reports import ( generate_all_periodic_breakdown_stats, generate_backtest_stats, diff --git a/freqtrade/optimize/optimize_reports/bt_output.py b/freqtrade/optimize/optimize_reports/bt_output.py index a1dd7335868..4fdc03d7bb1 100644 --- a/freqtrade/optimize/optimize_reports/bt_output.py +++ b/freqtrade/optimize/optimize_reports/bt_output.py @@ -1,5 +1,5 @@ import logging -from typing import Any, Literal, Union +from typing import Any, Literal from freqtrade.constants import UNLIMITED_STAKE_AMOUNT, Config from freqtrade.ft_types import BacktestResultType @@ -18,7 +18,7 @@ def _get_line_floatfmt(stake_currency: str) -> list[str]: def _get_line_header( - first_column: Union[str, list[str]], stake_currency: str, direction: str = "Trades" + first_column: str | list[str], stake_currency: str, direction: str = "Trades" ) -> list[str]: """ Generate header lines (goes in line with _generate_result_line()) @@ -172,7 +172,7 @@ def text_table_strategy(strategy_results, stake_currency: str, title: str): dd_pad_per = max([len(dd) for dd in drawdown]) drawdown = [ f'{t["max_drawdown_abs"]:>{dd_pad_abs}} {stake_currency} {dd:>{dd_pad_per}}%' - for t, dd in zip(strategy_results, drawdown) + for t, dd in zip(strategy_results, drawdown, strict=False) ] output = [ @@ -186,7 +186,7 @@ def text_table_strategy(strategy_results, stake_currency: str, title: str): generate_wins_draws_losses(t["wins"], t["draws"], t["losses"]), drawdown, ] - for t, drawdown in zip(strategy_results, drawdown) + for t, drawdown in zip(strategy_results, drawdown, strict=False) ] print_rich_table(output, headers, summary=title) diff --git a/freqtrade/optimize/optimize_reports/bt_storage.py b/freqtrade/optimize/optimize_reports/bt_storage.py index 9633d9c18a2..cd47aab1881 100644 --- a/freqtrade/optimize/optimize_reports/bt_storage.py +++ b/freqtrade/optimize/optimize_reports/bt_storage.py @@ -1,10 +1,10 @@ import logging from pathlib import Path -from typing import Optional from pandas import DataFrame from freqtrade.constants import LAST_BT_RESULT_FN +from freqtrade.enums.runmode import RunMode from freqtrade.ft_types import BacktestResultType from freqtrade.misc import file_dump_joblib, file_dump_json from freqtrade.optimize.backtest_caching import get_backtest_metadata_filename @@ -30,21 +30,27 @@ def _generate_filename(recordfilename: Path, appendix: str, suffix: str) -> Path return filename -def store_backtest_stats( - recordfilename: Path, +def store_backtest_results( + config: dict, stats: BacktestResultType, dtappendix: str, *, - market_change_data: Optional[DataFrame] = None, + market_change_data: DataFrame | None = None, + analysis_results: dict[str, dict[str, DataFrame]] | None = None, ) -> Path: """ - Stores backtest results - :param recordfilename: Path object, which can either be a filename or a directory. - Filenames will be appended with a timestamp right before the suffix - while for directories, /backtest-result-.json will be used as filename + Stores backtest results and analysis data + :param config: Configuration dictionary :param stats: Dataframe containing the backtesting statistics :param dtappendix: Datetime to use for the filename + :param market_change_data: Dataframe containing market change data + :param analysis_results: Dictionary containing analysis results """ + + # Path object, which can either be a filename or a directory. + # Filenames will be appended with a timestamp right before the suffix + # while for directories, /backtest-result-.json will be used as filename + recordfilename: Path = config["exportfilename"] filename = _generate_filename(recordfilename, dtappendix, ".json") # Store metadata separately. @@ -66,6 +72,21 @@ def store_backtest_stats( filename_mc, compression_level=9, compression="lz4" ) + if ( + config.get("export", "none") == "signals" + and analysis_results is not None + and config.get("runmode", RunMode.OTHER) == RunMode.BACKTEST + ): + _store_backtest_analysis_data( + recordfilename, analysis_results["signals"], dtappendix, "signals" + ) + _store_backtest_analysis_data( + recordfilename, analysis_results["rejected"], dtappendix, "rejected" + ) + _store_backtest_analysis_data( + recordfilename, analysis_results["exited"], dtappendix, "exited" + ) + return filename @@ -87,15 +108,3 @@ def _store_backtest_analysis_data( file_dump_joblib(filename, data) return filename - - -def store_backtest_analysis_results( - recordfilename: Path, - candles: dict[str, dict], - trades: dict[str, dict], - exited: dict[str, dict], - dtappendix: str, -) -> None: - _store_backtest_analysis_data(recordfilename, candles, dtappendix, "signals") - _store_backtest_analysis_data(recordfilename, trades, dtappendix, "rejected") - _store_backtest_analysis_data(recordfilename, exited, dtappendix, "exited") diff --git a/freqtrade/optimize/optimize_reports/optimize_reports.py b/freqtrade/optimize/optimize_reports/optimize_reports.py index 9650bdde6d0..23119077bfb 100644 --- a/freqtrade/optimize/optimize_reports/optimize_reports.py +++ b/freqtrade/optimize/optimize_reports/optimize_reports.py @@ -1,7 +1,7 @@ import logging from copy import deepcopy from datetime import datetime, timedelta, timezone -from typing import Any, Literal, Union +from typing import Any, Literal import numpy as np from pandas import DataFrame, Series, concat, to_datetime @@ -18,7 +18,7 @@ calculate_sortino, ) from freqtrade.ft_types import BacktestResultType -from freqtrade.util import decimals_per_coin, fmt_coin +from freqtrade.util import decimals_per_coin, fmt_coin, get_dry_run_wallet logger = logging.getLogger(__name__) @@ -69,7 +69,7 @@ def generate_rejected_signals( def _generate_result_line( - result: DataFrame, starting_balance: int, first_column: Union[str, list[str]] + result: DataFrame, starting_balance: float, first_column: str | list[str] ) -> dict: """ Generate one result dict, with "first_column" as key. @@ -111,7 +111,7 @@ def _generate_result_line( def generate_pair_metrics( pairlist: list[str], stake_currency: str, - starting_balance: int, + starting_balance: float, results: DataFrame, skip_nan: bool = False, ) -> list[dict]: @@ -143,8 +143,8 @@ def generate_pair_metrics( def generate_tag_metrics( - tag_type: Union[Literal["enter_tag", "exit_reason"], list[Literal["enter_tag", "exit_reason"]]], - starting_balance: int, + tag_type: Literal["enter_tag", "exit_reason"] | list[Literal["enter_tag", "exit_reason"]], + starting_balance: float, results: DataFrame, skip_nan: bool = False, ) -> list[dict]: @@ -208,7 +208,7 @@ def _get_resample_from_period(period: str) -> str: def generate_periodic_breakdown_stats( - trade_list: Union[list, DataFrame], period: str + trade_list: list | DataFrame, period: str ) -> list[dict[str, Any]]: results = trade_list if not isinstance(trade_list, list) else DataFrame.from_records(trade_list) if len(results) == 0: @@ -373,7 +373,7 @@ def generate_strategy_stats( return {} config = content["config"] max_open_trades = min(config["max_open_trades"], len(pairlist)) - start_balance = config["dry_run_wallet"] + start_balance = get_dry_run_wallet(config) stake_currency = config["stake_currency"] pair_results = generate_pair_metrics( @@ -559,7 +559,7 @@ def generate_strategy_stats( def generate_backtest_stats( btdata: dict[str, DataFrame], - all_results: dict[str, dict[str, Union[DataFrame, dict]]], + all_results: dict[str, dict[str, DataFrame | dict]], min_date: datetime, max_date: datetime, ) -> BacktestResultType: diff --git a/freqtrade/persistence/custom_data.py b/freqtrade/persistence/custom_data.py index 3a2e700fba7..17c0cbf0ae1 100644 --- a/freqtrade/persistence/custom_data.py +++ b/freqtrade/persistence/custom_data.py @@ -2,7 +2,7 @@ import logging from collections.abc import Sequence from datetime import datetime -from typing import Any, ClassVar, Optional +from typing import Any, ClassVar from sqlalchemy import DateTime, ForeignKey, Integer, String, Text, UniqueConstraint, select from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -42,7 +42,7 @@ class _CustomData(ModelBase): cd_type: Mapped[str] = mapped_column(String(25), nullable=False) cd_value: Mapped[str] = mapped_column(Text, nullable=False) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=dt_now) - updated_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True) + updated_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True) # Empty container value - not persisted, but filled with cd_value on query value: Any = None @@ -62,7 +62,7 @@ def __repr__(self): @classmethod def query_cd( - cls, key: Optional[str] = None, trade_id: Optional[int] = None + cls, key: str | None = None, trade_id: int | None = None ) -> Sequence["_CustomData"]: """ Get all CustomData, if trade_id is not specified @@ -117,7 +117,7 @@ def delete_custom_data(trade_id: int) -> None: _CustomData.session.commit() @staticmethod - def get_custom_data(*, trade_id: int, key: Optional[str] = None) -> list[_CustomData]: + def get_custom_data(*, trade_id: int, key: str | None = None) -> list[_CustomData]: if CustomDataWrapper.use_db: filters = [ _CustomData.ft_trade_id == trade_id, diff --git a/freqtrade/persistence/key_value_store.py b/freqtrade/persistence/key_value_store.py index 93960a10239..e7b782ac447 100644 --- a/freqtrade/persistence/key_value_store.py +++ b/freqtrade/persistence/key_value_store.py @@ -1,6 +1,6 @@ from datetime import datetime, timezone from enum import Enum -from typing import ClassVar, Optional, Union +from typing import ClassVar from sqlalchemy import String from sqlalchemy.orm import Mapped, mapped_column @@ -8,7 +8,7 @@ from freqtrade.persistence.base import ModelBase, SessionType -ValueTypes = Union[str, datetime, float, int] +ValueTypes = str | datetime | float | int class ValueTypesEnum(str, Enum): @@ -37,10 +37,10 @@ class _KeyValueStoreModel(ModelBase): value_type: Mapped[ValueTypesEnum] = mapped_column(String(20), nullable=False) - string_value: Mapped[Optional[str]] = mapped_column(String(255), nullable=True) - datetime_value: Mapped[Optional[datetime]] - float_value: Mapped[Optional[float]] - int_value: Mapped[Optional[int]] + string_value: Mapped[str | None] = mapped_column(String(255), nullable=True) + datetime_value: Mapped[datetime | None] + float_value: Mapped[float | None] + int_value: Mapped[int | None] class KeyValueStore: @@ -97,7 +97,7 @@ def delete_value(key: KeyStoreKeys) -> None: _KeyValueStoreModel.session.commit() @staticmethod - def get_value(key: KeyStoreKeys) -> Optional[ValueTypes]: + def get_value(key: KeyStoreKeys) -> ValueTypes | None: """ Get the value for the given key. :param key: Key to get the value for @@ -121,7 +121,7 @@ def get_value(key: KeyStoreKeys) -> Optional[ValueTypes]: raise ValueError(f"Unknown value type {kv.value_type}") # pragma: no cover @staticmethod - def get_string_value(key: KeyStoreKeys) -> Optional[str]: + def get_string_value(key: KeyStoreKeys) -> str | None: """ Get the value for the given key. :param key: Key to get the value for @@ -139,7 +139,7 @@ def get_string_value(key: KeyStoreKeys) -> Optional[str]: return kv.string_value @staticmethod - def get_datetime_value(key: KeyStoreKeys) -> Optional[datetime]: + def get_datetime_value(key: KeyStoreKeys) -> datetime | None: """ Get the value for the given key. :param key: Key to get the value for @@ -157,7 +157,7 @@ def get_datetime_value(key: KeyStoreKeys) -> Optional[datetime]: return kv.datetime_value.replace(tzinfo=timezone.utc) @staticmethod - def get_float_value(key: KeyStoreKeys) -> Optional[float]: + def get_float_value(key: KeyStoreKeys) -> float | None: """ Get the value for the given key. :param key: Key to get the value for @@ -175,7 +175,7 @@ def get_float_value(key: KeyStoreKeys) -> Optional[float]: return kv.float_value @staticmethod - def get_int_value(key: KeyStoreKeys) -> Optional[int]: + def get_int_value(key: KeyStoreKeys) -> int | None: """ Get the value for the given key. :param key: Key to get the value for diff --git a/freqtrade/persistence/migrations.py b/freqtrade/persistence/migrations.py index 1dd69493f31..7a88c61c0b9 100644 --- a/freqtrade/persistence/migrations.py +++ b/freqtrade/persistence/migrations.py @@ -1,5 +1,4 @@ import logging -from typing import Optional from sqlalchemy import inspect, select, text, update @@ -32,8 +31,8 @@ def get_backup_name(tabs: list[str], backup_prefix: str): def get_last_sequence_ids(engine, trade_back_name: str, order_back_name: str): - order_id: Optional[int] = None - trade_id: Optional[int] = None + order_id: int | None = None + trade_id: int | None = None if engine.name == "postgresql": with engine.begin() as connection: diff --git a/freqtrade/persistence/models.py b/freqtrade/persistence/models.py index 87ba3a2d27f..bfcf83457c1 100644 --- a/freqtrade/persistence/models.py +++ b/freqtrade/persistence/models.py @@ -5,7 +5,7 @@ import logging import threading from contextvars import ContextVar -from typing import Any, Final, Optional +from typing import Any, Final from sqlalchemy import create_engine, inspect from sqlalchemy.exc import NoSuchModuleError @@ -25,10 +25,10 @@ REQUEST_ID_CTX_KEY: Final[str] = "request_id" -_request_id_ctx_var: ContextVar[Optional[str]] = ContextVar(REQUEST_ID_CTX_KEY, default=None) +_request_id_ctx_var: ContextVar[str | None] = ContextVar(REQUEST_ID_CTX_KEY, default=None) -def get_request_or_thread_id() -> Optional[str]: +def get_request_or_thread_id() -> str | None: """ Helper method to get either async context (for fastapi requests), or thread id """ diff --git a/freqtrade/persistence/pairlock.py b/freqtrade/persistence/pairlock.py index caec2c78a77..6c98a607d5e 100644 --- a/freqtrade/persistence/pairlock.py +++ b/freqtrade/persistence/pairlock.py @@ -1,5 +1,5 @@ from datetime import datetime, timezone -from typing import Any, ClassVar, Optional +from typing import Any, ClassVar from sqlalchemy import ScalarResult, String, or_, select from sqlalchemy.orm import Mapped, mapped_column @@ -21,7 +21,7 @@ class PairLock(ModelBase): pair: Mapped[str] = mapped_column(String(25), nullable=False, index=True) # lock direction - long, short or * (for both) side: Mapped[str] = mapped_column(String(25), nullable=False, default="*") - reason: Mapped[Optional[str]] = mapped_column(String(255), nullable=True) + reason: Mapped[str | None] = mapped_column(String(255), nullable=True) # Time the pair was locked (start time) lock_time: Mapped[datetime] = mapped_column(nullable=False) # Time until the pair is locked (end time) @@ -39,7 +39,7 @@ def __repr__(self) -> str: @staticmethod def query_pair_locks( - pair: Optional[str], now: datetime, side: str = "*" + pair: str | None, now: datetime, side: str | None = None ) -> ScalarResult["PairLock"]: """ Get all currently active locks for this pair @@ -53,9 +53,9 @@ def query_pair_locks( ] if pair: filters.append(PairLock.pair == pair) - if side != "*": + if side is not None and side != "*": filters.append(or_(PairLock.side == side, PairLock.side == "*")) - else: + elif side is not None: filters.append(PairLock.side == "*") return PairLock.session.scalars(select(PairLock).filter(*filters)) diff --git a/freqtrade/persistence/pairlock_middleware.py b/freqtrade/persistence/pairlock_middleware.py index a305924211b..0adbcc8be77 100644 --- a/freqtrade/persistence/pairlock_middleware.py +++ b/freqtrade/persistence/pairlock_middleware.py @@ -1,7 +1,6 @@ import logging from collections.abc import Sequence from datetime import datetime, timezone -from typing import Optional from sqlalchemy import select @@ -36,9 +35,9 @@ def reset_locks() -> None: def lock_pair( pair: str, until: datetime, - reason: Optional[str] = None, + reason: str | None = None, *, - now: Optional[datetime] = None, + now: datetime | None = None, side: str = "*", ) -> PairLock: """ @@ -68,13 +67,14 @@ def lock_pair( @staticmethod def get_pair_locks( - pair: Optional[str], now: Optional[datetime] = None, side: str = "*" + pair: str | None, now: datetime | None = None, side: str | None = None ) -> Sequence[PairLock]: """ Get all currently active locks for this pair :param pair: Pair to check for. Returns all current locks if pair is empty :param now: Datetime object (generated via datetime.now(timezone.utc)). defaults to datetime.now(timezone.utc) + :param side: Side get locks for, can be 'long', 'short', '*' or None """ if not now: now = datetime.now(timezone.utc) @@ -89,15 +89,15 @@ def get_pair_locks( lock.lock_end_time >= now and lock.active is True and (pair is None or lock.pair == pair) - and (lock.side == "*" or lock.side == side) + and (side is None or lock.side == "*" or lock.side == side) ) ] return locks @staticmethod def get_pair_longest_lock( - pair: str, now: Optional[datetime] = None, side: str = "*" - ) -> Optional[PairLock]: + pair: str, now: datetime | None = None, side: str = "*" + ) -> PairLock | None: """ Get the lock that expires the latest for the pair given. """ @@ -106,7 +106,7 @@ def get_pair_longest_lock( return locks[0] if locks else None @staticmethod - def unlock_pair(pair: str, now: Optional[datetime] = None, side: str = "*") -> None: + def unlock_pair(pair: str, now: datetime | None = None, side: str = "*") -> None: """ Release all locks for this pair. :param pair: Pair to unlock @@ -124,7 +124,7 @@ def unlock_pair(pair: str, now: Optional[datetime] = None, side: str = "*") -> N PairLock.session.commit() @staticmethod - def unlock_reason(reason: str, now: Optional[datetime] = None) -> None: + def unlock_reason(reason: str, now: datetime | None = None) -> None: """ Release all locks for this reason. :param reason: Which reason to unlock @@ -155,7 +155,7 @@ def unlock_reason(reason: str, now: Optional[datetime] = None) -> None: lock.active = False @staticmethod - def is_global_lock(now: Optional[datetime] = None, side: str = "*") -> bool: + def is_global_lock(now: datetime | None = None, side: str = "*") -> bool: """ :param now: Datetime object (generated via datetime.now(timezone.utc)). defaults to datetime.now(timezone.utc) @@ -166,7 +166,7 @@ def is_global_lock(now: Optional[datetime] = None, side: str = "*") -> bool: return len(PairLocks.get_pair_locks("*", now, side)) > 0 @staticmethod - def is_pair_locked(pair: str, now: Optional[datetime] = None, side: str = "*") -> bool: + def is_pair_locked(pair: str, now: datetime | None = None, side: str = "*") -> bool: """ :param pair: Pair to check for :param now: Datetime object (generated via datetime.now(timezone.utc)). diff --git a/freqtrade/persistence/trade_model.py b/freqtrade/persistence/trade_model.py index afae5f4c71e..2ad5ade481a 100644 --- a/freqtrade/persistence/trade_model.py +++ b/freqtrade/persistence/trade_model.py @@ -43,6 +43,7 @@ amount_to_contract_precision, price_to_precision, ) +from freqtrade.exchange.exchange_types import CcxtOrder from freqtrade.leverage import interest from freqtrade.misc import safe_value_fallback from freqtrade.persistence.base import ModelBase, SessionType @@ -96,26 +97,24 @@ class Order(ModelBase): ft_cancel_reason: Mapped[str] = mapped_column(String(CUSTOM_TAG_MAX_LENGTH), nullable=True) order_id: Mapped[str] = mapped_column(String(255), nullable=False, index=True) - status: Mapped[Optional[str]] = mapped_column(String(255), nullable=True) - symbol: Mapped[Optional[str]] = mapped_column(String(25), nullable=True) - order_type: Mapped[Optional[str]] = mapped_column(String(50), nullable=True) + status: Mapped[str | None] = mapped_column(String(255), nullable=True) + symbol: Mapped[str | None] = mapped_column(String(25), nullable=True) + order_type: Mapped[str | None] = mapped_column(String(50), nullable=True) side: Mapped[str] = mapped_column(String(25), nullable=True) - price: Mapped[Optional[float]] = mapped_column(Float(), nullable=True) - average: Mapped[Optional[float]] = mapped_column(Float(), nullable=True) - amount: Mapped[Optional[float]] = mapped_column(Float(), nullable=True) - filled: Mapped[Optional[float]] = mapped_column(Float(), nullable=True) - remaining: Mapped[Optional[float]] = mapped_column(Float(), nullable=True) - cost: Mapped[Optional[float]] = mapped_column(Float(), nullable=True) - stop_price: Mapped[Optional[float]] = mapped_column(Float(), nullable=True) + price: Mapped[float | None] = mapped_column(Float(), nullable=True) + average: Mapped[float | None] = mapped_column(Float(), nullable=True) + amount: Mapped[float | None] = mapped_column(Float(), nullable=True) + filled: Mapped[float | None] = mapped_column(Float(), nullable=True) + remaining: Mapped[float | None] = mapped_column(Float(), nullable=True) + cost: Mapped[float | None] = mapped_column(Float(), nullable=True) + stop_price: Mapped[float | None] = mapped_column(Float(), nullable=True) order_date: Mapped[datetime] = mapped_column(nullable=True, default=dt_now) - order_filled_date: Mapped[Optional[datetime]] = mapped_column(nullable=True) - order_update_date: Mapped[Optional[datetime]] = mapped_column(nullable=True) - funding_fee: Mapped[Optional[float]] = mapped_column(Float(), nullable=True) + order_filled_date: Mapped[datetime | None] = mapped_column(nullable=True) + order_update_date: Mapped[datetime | None] = mapped_column(nullable=True) + funding_fee: Mapped[float | None] = mapped_column(Float(), nullable=True) - ft_fee_base: Mapped[Optional[float]] = mapped_column(Float(), nullable=True) - ft_order_tag: Mapped[Optional[str]] = mapped_column( - String(CUSTOM_TAG_MAX_LENGTH), nullable=True - ) + ft_fee_base: Mapped[float | None] = mapped_column(Float(), nullable=True) + ft_order_tag: Mapped[str | None] = mapped_column(String(CUSTOM_TAG_MAX_LENGTH), nullable=True) @property def order_date_utc(self) -> datetime: @@ -123,7 +122,7 @@ def order_date_utc(self) -> datetime: return self.order_date.replace(tzinfo=timezone.utc) @property - def order_filled_utc(self) -> Optional[datetime]: + def order_filled_utc(self) -> datetime | None: """last order-date with UTC timezoneinfo""" return ( self.order_filled_date.replace(tzinfo=timezone.utc) if self.order_filled_date else None @@ -173,7 +172,20 @@ def trade(self) -> "LocalTrade": @property def stake_amount(self) -> float: """Amount in stake currency used for this order""" - return self.safe_amount * self.safe_price / self.trade.leverage + return float( + FtPrecise(self.safe_amount) + * FtPrecise(self.safe_price) + / FtPrecise(self.trade.leverage) + ) + + @property + def stake_amount_filled(self) -> float: + """Filled Amount in stake currency used for this order""" + return float( + FtPrecise(self.safe_filled) + * FtPrecise(self.safe_price) + / FtPrecise(self.trade.leverage) + ) def __repr__(self): return ( @@ -309,7 +321,7 @@ def close_bt_order(self, close_date: datetime, trade: "LocalTrade"): trade.adjust_stop_loss(trade.open_rate, trade.stop_loss_pct) @staticmethod - def update_orders(orders: list["Order"], order: dict[str, Any]): + def update_orders(orders: list["Order"], order: CcxtOrder): """ Get all non-closed orders - useful when trying to batch-update orders """ @@ -328,11 +340,11 @@ def update_orders(orders: list["Order"], order: dict[str, Any]): @classmethod def parse_from_ccxt_object( cls, - order: dict[str, Any], + order: CcxtOrder, pair: str, side: str, - amount: Optional[float] = None, - price: Optional[float] = None, + amount: float | None = None, + price: float | None = None, ) -> Self: """ Parse an order from a ccxt object and return a new order Object. @@ -379,6 +391,7 @@ class LocalTrade: # Copy of trades_open - but indexed by pair bt_trades_open_pp: dict[str, list["LocalTrade"]] = defaultdict(list) bt_open_open_trade_count: int = 0 + bt_open_open_trade_count_candle: int = 0 bt_total_profit: float = 0 realized_profit: float = 0 @@ -388,57 +401,57 @@ class LocalTrade: exchange: str = "" pair: str = "" - base_currency: Optional[str] = "" - stake_currency: Optional[str] = "" + base_currency: str | None = "" + stake_currency: str | None = "" is_open: bool = True fee_open: float = 0.0 - fee_open_cost: Optional[float] = None - fee_open_currency: Optional[str] = "" - fee_close: Optional[float] = 0.0 - fee_close_cost: Optional[float] = None - fee_close_currency: Optional[str] = "" + fee_open_cost: float | None = None + fee_open_currency: str | None = "" + fee_close: float | None = 0.0 + fee_close_cost: float | None = None + fee_close_currency: str | None = "" open_rate: float = 0.0 - open_rate_requested: Optional[float] = None + open_rate_requested: float | None = None # open_trade_value - calculated via _calc_open_trade_value open_trade_value: float = 0.0 - close_rate: Optional[float] = None - close_rate_requested: Optional[float] = None - close_profit: Optional[float] = None - close_profit_abs: Optional[float] = None + close_rate: float | None = None + close_rate_requested: float | None = None + close_profit: float | None = None + close_profit_abs: float | None = None stake_amount: float = 0.0 - max_stake_amount: Optional[float] = 0.0 + max_stake_amount: float | None = 0.0 amount: float = 0.0 - amount_requested: Optional[float] = None + amount_requested: float | None = None open_date: datetime - close_date: Optional[datetime] = None + close_date: datetime | None = None # absolute value of the stop loss stop_loss: float = 0.0 # percentage value of the stop loss - stop_loss_pct: Optional[float] = 0.0 + stop_loss_pct: float | None = 0.0 # absolute value of the initial stop loss - initial_stop_loss: Optional[float] = 0.0 + initial_stop_loss: float | None = 0.0 # percentage value of the initial stop loss - initial_stop_loss_pct: Optional[float] = None + initial_stop_loss_pct: float | None = None is_stop_loss_trailing: bool = False # absolute value of the highest reached price - max_rate: Optional[float] = None + max_rate: float | None = None # Lowest price reached - min_rate: Optional[float] = None - exit_reason: Optional[str] = "" - exit_order_status: Optional[str] = "" - strategy: Optional[str] = "" - enter_tag: Optional[str] = None - timeframe: Optional[int] = None + min_rate: float | None = None + exit_reason: str | None = "" + exit_order_status: str | None = "" + strategy: str | None = "" + enter_tag: str | None = None + timeframe: int | None = None trading_mode: TradingMode = TradingMode.SPOT - amount_precision: Optional[float] = None - price_precision: Optional[float] = None - precision_mode: Optional[int] = None - precision_mode_price: Optional[int] = None - contract_size: Optional[float] = None + amount_precision: float | None = None + price_precision: float | None = None + precision_mode: int | None = None + precision_mode_price: int | None = None + contract_size: float | None = None # Leverage trading properties - liquidation_price: Optional[float] = None + liquidation_price: float | None = None is_short: bool = False leverage: float = 1.0 @@ -446,10 +459,10 @@ class LocalTrade: interest_rate: float = 0.0 # Futures properties - funding_fees: Optional[float] = None + funding_fees: float | None = None # Used to keep running funding fees - between the last filled order and now # Shall not be used for calculations! - funding_fee_running: Optional[float] = None + funding_fee_running: float | None = None @property def stoploss_or_liquidation(self) -> float: @@ -462,7 +475,7 @@ def stoploss_or_liquidation(self) -> float: return self.stop_loss @property - def buy_tag(self) -> Optional[str]: + def buy_tag(self) -> str | None: """ Compatibility between buy_tag (old) and enter_tag (new) Consider buy_tag deprecated @@ -489,7 +502,7 @@ def borrowed(self) -> float: return self.amount @property - def _date_last_filled_utc(self) -> Optional[datetime]: + def _date_last_filled_utc(self) -> datetime | None: """Date of the last filled order""" orders = self.select_filled_orders() if orders: @@ -505,7 +518,7 @@ def date_last_filled_utc(self) -> datetime: return max([self.open_date_utc, dt_last_filled]) @property - def date_entry_fill_utc(self) -> Optional[datetime]: + def date_entry_fill_utc(self) -> datetime | None: """Date of the first filled order""" orders = self.select_filled_orders(self.entry_side) if orders and len( @@ -747,6 +760,7 @@ def reset_trades() -> None: LocalTrade.bt_trades_open = [] LocalTrade.bt_trades_open_pp = defaultdict(list) LocalTrade.bt_open_open_trade_count = 0 + LocalTrade.bt_open_open_trade_count_candle = 0 LocalTrade.bt_total_profit = 0 def adjust_min_max_rates(self, current_price: float, current_price_low: float) -> None: @@ -756,14 +770,16 @@ def adjust_min_max_rates(self, current_price: float, current_price_low: float) - self.max_rate = max(current_price, self.max_rate or self.open_rate) self.min_rate = min(current_price_low, self.min_rate or self.open_rate) - def set_liquidation_price(self, liquidation_price: Optional[float]): + def set_liquidation_price(self, liquidation_price: float | None): """ Method you should use to set self.liquidation price. Assures stop_loss is not passed the liquidation price """ if liquidation_price is None: return - self.liquidation_price = liquidation_price + self.liquidation_price = price_to_precision( + liquidation_price, self.price_precision, self.precision_mode_price + ) def set_funding_fees(self, funding_fee: float) -> None: """ @@ -788,7 +804,7 @@ def __set_stop_loss(self, stop_loss: float, percent: float): def adjust_stop_loss( self, current_price: float, - stoploss: Optional[float], + stoploss: float | None, initial: bool = False, allow_refresh: bool = False, ) -> None: @@ -928,7 +944,7 @@ def close(self, rate: float, *, show_msg: bool = True) -> None: ) def update_fee( - self, fee_cost: float, fee_currency: Optional[str], fee_rate: Optional[float], side: str + self, fee_cost: float, fee_currency: str | None, fee_rate: float | None, side: str ) -> None: """ Update Fee parameters. Only acts once per side @@ -957,7 +973,7 @@ def fee_updated(self, side: str) -> bool: else: return False - def update_order(self, order: dict) -> None: + def update_order(self, order: CcxtOrder) -> None: Order.update_orders(self.orders, order) @property @@ -1036,7 +1052,7 @@ def calculate_interest(self) -> FtPrecise: return interest(exchange_name=self.exchange, borrowed=borrowed, rate=rate, hours=hours) - def _calc_base_close(self, amount: FtPrecise, rate: float, fee: Optional[float]) -> FtPrecise: + def _calc_base_close(self, amount: FtPrecise, rate: float, fee: float | None) -> FtPrecise: close_trade = amount * FtPrecise(rate) fees = close_trade * FtPrecise(fee or 0.0) @@ -1045,7 +1061,7 @@ def _calc_base_close(self, amount: FtPrecise, rate: float, fee: Optional[float]) else: return close_trade - fees - def calc_close_trade_value(self, rate: float, amount: Optional[float] = None) -> float: + def calc_close_trade_value(self, rate: float, amount: float | None = None) -> float: """ Calculate the Trade's close value including fees :param rate: rate to compare with. @@ -1084,7 +1100,7 @@ def calc_close_trade_value(self, rate: float, amount: Optional[float] = None) -> ) def calc_profit( - self, rate: float, amount: Optional[float] = None, open_rate: Optional[float] = None + self, rate: float, amount: float | None = None, open_rate: float | None = None ) -> float: """ Calculate the absolute profit in stake currency between Close and Open trade @@ -1098,7 +1114,7 @@ def calc_profit( return prof.profit_abs def calculate_profit( - self, rate: float, amount: Optional[float] = None, open_rate: Optional[float] = None + self, rate: float, amount: float | None = None, open_rate: float | None = None ) -> ProfitStruct: """ Calculate profit metrics (absolute, ratio, total, total ratio). @@ -1146,7 +1162,7 @@ def calculate_profit( ) def calc_profit_ratio( - self, rate: float, amount: Optional[float] = None, open_rate: Optional[float] = None + self, rate: float, amount: float | None = None, open_rate: float | None = None ) -> float: """ Calculates the profit as ratio (including fee). @@ -1246,7 +1262,7 @@ def recalc_trade_from_orders(self, *, is_closing: bool = False): self.close_profit = (close_profit_abs / total_stake) * self.leverage self.close_profit_abs = close_profit_abs - def select_order_by_order_id(self, order_id: str) -> Optional[Order]: + def select_order_by_order_id(self, order_id: str) -> Order | None: """ Finds order object by Order id. :param order_id: Exchange order id @@ -1258,10 +1274,10 @@ def select_order_by_order_id(self, order_id: str) -> Optional[Order]: def select_order( self, - order_side: Optional[str] = None, - is_open: Optional[bool] = None, + order_side: str | None = None, + is_open: bool | None = None, only_filled: bool = False, - ) -> Optional[Order]: + ) -> Order | None: """ Finds latest order for this orderside and status :param order_side: ft_order_side of the order (either 'buy', 'sell' or 'stoploss') @@ -1281,7 +1297,7 @@ def select_order( else: return None - def select_filled_orders(self, order_side: Optional[str] = None) -> list["Order"]: + def select_filled_orders(self, order_side: str | None = None) -> list["Order"]: """ Finds filled orders for this order side. Will not return open orders which already partially filled. @@ -1332,7 +1348,7 @@ def get_custom_data(self, key: str, default: Any = None) -> Any: return data[0].value return default - def get_custom_data_entry(self, key: str) -> Optional[_CustomData]: + def get_custom_data_entry(self, key: str) -> _CustomData | None: """ Get custom data for this trade :param key: key of the custom data @@ -1385,7 +1401,7 @@ def nr_of_successful_sells(self) -> int: return len(self.select_filled_orders("sell")) @property - def sell_reason(self) -> Optional[str]: + def sell_reason(self) -> str | None: """DEPRECATED! Please use exit_reason instead.""" return self.exit_reason @@ -1396,10 +1412,10 @@ def safe_close_rate(self) -> float: @staticmethod def get_trades_proxy( *, - pair: Optional[str] = None, - is_open: Optional[bool] = None, - open_date: Optional[datetime] = None, - close_date: Optional[datetime] = None, + pair: str | None = None, + is_open: bool | None = None, + open_date: datetime | None = None, + close_date: datetime | None = None, ) -> list["LocalTrade"]: """ Helper function to query Trades. @@ -1442,6 +1458,11 @@ def close_bt_trade(trade): LocalTrade.bt_trades_open.remove(trade) LocalTrade.bt_trades_open_pp[trade.pair].remove(trade) LocalTrade.bt_open_open_trade_count -= 1 + if (trade.close_date_utc - trade.open_date_utc) > timedelta(minutes=trade.timeframe): + # Only subtract trades that are open for more than 1 candle + # To avoid exceeding max_open_trades. + # Must be reset at the start of every candle during backesting. + LocalTrade.bt_open_open_trade_count_candle -= 1 LocalTrade.bt_trades.append(trade) LocalTrade.bt_total_profit += trade.close_profit_abs @@ -1451,6 +1472,7 @@ def add_bt_trade(trade): LocalTrade.bt_trades_open.append(trade) LocalTrade.bt_trades_open_pp[trade.pair].append(trade) LocalTrade.bt_open_open_trade_count += 1 + LocalTrade.bt_open_open_trade_count_candle += 1 else: LocalTrade.bt_trades.append(trade) @@ -1459,6 +1481,9 @@ def remove_bt_trade(trade): LocalTrade.bt_trades_open.remove(trade) LocalTrade.bt_trades_open_pp[trade.pair].remove(trade) LocalTrade.bt_open_open_trade_count -= 1 + # TODO: The below may have odd behavior in case of canceled entries + # It might need to be removed so the trade "counts" as open for this candle. + LocalTrade.bt_open_open_trade_count_candle -= 1 @staticmethod def get_open_trades() -> list[Any]: @@ -1619,92 +1644,92 @@ class Trade(ModelBase, LocalTrade): exchange: Mapped[str] = mapped_column(String(25), nullable=False) # type: ignore pair: Mapped[str] = mapped_column(String(25), nullable=False, index=True) # type: ignore - base_currency: Mapped[Optional[str]] = mapped_column(String(25), nullable=True) # type: ignore - stake_currency: Mapped[Optional[str]] = mapped_column(String(25), nullable=True) # type: ignore + base_currency: Mapped[str | None] = mapped_column(String(25), nullable=True) # type: ignore + stake_currency: Mapped[str | None] = mapped_column(String(25), nullable=True) # type: ignore is_open: Mapped[bool] = mapped_column(nullable=False, default=True, index=True) # type: ignore fee_open: Mapped[float] = mapped_column(Float(), nullable=False, default=0.0) # type: ignore - fee_open_cost: Mapped[Optional[float]] = mapped_column(Float(), nullable=True) # type: ignore - fee_open_currency: Mapped[Optional[str]] = mapped_column( # type: ignore + fee_open_cost: Mapped[float | None] = mapped_column(Float(), nullable=True) # type: ignore + fee_open_currency: Mapped[str | None] = mapped_column( # type: ignore String(25), nullable=True ) - fee_close: Mapped[Optional[float]] = mapped_column( # type: ignore + fee_close: Mapped[float | None] = mapped_column( # type: ignore Float(), nullable=False, default=0.0 ) - fee_close_cost: Mapped[Optional[float]] = mapped_column(Float(), nullable=True) # type: ignore - fee_close_currency: Mapped[Optional[str]] = mapped_column( # type: ignore + fee_close_cost: Mapped[float | None] = mapped_column(Float(), nullable=True) # type: ignore + fee_close_currency: Mapped[str | None] = mapped_column( # type: ignore String(25), nullable=True ) open_rate: Mapped[float] = mapped_column(Float()) # type: ignore - open_rate_requested: Mapped[Optional[float]] = mapped_column( # type: ignore + open_rate_requested: Mapped[float | None] = mapped_column( # type: ignore Float(), nullable=True ) # open_trade_value - calculated via _calc_open_trade_value open_trade_value: Mapped[float] = mapped_column(Float(), nullable=True) # type: ignore - close_rate: Mapped[Optional[float]] = mapped_column(Float()) # type: ignore - close_rate_requested: Mapped[Optional[float]] = mapped_column(Float()) # type: ignore + close_rate: Mapped[float | None] = mapped_column(Float()) # type: ignore + close_rate_requested: Mapped[float | None] = mapped_column(Float()) # type: ignore realized_profit: Mapped[float] = mapped_column( # type: ignore Float(), default=0.0, nullable=True ) - close_profit: Mapped[Optional[float]] = mapped_column(Float()) # type: ignore - close_profit_abs: Mapped[Optional[float]] = mapped_column(Float()) # type: ignore + close_profit: Mapped[float | None] = mapped_column(Float()) # type: ignore + close_profit_abs: Mapped[float | None] = mapped_column(Float()) # type: ignore stake_amount: Mapped[float] = mapped_column(Float(), nullable=False) # type: ignore - max_stake_amount: Mapped[Optional[float]] = mapped_column(Float()) # type: ignore + max_stake_amount: Mapped[float | None] = mapped_column(Float()) # type: ignore amount: Mapped[float] = mapped_column(Float()) # type: ignore - amount_requested: Mapped[Optional[float]] = mapped_column(Float()) # type: ignore + amount_requested: Mapped[float | None] = mapped_column(Float()) # type: ignore open_date: Mapped[datetime] = mapped_column( # type: ignore nullable=False, default=datetime.now ) - close_date: Mapped[Optional[datetime]] = mapped_column() # type: ignore + close_date: Mapped[datetime | None] = mapped_column() # type: ignore # absolute value of the stop loss stop_loss: Mapped[float] = mapped_column(Float(), nullable=True, default=0.0) # type: ignore # percentage value of the stop loss - stop_loss_pct: Mapped[Optional[float]] = mapped_column(Float(), nullable=True) # type: ignore + stop_loss_pct: Mapped[float | None] = mapped_column(Float(), nullable=True) # type: ignore # absolute value of the initial stop loss - initial_stop_loss: Mapped[Optional[float]] = mapped_column( # type: ignore + initial_stop_loss: Mapped[float | None] = mapped_column( # type: ignore Float(), nullable=True, default=0.0 ) # percentage value of the initial stop loss - initial_stop_loss_pct: Mapped[Optional[float]] = mapped_column( # type: ignore + initial_stop_loss_pct: Mapped[float | None] = mapped_column( # type: ignore Float(), nullable=True ) is_stop_loss_trailing: Mapped[bool] = mapped_column( # type: ignore nullable=False, default=False ) # absolute value of the highest reached price - max_rate: Mapped[Optional[float]] = mapped_column( # type: ignore + max_rate: Mapped[float | None] = mapped_column( # type: ignore Float(), nullable=True, default=0.0 ) # Lowest price reached - min_rate: Mapped[Optional[float]] = mapped_column(Float(), nullable=True) # type: ignore - exit_reason: Mapped[Optional[str]] = mapped_column( # type: ignore + min_rate: Mapped[float | None] = mapped_column(Float(), nullable=True) # type: ignore + exit_reason: Mapped[str | None] = mapped_column( # type: ignore String(CUSTOM_TAG_MAX_LENGTH), nullable=True ) - exit_order_status: Mapped[Optional[str]] = mapped_column( # type: ignore + exit_order_status: Mapped[str | None] = mapped_column( # type: ignore String(100), nullable=True ) - strategy: Mapped[Optional[str]] = mapped_column(String(100), nullable=True) # type: ignore - enter_tag: Mapped[Optional[str]] = mapped_column( # type: ignore + strategy: Mapped[str | None] = mapped_column(String(100), nullable=True) # type: ignore + enter_tag: Mapped[str | None] = mapped_column( # type: ignore String(CUSTOM_TAG_MAX_LENGTH), nullable=True ) - timeframe: Mapped[Optional[int]] = mapped_column(Integer, nullable=True) # type: ignore + timeframe: Mapped[int | None] = mapped_column(Integer, nullable=True) # type: ignore trading_mode: Mapped[TradingMode] = mapped_column( # type: ignore Enum(TradingMode), nullable=True ) - amount_precision: Mapped[Optional[float]] = mapped_column( # type: ignore + amount_precision: Mapped[float | None] = mapped_column( # type: ignore Float(), nullable=True ) - price_precision: Mapped[Optional[float]] = mapped_column(Float(), nullable=True) # type: ignore - precision_mode: Mapped[Optional[int]] = mapped_column(Integer, nullable=True) # type: ignore - precision_mode_price: Mapped[Optional[int]] = mapped_column( # type: ignore + price_precision: Mapped[float | None] = mapped_column(Float(), nullable=True) # type: ignore + precision_mode: Mapped[int | None] = mapped_column(Integer, nullable=True) # type: ignore + precision_mode_price: Mapped[int | None] = mapped_column( # type: ignore Integer, nullable=True ) - contract_size: Mapped[Optional[float]] = mapped_column(Float(), nullable=True) # type: ignore + contract_size: Mapped[float | None] = mapped_column(Float(), nullable=True) # type: ignore # Leverage trading properties leverage: Mapped[float] = mapped_column(Float(), nullable=True, default=1.0) # type: ignore is_short: Mapped[bool] = mapped_column(nullable=False, default=False) # type: ignore - liquidation_price: Mapped[Optional[float]] = mapped_column( # type: ignore + liquidation_price: Mapped[float | None] = mapped_column( # type: ignore Float(), nullable=True ) @@ -1714,10 +1739,10 @@ class Trade(ModelBase, LocalTrade): ) # Futures properties - funding_fees: Mapped[Optional[float]] = mapped_column( # type: ignore + funding_fees: Mapped[float | None] = mapped_column( # type: ignore Float(), nullable=True, default=None ) - funding_fee_running: Mapped[Optional[float]] = mapped_column( # type: ignore + funding_fee_running: Mapped[float | None] = mapped_column( # type: ignore Float(), nullable=True, default=None ) @@ -1756,10 +1781,10 @@ def rollback(): @staticmethod def get_trades_proxy( *, - pair: Optional[str] = None, - is_open: Optional[bool] = None, - open_date: Optional[datetime] = None, - close_date: Optional[datetime] = None, + pair: str | None = None, + is_open: bool | None = None, + open_date: datetime | None = None, + close_date: datetime | None = None, ) -> list["LocalTrade"]: """ Helper function to query Trades.j @@ -1922,7 +1947,7 @@ def get_overall_performance(minutes=None) -> list[dict[str, Any]]: ] @staticmethod - def get_enter_tag_performance(pair: Optional[str]) -> list[dict[str, Any]]: + def get_enter_tag_performance(pair: str | None) -> list[dict[str, Any]]: """ Returns List of dicts containing all Trades, based on buy tag performance Can either be average for all pairs or a specific pair provided @@ -1957,7 +1982,7 @@ def get_enter_tag_performance(pair: Optional[str]) -> list[dict[str, Any]]: ] @staticmethod - def get_exit_reason_performance(pair: Optional[str]) -> list[dict[str, Any]]: + def get_exit_reason_performance(pair: str | None) -> list[dict[str, Any]]: """ Returns List of dicts containing all Trades, based on exit reason performance Can either be average for all pairs or a specific pair provided @@ -1991,7 +2016,7 @@ def get_exit_reason_performance(pair: Optional[str]) -> list[dict[str, Any]]: ] @staticmethod - def get_mix_tag_performance(pair: Optional[str]) -> list[dict[str, Any]]: + def get_mix_tag_performance(pair: str | None) -> list[dict[str, Any]]: """ Returns List of dicts containing all Trades, based on entry_tag + exit_reason performance Can either be average for all pairs or a specific pair provided @@ -2048,7 +2073,7 @@ def get_mix_tag_performance(pair: Optional[str]) -> list[dict[str, Any]]: return resp @staticmethod - def get_best_pair(start_date: Optional[datetime] = None): + def get_best_pair(start_date: datetime | None = None): """ Get best pair with closed trade. NOTE: Not supported in Backtesting. @@ -2068,7 +2093,7 @@ def get_best_pair(start_date: Optional[datetime] = None): return best_pair @staticmethod - def get_trading_volume(start_date: Optional[datetime] = None) -> float: + def get_trading_volume(start_date: datetime | None = None) -> float: """ Get Trade volume based on Orders NOTE: Not supported in Backtesting. diff --git a/freqtrade/plot/plotting.py b/freqtrade/plot/plotting.py index 8ce851476f0..8ec7c7bae6f 100644 --- a/freqtrade/plot/plotting.py +++ b/freqtrade/plot/plotting.py @@ -1,7 +1,6 @@ import logging from datetime import datetime, timezone from pathlib import Path -from typing import Optional import pandas as pd @@ -29,6 +28,7 @@ from freqtrade.resolvers import ExchangeResolver, StrategyResolver from freqtrade.strategy import IStrategy from freqtrade.strategy.strategy_wrapper import strategy_safe_wrapper +from freqtrade.util import get_dry_run_wallet logger = logging.getLogger(__name__) @@ -406,7 +406,7 @@ def add_areas(fig, row: int, data: pd.DataFrame, indicators) -> make_subplots: return fig -def create_scatter(data, column_name, color, direction) -> Optional[go.Scatter]: +def create_scatter(data, column_name, color, direction) -> go.Scatter | None: if column_name in data.columns: df_short = data[data[column_name] == 1] if len(df_short) > 0: @@ -432,11 +432,11 @@ def create_scatter(data, column_name, color, direction) -> Optional[go.Scatter]: def generate_candlestick_graph( pair: str, data: pd.DataFrame, - trades: Optional[pd.DataFrame] = None, + trades: pd.DataFrame | None = None, *, - indicators1: Optional[list[str]] = None, - indicators2: Optional[list[str]] = None, - plot_config: Optional[dict[str, dict]] = None, + indicators1: list[str] | None = None, + indicators2: list[str] | None = None, + plot_config: dict[str, dict] | None = None, ) -> go.Figure: """ Generate the graph from the data generated by Backtesting or from DB @@ -707,7 +707,7 @@ def plot_profit(config: Config) -> None: trades, config["timeframe"], config.get("stake_currency", ""), - config.get("available_capital", config["dry_run_wallet"]), + config.get("available_capital", get_dry_run_wallet(config)), ) store_plot_file( fig, diff --git a/freqtrade/plugins/pairlist/AgeFilter.py b/freqtrade/plugins/pairlist/AgeFilter.py index cc89e34219a..03ba127705b 100644 --- a/freqtrade/plugins/pairlist/AgeFilter.py +++ b/freqtrade/plugins/pairlist/AgeFilter.py @@ -5,7 +5,6 @@ import logging from copy import deepcopy from datetime import timedelta -from typing import Optional from pandas import DataFrame @@ -126,7 +125,7 @@ def filter_pairlist(self, pairlist: list[str], tickers: Tickers) -> list[str]: self.log_once(f"Validated {len(pairlist)} pairs.", logger.info) return pairlist - def _validate_pair_loc(self, pair: str, daily_candles: Optional[DataFrame]) -> bool: + def _validate_pair_loc(self, pair: str, daily_candles: DataFrame | None) -> bool: """ Validate age for the ticker :param pair: Pair that's currently validated diff --git a/freqtrade/plugins/pairlist/IPairList.py b/freqtrade/plugins/pairlist/IPairList.py index a1ce4dc3685..89a9e68cdf9 100644 --- a/freqtrade/plugins/pairlist/IPairList.py +++ b/freqtrade/plugins/pairlist/IPairList.py @@ -6,7 +6,7 @@ from abc import ABC, abstractmethod from copy import deepcopy from enum import Enum -from typing import Any, Literal, Optional, TypedDict, Union +from typing import Any, Literal, TypedDict from freqtrade.constants import Config from freqtrade.exceptions import OperationalException @@ -25,37 +25,37 @@ class __PairlistParameterBase(TypedDict): class __NumberPairlistParameter(__PairlistParameterBase): type: Literal["number"] - default: Union[int, float, None] + default: int | float | None class __StringPairlistParameter(__PairlistParameterBase): type: Literal["string"] - default: Union[str, None] + default: str | None class __OptionPairlistParameter(__PairlistParameterBase): type: Literal["option"] - default: Union[str, None] + default: str | None options: list[str] class __ListPairListParamenter(__PairlistParameterBase): type: Literal["list"] - default: Union[list[str], None] + default: list[str] | None class __BoolPairlistParameter(__PairlistParameterBase): type: Literal["boolean"] - default: Union[bool, None] + default: bool | None -PairlistParameter = Union[ - __NumberPairlistParameter, - __StringPairlistParameter, - __OptionPairlistParameter, - __BoolPairlistParameter, - __ListPairListParamenter, -] +PairlistParameter = ( + __NumberPairlistParameter + | __StringPairlistParameter + | __OptionPairlistParameter + | __BoolPairlistParameter + | __ListPairListParamenter +) class SupportsBacktesting(str, Enum): @@ -153,7 +153,7 @@ def short_desc(self) -> str: -> Please overwrite in subclasses """ - def _validate_pair(self, pair: str, ticker: Optional[Ticker]) -> bool: + def _validate_pair(self, pair: str, ticker: Ticker | None) -> bool: """ Check one pair against Pairlist Handler's specific conditions. diff --git a/freqtrade/plugins/pairlist/MarketCapPairList.py b/freqtrade/plugins/pairlist/MarketCapPairList.py index 2394e910ec7..b95cec50f4e 100644 --- a/freqtrade/plugins/pairlist/MarketCapPairList.py +++ b/freqtrade/plugins/pairlist/MarketCapPairList.py @@ -5,6 +5,7 @@ """ import logging +import math from cachetools import TTLCache @@ -57,7 +58,11 @@ def __init__(self, *args, **kwargs) -> None: ) if self._max_rank > 250: - raise OperationalException("This filter only support marketcap rank up to 250.") + self.logger.warning( + f"The max rank you have set ({self._max_rank}) is quite high. " + "This may lead to coingecko API rate limit issues. " + "Please ensure this value is necessary for your use case.", + ) @property def needstickers(self) -> bool: @@ -165,7 +170,11 @@ def filter_pairlist(self, pairlist: list[str], tickers: dict) -> list[str]: data = [] if not self._categories: - data = self._coingecko.get_coins_markets(**default_kwargs) + pages_required = math.ceil(self._max_rank / 250) + for page in range(1, pages_required + 1): + default_kwargs["page"] = str(page) + page_data = self._coingecko.get_coins_markets(**default_kwargs) + data.extend(page_data) else: for category in self._categories: category_data = self._coingecko.get_coins_markets( diff --git a/freqtrade/plugins/pairlist/PercentChangePairList.py b/freqtrade/plugins/pairlist/PercentChangePairList.py index b428da75a95..4f91a47d11d 100644 --- a/freqtrade/plugins/pairlist/PercentChangePairList.py +++ b/freqtrade/plugins/pairlist/PercentChangePairList.py @@ -8,7 +8,7 @@ import logging from datetime import timedelta -from typing import Any, Optional +from typing import TypedDict from cachetools import TTLCache from pandas import DataFrame @@ -24,6 +24,11 @@ logger = logging.getLogger(__name__) +class SymbolWithPercentage(TypedDict): + symbol: str + percentage: float | None + + class PercentChangePairList(IPairList): is_pairlist_generator = True supports_backtesting = SupportsBacktesting.NO @@ -46,7 +51,7 @@ def __init__(self, *args, **kwargs) -> None: self._lookback_days = self._pairlistconfig.get("lookback_days", 0) self._lookback_timeframe = self._pairlistconfig.get("lookback_timeframe", "1d") self._lookback_period = self._pairlistconfig.get("lookback_period", 0) - self._sort_direction: Optional[str] = self._pairlistconfig.get("sort_direction", "desc") + self._sort_direction: str | None = self._pairlistconfig.get("sort_direction", "desc") self._def_candletype = self._config["candle_type_def"] if (self._lookback_days > 0) & (self._lookback_period > 0): @@ -191,7 +196,6 @@ def gen_pairlist(self, tickers: Tickers) -> list[str]: for k, v in tickers.items() if ( self._exchange.get_pair_quote_currency(k) == self._stake_currency - and (self._use_range or v.get("percentage") is not None) and v["symbol"] in _pairlist ) ] @@ -212,13 +216,15 @@ def filter_pairlist(self, pairlist: list[str], tickers: dict) -> list[str]: :param tickers: Tickers (from exchange.get_tickers). May be cached. :return: new whitelist """ - filtered_tickers: list[dict[str, Any]] = [{"symbol": k} for k in pairlist] + filtered_tickers: list[SymbolWithPercentage] = [ + {"symbol": k, "percentage": None} for k in pairlist + ] if self._use_range: # calculating using lookback_period - self.fetch_percent_change_from_lookback_period(filtered_tickers) + filtered_tickers = self.fetch_percent_change_from_lookback_period(filtered_tickers) else: # Fetching 24h change by default from supported exchange tickers - self.fetch_percent_change_from_tickers(filtered_tickers, tickers) + filtered_tickers = self.fetch_percent_change_from_tickers(filtered_tickers, tickers) if self._min_value is not None: filtered_tickers = [v for v in filtered_tickers if v["percentage"] > self._min_value] @@ -228,7 +234,7 @@ def filter_pairlist(self, pairlist: list[str], tickers: dict) -> list[str]: sorted_tickers = sorted( filtered_tickers, reverse=self._sort_direction == "desc", - key=lambda t: t["percentage"], + key=lambda t: t["percentage"], # type: ignore ) # Validate whitelist to only have active market pairs @@ -240,7 +246,7 @@ def filter_pairlist(self, pairlist: list[str], tickers: dict) -> list[str]: return pairs def fetch_candles_for_lookback_period( - self, filtered_tickers: list[dict[str, str]] + self, filtered_tickers: list[SymbolWithPercentage] ) -> dict[PairWithTimeframe, DataFrame]: since_ms = ( int( @@ -262,7 +268,6 @@ def fetch_candles_for_lookback_period( ) * 1000 ) - # todo: utc date output for starting date self.log_once( f"Using change range of {self._lookback_period} candles, timeframe: " f"{self._lookback_timeframe}, starting from {format_ms_time(since_ms)} " @@ -277,7 +282,9 @@ def fetch_candles_for_lookback_period( candles = self._exchange.refresh_ohlcv_with_cache(needed_pairs, since_ms) return candles - def fetch_percent_change_from_lookback_period(self, filtered_tickers: list[dict[str, Any]]): + def fetch_percent_change_from_lookback_period( + self, filtered_tickers: list[SymbolWithPercentage] + ) -> list[SymbolWithPercentage]: # get lookback period in ms, for exchange ohlcv fetch candles = self.fetch_candles_for_lookback_period(filtered_tickers) @@ -293,25 +300,34 @@ def fetch_percent_change_from_lookback_period(self, filtered_tickers: list[dict[ current_close = pair_candles["close"].iloc[-1] previous_close = pair_candles["close"].shift(self._lookback_period).iloc[-1] pct_change = ( - ((current_close - previous_close) / previous_close) if previous_close > 0 else 0 + ((current_close - previous_close) / previous_close) * 100 + if previous_close > 0 + else 0 ) # replace change with a range change sum calculated above filtered_tickers[i]["percentage"] = pct_change else: filtered_tickers[i]["percentage"] = 0 + return filtered_tickers - def fetch_percent_change_from_tickers(self, filtered_tickers: list[dict[str, Any]], tickers): - for i, p in enumerate(filtered_tickers): + def fetch_percent_change_from_tickers( + self, filtered_tickers: list[SymbolWithPercentage], tickers + ) -> list[SymbolWithPercentage]: + valid_tickers: list[SymbolWithPercentage] = [] + for p in filtered_tickers: # Filter out assets - if not self._validate_pair( - p["symbol"], tickers[p["symbol"]] if p["symbol"] in tickers else None + if ( + self._validate_pair( + p["symbol"], tickers[p["symbol"]] if p["symbol"] in tickers else None + ) + and p["symbol"] != "UNI/USDT" ): - filtered_tickers.remove(p) - else: - filtered_tickers[i]["percentage"] = tickers[p["symbol"]]["percentage"] + p["percentage"] = tickers[p["symbol"]]["percentage"] + valid_tickers.append(p) + return valid_tickers - def _validate_pair(self, pair: str, ticker: Optional[Ticker]) -> bool: + def _validate_pair(self, pair: str, ticker: Ticker | None) -> bool: """ Check if one price-step (pip) is > than a certain barrier. :param pair: Pair that's currently validated diff --git a/freqtrade/plugins/pairlist/PrecisionFilter.py b/freqtrade/plugins/pairlist/PrecisionFilter.py index 43072a26ae8..d0af200cd30 100644 --- a/freqtrade/plugins/pairlist/PrecisionFilter.py +++ b/freqtrade/plugins/pairlist/PrecisionFilter.py @@ -3,7 +3,6 @@ """ import logging -from typing import Optional from freqtrade.exceptions import OperationalException from freqtrade.exchange import ROUND_UP @@ -50,7 +49,7 @@ def short_desc(self) -> str: def description() -> str: return "Filters low-value coins which would not allow setting stoplosses." - def _validate_pair(self, pair: str, ticker: Optional[Ticker]) -> bool: + def _validate_pair(self, pair: str, ticker: Ticker | None) -> bool: """ Check if pair has enough room to add a stoploss to avoid "unsellable" buys of very low value pairs. diff --git a/freqtrade/plugins/pairlist/PriceFilter.py b/freqtrade/plugins/pairlist/PriceFilter.py index f963b124711..ea5ef27a2a8 100644 --- a/freqtrade/plugins/pairlist/PriceFilter.py +++ b/freqtrade/plugins/pairlist/PriceFilter.py @@ -3,7 +3,6 @@ """ import logging -from typing import Optional from freqtrade.exceptions import OperationalException from freqtrade.exchange.exchange_types import Ticker @@ -101,7 +100,7 @@ def available_parameters() -> dict[str, PairlistParameter]: }, } - def _validate_pair(self, pair: str, ticker: Optional[Ticker]) -> bool: + def _validate_pair(self, pair: str, ticker: Ticker | None) -> bool: """ Check if one price-step (pip) is > than a certain barrier. :param pair: Pair that's currently validated diff --git a/freqtrade/plugins/pairlist/ProducerPairList.py b/freqtrade/plugins/pairlist/ProducerPairList.py index e286b35609c..89e4a08698e 100644 --- a/freqtrade/plugins/pairlist/ProducerPairList.py +++ b/freqtrade/plugins/pairlist/ProducerPairList.py @@ -5,7 +5,6 @@ """ import logging -from typing import Optional from freqtrade.exceptions import OperationalException from freqtrade.exchange.exchange_types import Tickers @@ -83,7 +82,7 @@ def available_parameters() -> dict[str, PairlistParameter]: }, } - def _filter_pairlist(self, pairlist: Optional[list[str]]): + def _filter_pairlist(self, pairlist: list[str] | None): upstream_pairlist = self._pairlistmanager._dataprovider.get_producer_pairs( self._producer_name ) diff --git a/freqtrade/plugins/pairlist/SpreadFilter.py b/freqtrade/plugins/pairlist/SpreadFilter.py index 0ecd1909d76..51e8e802be5 100644 --- a/freqtrade/plugins/pairlist/SpreadFilter.py +++ b/freqtrade/plugins/pairlist/SpreadFilter.py @@ -3,7 +3,6 @@ """ import logging -from typing import Optional from freqtrade.exceptions import OperationalException from freqtrade.exchange.exchange_types import Ticker @@ -61,7 +60,7 @@ def available_parameters() -> dict[str, PairlistParameter]: }, } - def _validate_pair(self, pair: str, ticker: Optional[Ticker]) -> bool: + def _validate_pair(self, pair: str, ticker: Ticker | None) -> bool: """ Validate spread for the ticker :param pair: Pair that's currently validated diff --git a/freqtrade/plugins/pairlist/VolatilityFilter.py b/freqtrade/plugins/pairlist/VolatilityFilter.py index 76e93a1f3bc..87ca488c189 100644 --- a/freqtrade/plugins/pairlist/VolatilityFilter.py +++ b/freqtrade/plugins/pairlist/VolatilityFilter.py @@ -5,7 +5,6 @@ import logging import sys from datetime import timedelta -from typing import Optional import numpy as np from cachetools import TTLCache @@ -37,7 +36,7 @@ def __init__(self, *args, **kwargs) -> None: self._max_volatility = self._pairlistconfig.get("max_volatility", sys.maxsize) self._refresh_period = self._pairlistconfig.get("refresh_period", 1440) self._def_candletype = self._config["candle_type_def"] - self._sort_direction: Optional[str] = self._pairlistconfig.get("sort_direction", None) + self._sort_direction: str | None = self._pairlistconfig.get("sort_direction", None) self._pair_cache: TTLCache = TTLCache(maxsize=1000, ttl=self._refresh_period) @@ -147,7 +146,7 @@ def filter_pairlist(self, pairlist: list[str], tickers: Tickers) -> list[str]: ) return resulting_pairlist - def _calculate_volatility(self, pair: str, daily_candles: DataFrame) -> Optional[float]: + def _calculate_volatility(self, pair: str, daily_candles: DataFrame) -> float | None: # Check symbol in cache if (volatility_avg := self._pair_cache.get(pair, None)) is not None: return volatility_avg diff --git a/freqtrade/plugins/pairlist/rangestabilityfilter.py b/freqtrade/plugins/pairlist/rangestabilityfilter.py index cff958865ba..ca5543bb069 100644 --- a/freqtrade/plugins/pairlist/rangestabilityfilter.py +++ b/freqtrade/plugins/pairlist/rangestabilityfilter.py @@ -4,7 +4,6 @@ import logging from datetime import timedelta -from typing import Optional from cachetools import TTLCache from pandas import DataFrame @@ -31,7 +30,7 @@ def __init__(self, *args, **kwargs) -> None: self._max_rate_of_change = self._pairlistconfig.get("max_rate_of_change") self._refresh_period = self._pairlistconfig.get("refresh_period", 86400) self._def_candletype = self._config["candle_type_def"] - self._sort_direction: Optional[str] = self._pairlistconfig.get("sort_direction", None) + self._sort_direction: str | None = self._pairlistconfig.get("sort_direction", None) self._pair_cache: TTLCache = TTLCache(maxsize=1000, ttl=self._refresh_period) @@ -143,7 +142,7 @@ def filter_pairlist(self, pairlist: list[str], tickers: Tickers) -> list[str]: ) return resulting_pairlist - def _calculate_rate_of_change(self, pair: str, daily_candles: DataFrame) -> Optional[float]: + def _calculate_rate_of_change(self, pair: str, daily_candles: DataFrame) -> float | None: # Check symbol in cache if (pct_change := self._pair_cache.get(pair, None)) is not None: return pct_change diff --git a/freqtrade/plugins/pairlistmanager.py b/freqtrade/plugins/pairlistmanager.py index 2171629d395..73786cba655 100644 --- a/freqtrade/plugins/pairlistmanager.py +++ b/freqtrade/plugins/pairlistmanager.py @@ -4,7 +4,6 @@ import logging from functools import partial -from typing import Optional from cachetools import TTLCache, cached @@ -24,16 +23,14 @@ class PairListManager(LoggingMixin): - def __init__( - self, exchange, config: Config, dataprovider: Optional[DataProvider] = None - ) -> None: + def __init__(self, exchange, config: Config, dataprovider: DataProvider | None = None) -> None: self._exchange = exchange self._config = config self._whitelist = self._config["exchange"].get("pair_whitelist") self._blacklist = self._config["exchange"].get("pair_blacklist", []) self._pairlist_handlers: list[IPairList] = [] self._tickers_needed = False - self._dataprovider: Optional[DataProvider] = dataprovider + self._dataprovider: DataProvider | None = dataprovider for pairlist_handler_config in self._config.get("pairlists", []): pairlist_handler = PairListResolver.load_pairlist( pairlist_handler_config["method"], @@ -193,7 +190,7 @@ def verify_whitelist( return whitelist def create_pair_list( - self, pairs: list[str], timeframe: Optional[str] = None + self, pairs: list[str], timeframe: str | None = None ) -> ListPairsWithTimeframes: """ Create list of pair tuples with (pair, timeframe) diff --git a/freqtrade/plugins/protectionmanager.py b/freqtrade/plugins/protectionmanager.py index 648cd6bbb56..187b9ee63e0 100644 --- a/freqtrade/plugins/protectionmanager.py +++ b/freqtrade/plugins/protectionmanager.py @@ -4,7 +4,7 @@ import logging from datetime import datetime, timezone -from typing import Any, Optional +from typing import Any from freqtrade.constants import Config, LongShort from freqtrade.exceptions import ConfigurationError @@ -47,9 +47,7 @@ def short_desc(self) -> list[dict]: """ return [{p.name: p.short_desc()} for p in self._protection_handlers] - def global_stop( - self, now: Optional[datetime] = None, side: LongShort = "long" - ) -> Optional[PairLock]: + def global_stop(self, now: datetime | None = None, side: LongShort = "long") -> PairLock | None: if not now: now = datetime.now(timezone.utc) result = None @@ -64,8 +62,8 @@ def global_stop( return result def stop_per_pair( - self, pair, now: Optional[datetime] = None, side: LongShort = "long" - ) -> Optional[PairLock]: + self, pair, now: datetime | None = None, side: LongShort = "long" + ) -> PairLock | None: if not now: now = datetime.now(timezone.utc) result = None diff --git a/freqtrade/plugins/protections/cooldown_period.py b/freqtrade/plugins/protections/cooldown_period.py index d30bd87e54b..0f6aaa79aca 100644 --- a/freqtrade/plugins/protections/cooldown_period.py +++ b/freqtrade/plugins/protections/cooldown_period.py @@ -1,6 +1,5 @@ import logging from datetime import datetime, timedelta -from typing import Optional from freqtrade.constants import LongShort from freqtrade.persistence import Trade @@ -26,7 +25,7 @@ def short_desc(self) -> str: """ return f"{self.name} - Cooldown period {self.unlock_reason_time_element}." - def _cooldown_period(self, pair: str, date_now: datetime) -> Optional[ProtectionReturn]: + def _cooldown_period(self, pair: str, date_now: datetime) -> ProtectionReturn | None: """ Get last trade for this pair """ @@ -53,7 +52,7 @@ def _cooldown_period(self, pair: str, date_now: datetime) -> Optional[Protection return None - def global_stop(self, date_now: datetime, side: LongShort) -> Optional[ProtectionReturn]: + def global_stop(self, date_now: datetime, side: LongShort) -> ProtectionReturn | None: """ Stops trading (position entering) for all pairs This must evaluate to true for the whole period of the "cooldown period". @@ -65,7 +64,7 @@ def global_stop(self, date_now: datetime, side: LongShort) -> Optional[Protectio def stop_per_pair( self, pair: str, date_now: datetime, side: LongShort - ) -> Optional[ProtectionReturn]: + ) -> ProtectionReturn | None: """ Stops trading (position entering) for this pair This must evaluate to true for the whole period of the "cooldown period". diff --git a/freqtrade/plugins/protections/iprotection.py b/freqtrade/plugins/protections/iprotection.py index a2264675e34..38a726dcc35 100644 --- a/freqtrade/plugins/protections/iprotection.py +++ b/freqtrade/plugins/protections/iprotection.py @@ -2,7 +2,7 @@ from abc import ABC, abstractmethod from dataclasses import dataclass from datetime import datetime, timedelta, timezone -from typing import Any, Optional +from typing import Any from freqtrade.constants import Config, LongShort from freqtrade.exchange import timeframe_to_minutes @@ -18,7 +18,7 @@ class ProtectionReturn: lock: bool until: datetime - reason: Optional[str] + reason: str | None lock_side: str = "*" @@ -31,10 +31,10 @@ class IProtection(LoggingMixin, ABC): def __init__(self, config: Config, protection_config: dict[str, Any]) -> None: self._config = config self._protection_config = protection_config - self._stop_duration_candles: Optional[int] = None + self._stop_duration_candles: int | None = None self._stop_duration: int = 0 - self._lookback_period_candles: Optional[int] = None - self._unlock_at: Optional[str] = None + self._lookback_period_candles: int | None = None + self._unlock_at: str | None = None tf_in_min = timeframe_to_minutes(config["timeframe"]) if "stop_duration_candles" in protection_config: @@ -102,7 +102,7 @@ def short_desc(self) -> str: """ @abstractmethod - def global_stop(self, date_now: datetime, side: LongShort) -> Optional[ProtectionReturn]: + def global_stop(self, date_now: datetime, side: LongShort) -> ProtectionReturn | None: """ Stops trading (position entering) for all pairs This must evaluate to true for the whole period of the "cooldown period". @@ -111,7 +111,7 @@ def global_stop(self, date_now: datetime, side: LongShort) -> Optional[Protectio @abstractmethod def stop_per_pair( self, pair: str, date_now: datetime, side: LongShort - ) -> Optional[ProtectionReturn]: + ) -> ProtectionReturn | None: """ Stops trading (position entering) for this pair This must evaluate to true for the whole period of the "cooldown period". diff --git a/freqtrade/plugins/protections/low_profit_pairs.py b/freqtrade/plugins/protections/low_profit_pairs.py index e6ee0db642b..84934f394e2 100644 --- a/freqtrade/plugins/protections/low_profit_pairs.py +++ b/freqtrade/plugins/protections/low_profit_pairs.py @@ -1,6 +1,6 @@ import logging from datetime import datetime, timedelta -from typing import Any, Optional +from typing import Any from freqtrade.constants import Config, LongShort from freqtrade.persistence import Trade @@ -41,7 +41,7 @@ def _reason(self, profit: float) -> str: def _low_profit( self, date_now: datetime, pair: str, side: LongShort - ) -> Optional[ProtectionReturn]: + ) -> ProtectionReturn | None: """ Evaluate recent trades for pair """ @@ -81,7 +81,7 @@ def _low_profit( return None - def global_stop(self, date_now: datetime, side: LongShort) -> Optional[ProtectionReturn]: + def global_stop(self, date_now: datetime, side: LongShort) -> ProtectionReturn | None: """ Stops trading (position entering) for all pairs This must evaluate to true for the whole period of the "cooldown period". @@ -92,7 +92,7 @@ def global_stop(self, date_now: datetime, side: LongShort) -> Optional[Protectio def stop_per_pair( self, pair: str, date_now: datetime, side: LongShort - ) -> Optional[ProtectionReturn]: + ) -> ProtectionReturn | None: """ Stops trading (position entering) for this pair This must evaluate to true for the whole period of the "cooldown period". diff --git a/freqtrade/plugins/protections/max_drawdown_protection.py b/freqtrade/plugins/protections/max_drawdown_protection.py index 903f9fbbf3a..e8996d3a808 100644 --- a/freqtrade/plugins/protections/max_drawdown_protection.py +++ b/freqtrade/plugins/protections/max_drawdown_protection.py @@ -1,6 +1,6 @@ import logging from datetime import datetime, timedelta -from typing import Any, Optional +from typing import Any import pandas as pd @@ -42,7 +42,7 @@ def _reason(self, drawdown: float) -> str: f"locking {self.unlock_reason_time_element}." ) - def _max_drawdown(self, date_now: datetime) -> Optional[ProtectionReturn]: + def _max_drawdown(self, date_now: datetime) -> ProtectionReturn | None: """ Evaluate recent trades for drawdown ... """ @@ -81,7 +81,7 @@ def _max_drawdown(self, date_now: datetime) -> Optional[ProtectionReturn]: return None - def global_stop(self, date_now: datetime, side: LongShort) -> Optional[ProtectionReturn]: + def global_stop(self, date_now: datetime, side: LongShort) -> ProtectionReturn | None: """ Stops trading (position entering) for all pairs This must evaluate to true for the whole period of the "cooldown period". @@ -92,7 +92,7 @@ def global_stop(self, date_now: datetime, side: LongShort) -> Optional[Protectio def stop_per_pair( self, pair: str, date_now: datetime, side: LongShort - ) -> Optional[ProtectionReturn]: + ) -> ProtectionReturn | None: """ Stops trading (position entering) for this pair This must evaluate to true for the whole period of the "cooldown period". diff --git a/freqtrade/plugins/protections/stoploss_guard.py b/freqtrade/plugins/protections/stoploss_guard.py index 47ebc369652..a429a2f80cf 100644 --- a/freqtrade/plugins/protections/stoploss_guard.py +++ b/freqtrade/plugins/protections/stoploss_guard.py @@ -1,6 +1,6 @@ import logging from datetime import datetime, timedelta -from typing import Any, Optional +from typing import Any from freqtrade.constants import Config, LongShort from freqtrade.enums import ExitType @@ -42,8 +42,8 @@ def _reason(self) -> str: ) def _stoploss_guard( - self, date_now: datetime, pair: Optional[str], side: LongShort - ) -> Optional[ProtectionReturn]: + self, date_now: datetime, pair: str | None, side: LongShort + ) -> ProtectionReturn | None: """ Evaluate recent trades """ @@ -86,7 +86,7 @@ def _stoploss_guard( lock_side=(side if self._only_per_side else "*"), ) - def global_stop(self, date_now: datetime, side: LongShort) -> Optional[ProtectionReturn]: + def global_stop(self, date_now: datetime, side: LongShort) -> ProtectionReturn | None: """ Stops trading (position entering) for all pairs This must evaluate to true for the whole period of the "cooldown period". @@ -99,7 +99,7 @@ def global_stop(self, date_now: datetime, side: LongShort) -> Optional[Protectio def stop_per_pair( self, pair: str, date_now: datetime, side: LongShort - ) -> Optional[ProtectionReturn]: + ) -> ProtectionReturn | None: """ Stops trading (position entering) for this pair This must evaluate to true for the whole period of the "cooldown period". diff --git a/freqtrade/resolvers/exchange_resolver.py b/freqtrade/resolvers/exchange_resolver.py index 9d5a0d55707..835c3c0af0c 100644 --- a/freqtrade/resolvers/exchange_resolver.py +++ b/freqtrade/resolvers/exchange_resolver.py @@ -4,7 +4,7 @@ import logging from inspect import isclass -from typing import Any, Optional +from typing import Any import freqtrade.exchange as exchanges from freqtrade.constants import Config, ExchangeConfig @@ -26,7 +26,7 @@ class ExchangeResolver(IResolver): def load_exchange( config: Config, *, - exchange_config: Optional[ExchangeConfig] = None, + exchange_config: ExchangeConfig | None = None, validate: bool = True, load_leverage_tiers: bool = False, ) -> Exchange: diff --git a/freqtrade/resolvers/hyperopt_resolver.py b/freqtrade/resolvers/hyperopt_resolver.py index 72bbfa88662..80c2e789060 100644 --- a/freqtrade/resolvers/hyperopt_resolver.py +++ b/freqtrade/resolvers/hyperopt_resolver.py @@ -9,7 +9,7 @@ from freqtrade.constants import HYPEROPT_LOSS_BUILTIN, USERPATH_HYPEROPTS, Config from freqtrade.exceptions import OperationalException -from freqtrade.optimize.hyperopt_loss_interface import IHyperOptLoss +from freqtrade.optimize.hyperopt_loss.hyperopt_loss_interface import IHyperOptLoss from freqtrade.resolvers import IResolver diff --git a/freqtrade/resolvers/iresolver.py b/freqtrade/resolvers/iresolver.py index 9aa103a7efa..cb0c3de33c5 100644 --- a/freqtrade/resolvers/iresolver.py +++ b/freqtrade/resolvers/iresolver.py @@ -10,7 +10,7 @@ import sys from collections.abc import Iterator from pathlib import Path -from typing import Any, Optional, Union +from typing import Any from freqtrade.constants import Config from freqtrade.exceptions import OperationalException @@ -43,17 +43,17 @@ class IResolver: # Childclasses need to override this object_type: type[Any] object_type_str: str - user_subdir: Optional[str] = None - initial_search_path: Optional[Path] = None + user_subdir: str | None = None + initial_search_path: Path | None = None # Optional config setting containing a path (strategy_path, freqaimodel_path) - extra_path: Optional[str] = None + extra_path: str | None = None @classmethod def build_search_paths( cls, config: Config, - user_subdir: Optional[str] = None, - extra_dirs: Optional[list[str]] = None, + user_subdir: str | None = None, + extra_dirs: list[str] | None = None, ) -> list[Path]: abs_paths: list[Path] = [] if cls.initial_search_path: @@ -74,7 +74,7 @@ def build_search_paths( @classmethod def _get_valid_object( - cls, module_path: Path, object_name: Optional[str], enum_failed: bool = False + cls, module_path: Path, object_name: str | None, enum_failed: bool = False ) -> Iterator[Any]: """ Generator returning objects with matching object_type and object_name in the path given. @@ -131,7 +131,7 @@ def is_valid_class(obj): @classmethod def _search_object( cls, directory: Path, *, object_name: str, add_source: bool = False - ) -> Union[tuple[Any, Path], tuple[None, None]]: + ) -> tuple[Any, Path] | tuple[None, None]: """ Search for the objectname in the given directory :param directory: relative or absolute directory path @@ -161,7 +161,7 @@ def _search_object( @classmethod def _load_object( cls, paths: list[Path], *, object_name: str, add_source: bool = False, kwargs: dict - ) -> Optional[Any]: + ) -> Any | None: """ Try to load object from path list. """ @@ -184,7 +184,7 @@ def _load_object( @classmethod def load_object( - cls, object_name: str, config: Config, *, kwargs: dict, extra_dir: Optional[str] = None + cls, object_name: str, config: Config, *, kwargs: dict, extra_dir: str | None = None ) -> Any: """ Search and loads the specified object as configured in the child class. @@ -245,7 +245,7 @@ def _search_all_objects( directory: Path, enum_failed: bool, recursive: bool = False, - basedir: Optional[Path] = None, + basedir: Path | None = None, ) -> list[dict[str, Any]]: """ Searches a directory for valid objects diff --git a/freqtrade/resolvers/strategy_resolver.py b/freqtrade/resolvers/strategy_resolver.py index 5ac1cb6f990..67751b5aec7 100644 --- a/freqtrade/resolvers/strategy_resolver.py +++ b/freqtrade/resolvers/strategy_resolver.py @@ -10,7 +10,7 @@ from inspect import getfullargspec from os import walk from pathlib import Path -from typing import Any, Optional +from typing import Any from freqtrade.configuration.config_validation import validate_migrated_strategy_settings from freqtrade.constants import REQUIRED_ORDERTIF, REQUIRED_ORDERTYPES, USERPATH_STRATEGIES, Config @@ -35,7 +35,7 @@ class StrategyResolver(IResolver): extra_path = "strategy_path" @staticmethod - def load_strategy(config: Optional[Config] = None) -> IStrategy: + def load_strategy(config: Config | None = None) -> IStrategy: """ Load the custom class from config parameter :param config: configuration dictionary or None @@ -246,7 +246,7 @@ def validate_strategy(strategy: IStrategy) -> IStrategy: @staticmethod def _load_strategy( - strategy_name: str, config: Config, extra_dir: Optional[str] = None + strategy_name: str, config: Config, extra_dir: str | None = None ) -> IStrategy: """ Search and loads the specified strategy. diff --git a/freqtrade/rpc/api_server/api_auth.py b/freqtrade/rpc/api_server/api_auth.py index d9b04ab8186..5f63c0aa516 100644 --- a/freqtrade/rpc/api_server/api_auth.py +++ b/freqtrade/rpc/api_server/api_auth.py @@ -1,7 +1,7 @@ import logging import secrets from datetime import datetime, timedelta, timezone -from typing import Any, Union +from typing import Any import jwt from fastapi import APIRouter, Depends, HTTPException, Query, WebSocket, status @@ -55,7 +55,7 @@ def get_user_from_token(token, secret_key: str, token_type: str = "access") -> s # https://github.com/tiangolo/fastapi/blob/master/fastapi/security/api_key.py async def validate_ws_token( ws: WebSocket, - ws_token: Union[str, None] = Query(default=None, alias="token"), + ws_token: str | None = Query(default=None, alias="token"), api_config: dict[str, Any] = Depends(get_api_config), ): secret_ws_token = api_config.get("ws_token", None) diff --git a/freqtrade/rpc/api_server/api_background_tasks.py b/freqtrade/rpc/api_server/api_background_tasks.py index 3ca1d731139..b41828d6f97 100644 --- a/freqtrade/rpc/api_server/api_background_tasks.py +++ b/freqtrade/rpc/api_server/api_background_tasks.py @@ -22,6 +22,7 @@ def background_job_list(): "status": job["status"], "running": job["is_running"], "progress": job.get("progress"), + "progress_tasks": job.get("progress_tasks"), "error": job.get("error", None), } for jobid, job in ApiBG.jobs.items() @@ -39,5 +40,6 @@ def background_job(jobid: str): "status": job["status"], "running": job["is_running"], "progress": job.get("progress"), + "progress_tasks": job.get("progress_tasks"), "error": job.get("error", None), } diff --git a/freqtrade/rpc/api_server/api_backtest.py b/freqtrade/rpc/api_server/api_backtest.py index 1386109b836..65631add690 100644 --- a/freqtrade/rpc/api_server/api_backtest.py +++ b/freqtrade/rpc/api_server/api_backtest.py @@ -43,7 +43,7 @@ def __run_backtest_bg(btconfig: Config): from freqtrade.data.metrics import combined_dataframes_with_rel_mean - from freqtrade.optimize.optimize_reports import generate_backtest_stats, store_backtest_stats + from freqtrade.optimize.optimize_reports import generate_backtest_stats, store_backtest_results from freqtrade.resolvers import StrategyResolver asyncio.set_event_loop(asyncio.new_event_loop()) @@ -101,8 +101,8 @@ def __run_backtest_bg(btconfig: Config): if btconfig.get("export", "none") == "trades": combined_res = combined_dataframes_with_rel_mean(ApiBG.bt["data"], min_date, max_date) - fn = store_backtest_stats( - btconfig["exportfilename"], + fn = store_backtest_results( + btconfig, ApiBG.bt["bt"].results, datetime.now().strftime("%Y-%m-%d_%H-%M-%S"), market_change_data=combined_res, diff --git a/freqtrade/rpc/api_server/api_download_data.py b/freqtrade/rpc/api_server/api_download_data.py new file mode 100644 index 00000000000..b8c14ea1335 --- /dev/null +++ b/freqtrade/rpc/api_server/api_download_data.py @@ -0,0 +1,85 @@ +import logging +from copy import deepcopy + +from fastapi import APIRouter, BackgroundTasks, Depends +from fastapi.exceptions import HTTPException + +from freqtrade.constants import Config +from freqtrade.exceptions import OperationalException +from freqtrade.persistence import FtNoDBContext +from freqtrade.rpc.api_server.api_pairlists import handleExchangePayload +from freqtrade.rpc.api_server.api_schemas import BgJobStarted, DownloadDataPayload +from freqtrade.rpc.api_server.deps import get_config, get_exchange +from freqtrade.rpc.api_server.webserver_bgwork import ApiBG +from freqtrade.util.progress_tracker import get_progress_tracker + + +logger = logging.getLogger(__name__) + +# Private API, protected by authentication and webserver_mode dependency +router = APIRouter(tags=["download-data", "webserver"]) + + +def __run_download(job_id: str, config_loc: Config): + try: + ApiBG.jobs[job_id]["is_running"] = True + from freqtrade.data.history.history_utils import download_data + + with FtNoDBContext(): + exchange = get_exchange(config_loc) + + def ft_callback(task) -> None: + ApiBG.jobs[job_id]["progress_tasks"][str(task.id)] = { + "progress": task.completed, + "total": task.total, + "description": task.description, + } + + pt = get_progress_tracker(ft_callback=ft_callback) + + download_data(config_loc, exchange, progress_tracker=pt) + ApiBG.jobs[job_id]["status"] = "success" + except (OperationalException, Exception) as e: + logger.exception(e) + ApiBG.jobs[job_id]["error"] = str(e) + ApiBG.jobs[job_id]["status"] = "failed" + finally: + ApiBG.jobs[job_id]["is_running"] = False + ApiBG.download_data_running = False + + +@router.post("/download_data", response_model=BgJobStarted) +def pairlists_evaluate( + payload: DownloadDataPayload, background_tasks: BackgroundTasks, config=Depends(get_config) +): + if ApiBG.download_data_running: + raise HTTPException(status_code=400, detail="Data Download is already running.") + config_loc = deepcopy(config) + config_loc["stake_currency"] = "" + config_loc["pairs"] = payload.pairs + config_loc["timerange"] = payload.timerange + config_loc["days"] = payload.days + config_loc["timeframes"] = payload.timeframes + config_loc["erase"] = payload.erase + config_loc["download_trades"] = payload.download_trades + + handleExchangePayload(payload, config_loc) + + job_id = ApiBG.get_job_id() + + ApiBG.jobs[job_id] = { + "category": "download_data", + "status": "pending", + "progress": None, + "progress_tasks": {}, + "is_running": False, + "result": {}, + "error": None, + } + background_tasks.add_task(__run_download, job_id, config_loc) + ApiBG.download_data_running = True + + return { + "status": "Data Download started in background.", + "job_id": job_id, + } diff --git a/freqtrade/rpc/api_server/api_schemas.py b/freqtrade/rpc/api_server/api_schemas.py index 3c0fd70b714..97770ba13bf 100644 --- a/freqtrade/rpc/api_server/api_schemas.py +++ b/freqtrade/rpc/api_server/api_schemas.py @@ -1,17 +1,18 @@ from datetime import date, datetime -from typing import Any, Optional, Union +from typing import Any -from pydantic import AwareDatetime, BaseModel, RootModel, SerializeAsAny +from pydantic import AwareDatetime, BaseModel, RootModel, SerializeAsAny, model_validator -from freqtrade.constants import IntOrInf +from freqtrade.constants import DL_DATA_TIMEFRAMES, IntOrInf from freqtrade.enums import MarginMode, OrderTypeValues, SignalDirection, TradingMode from freqtrade.ft_types import ValidExchangesType +from freqtrade.rpc.api_server.webserver_bgwork import ProgressTask class ExchangeModePayloadMixin(BaseModel): - trading_mode: Optional[TradingMode] = None - margin_mode: Optional[MarginMode] = None - exchange: Optional[str] = None + trading_mode: TradingMode | None = None + margin_mode: MarginMode | None = None + exchange: str | None = None class Ping(BaseModel): @@ -43,12 +44,13 @@ class BackgroundTaskStatus(BaseModel): job_category: str status: str running: bool - progress: Optional[float] = None - error: Optional[str] = None + progress: float | None = None + progress_tasks: dict[str, ProgressTask] | None = None + error: str | None = None class BackgroundTaskResult(BaseModel): - error: Optional[str] = None + error: str | None = None status: str @@ -61,9 +63,9 @@ class Balance(BaseModel): free: float balance: float used: float - bot_owned: Optional[float] = None + bot_owned: float | None = None est_stake: float - est_stake_bot: Optional[float] = None + est_stake_bot: float | None = None stake: str # Starting with 2.x side: str @@ -160,7 +162,7 @@ class Profit(BaseModel): max_drawdown_start_timestamp: int max_drawdown_end: str max_drawdown_end_timestamp: int - trading_volume: Optional[float] = None + trading_volume: float | None = None bot_start_timestamp: int bot_start_date: str @@ -173,7 +175,7 @@ class SellReason(BaseModel): class Stats(BaseModel): exit_reasons: dict[str, SellReason] - durations: dict[str, Optional[float]] + durations: dict[str, float | None] class DailyWeeklyMonthlyRecord(BaseModel): @@ -192,50 +194,50 @@ class DailyWeeklyMonthly(BaseModel): class UnfilledTimeout(BaseModel): - entry: Optional[int] = None - exit: Optional[int] = None - unit: Optional[str] = None - exit_timeout_count: Optional[int] = None + entry: int | None = None + exit: int | None = None + unit: str | None = None + exit_timeout_count: int | None = None class OrderTypes(BaseModel): entry: OrderTypeValues exit: OrderTypeValues - emergency_exit: Optional[OrderTypeValues] = None - force_exit: Optional[OrderTypeValues] = None - force_entry: Optional[OrderTypeValues] = None + emergency_exit: OrderTypeValues | None = None + force_exit: OrderTypeValues | None = None + force_entry: OrderTypeValues | None = None stoploss: OrderTypeValues stoploss_on_exchange: bool - stoploss_on_exchange_interval: Optional[int] = None + stoploss_on_exchange_interval: int | None = None class ShowConfig(BaseModel): version: str - strategy_version: Optional[str] = None + strategy_version: str | None = None api_version: float dry_run: bool trading_mode: str short_allowed: bool stake_currency: str stake_amount: str - available_capital: Optional[float] = None + available_capital: float | None = None stake_currency_decimals: int max_open_trades: IntOrInf minimal_roi: dict[str, Any] - stoploss: Optional[float] = None + stoploss: float | None = None stoploss_on_exchange: bool - trailing_stop: Optional[bool] = None - trailing_stop_positive: Optional[float] = None - trailing_stop_positive_offset: Optional[float] = None - trailing_only_offset_is_reached: Optional[bool] = None - unfilledtimeout: Optional[UnfilledTimeout] = None # Empty in webserver mode - order_types: Optional[OrderTypes] = None - use_custom_stoploss: Optional[bool] = None - timeframe: Optional[str] = None + trailing_stop: bool | None = None + trailing_stop_positive: float | None = None + trailing_stop_positive_offset: float | None = None + trailing_only_offset_is_reached: bool | None = None + unfilledtimeout: UnfilledTimeout | None = None # Empty in webserver mode + order_types: OrderTypes | None = None + use_custom_stoploss: bool | None = None + timeframe: str | None = None timeframe_ms: int timeframe_min: int exchange: str - strategy: Optional[str] = None + strategy: str | None = None force_entry_enable: bool exit_pricing: dict[str, Any] entry_pricing: dict[str, Any] @@ -250,18 +252,18 @@ class OrderSchema(BaseModel): pair: str order_id: str status: str - remaining: Optional[float] = None + remaining: float | None = None amount: float safe_price: float cost: float - filled: Optional[float] = None + filled: float | None = None ft_order_side: str order_type: str is_open: bool - order_timestamp: Optional[int] = None - order_filled_timestamp: Optional[int] = None - ft_fee_base: Optional[float] = None - ft_order_tag: Optional[str] = None + order_timestamp: int | None = None + order_filled_timestamp: int | None = None + ft_fee_base: float | None = None + ft_order_tag: str | None = None class TradeSchema(BaseModel): @@ -275,80 +277,80 @@ class TradeSchema(BaseModel): amount: float amount_requested: float stake_amount: float - max_stake_amount: Optional[float] = None + max_stake_amount: float | None = None strategy: str - enter_tag: Optional[str] = None + enter_tag: str | None = None timeframe: int - fee_open: Optional[float] = None - fee_open_cost: Optional[float] = None - fee_open_currency: Optional[str] = None - fee_close: Optional[float] = None - fee_close_cost: Optional[float] = None - fee_close_currency: Optional[str] = None + fee_open: float | None = None + fee_open_cost: float | None = None + fee_open_currency: str | None = None + fee_close: float | None = None + fee_close_cost: float | None = None + fee_close_currency: str | None = None open_date: str open_timestamp: int - open_fill_date: Optional[str] - open_fill_timestamp: Optional[int] + open_fill_date: str | None + open_fill_timestamp: int | None open_rate: float - open_rate_requested: Optional[float] = None + open_rate_requested: float | None = None open_trade_value: float - close_date: Optional[str] = None - close_timestamp: Optional[int] = None - close_rate: Optional[float] = None - close_rate_requested: Optional[float] = None + close_date: str | None = None + close_timestamp: int | None = None + close_rate: float | None = None + close_rate_requested: float | None = None - close_profit: Optional[float] = None - close_profit_pct: Optional[float] = None - close_profit_abs: Optional[float] = None + close_profit: float | None = None + close_profit_pct: float | None = None + close_profit_abs: float | None = None - profit_ratio: Optional[float] = None - profit_pct: Optional[float] = None - profit_abs: Optional[float] = None - profit_fiat: Optional[float] = None + profit_ratio: float | None = None + profit_pct: float | None = None + profit_abs: float | None = None + profit_fiat: float | None = None realized_profit: float - realized_profit_ratio: Optional[float] = None - - exit_reason: Optional[str] = None - exit_order_status: Optional[str] = None - - stop_loss_abs: Optional[float] = None - stop_loss_ratio: Optional[float] = None - stop_loss_pct: Optional[float] = None - stoploss_last_update: Optional[str] = None - stoploss_last_update_timestamp: Optional[int] = None - initial_stop_loss_abs: Optional[float] = None - initial_stop_loss_ratio: Optional[float] = None - initial_stop_loss_pct: Optional[float] = None - - min_rate: Optional[float] = None - max_rate: Optional[float] = None + realized_profit_ratio: float | None = None + + exit_reason: str | None = None + exit_order_status: str | None = None + + stop_loss_abs: float | None = None + stop_loss_ratio: float | None = None + stop_loss_pct: float | None = None + stoploss_last_update: str | None = None + stoploss_last_update_timestamp: int | None = None + initial_stop_loss_abs: float | None = None + initial_stop_loss_ratio: float | None = None + initial_stop_loss_pct: float | None = None + + min_rate: float | None = None + max_rate: float | None = None has_open_orders: bool orders: list[OrderSchema] - leverage: Optional[float] = None - interest_rate: Optional[float] = None - liquidation_price: Optional[float] = None - funding_fees: Optional[float] = None - trading_mode: Optional[TradingMode] = None + leverage: float | None = None + interest_rate: float | None = None + liquidation_price: float | None = None + funding_fees: float | None = None + trading_mode: TradingMode | None = None - amount_precision: Optional[float] = None - price_precision: Optional[float] = None - precision_mode: Optional[int] = None + amount_precision: float | None = None + price_precision: float | None = None + precision_mode: int | None = None class OpenTradeSchema(TradeSchema): - stoploss_current_dist: Optional[float] = None - stoploss_current_dist_pct: Optional[float] = None - stoploss_current_dist_ratio: Optional[float] = None - stoploss_entry_dist: Optional[float] = None - stoploss_entry_dist_ratio: Optional[float] = None + stoploss_current_dist: float | None = None + stoploss_current_dist_pct: float | None = None + stoploss_current_dist_ratio: float | None = None + stoploss_entry_dist: float | None = None + stoploss_entry_dist_ratio: float | None = None current_rate: float total_profit_abs: float - total_profit_fiat: Optional[float] = None - total_profit_ratio: Optional[float] = None + total_profit_fiat: float | None = None + total_profit_ratio: float | None = None class TradeResponse(BaseModel): @@ -358,7 +360,7 @@ class TradeResponse(BaseModel): total_trades: int -ForceEnterResponse = RootModel[Union[TradeSchema, StatusMsg]] +ForceEnterResponse = RootModel[TradeSchema | StatusMsg] class LockModel(BaseModel): @@ -370,7 +372,7 @@ class LockModel(BaseModel): lock_timestamp: int pair: str side: str - reason: Optional[str] = None + reason: str | None = None class Locks(BaseModel): @@ -382,12 +384,12 @@ class LocksPayload(BaseModel): pair: str side: str = "*" # Default to both sides until: AwareDatetime - reason: Optional[str] = None + reason: str | None = None class DeleteLockRequest(BaseModel): - pair: Optional[str] = None - lockid: Optional[int] = None + pair: str | None = None + lockid: int | None = None class Logs(BaseModel): @@ -398,17 +400,17 @@ class Logs(BaseModel): class ForceEnterPayload(BaseModel): pair: str side: SignalDirection = SignalDirection.LONG - price: Optional[float] = None - ordertype: Optional[OrderTypeValues] = None - stakeamount: Optional[float] = None - entry_tag: Optional[str] = None - leverage: Optional[float] = None + price: float | None = None + ordertype: OrderTypeValues | None = None + stakeamount: float | None = None + entry_tag: str | None = None + leverage: float | None = None class ForceExitPayload(BaseModel): - tradeid: Union[str, int] - ordertype: Optional[OrderTypeValues] = None - amount: Optional[float] = None + tradeid: str | int + ordertype: OrderTypeValues | None = None + amount: float | None = None class BlacklistPayload(BaseModel): @@ -430,7 +432,7 @@ class WhitelistResponse(BaseModel): class WhitelistEvaluateResponse(BackgroundTaskResult): - result: Optional[WhitelistResponse] = None + result: WhitelistResponse | None = None class DeleteTrade(BaseModel): @@ -445,7 +447,7 @@ class PlotConfig_(BaseModel): subplots: dict[str, Any] -PlotConfig = RootModel[Union[PlotConfig_, dict]] +PlotConfig = RootModel[PlotConfig_ | dict] class StrategyListResponse(BaseModel): @@ -482,6 +484,22 @@ class PairListsPayload(ExchangeModePayloadMixin, BaseModel): stake_currency: str +class DownloadDataPayload(ExchangeModePayloadMixin, BaseModel): + pairs: list[str] + timeframes: list[str] | None = DL_DATA_TIMEFRAMES + days: int | None = None + timerange: str | None = None + erase: bool = False + download_trades: bool = False + + @model_validator(mode="before") + def check_mutually_exclusive(cls, values): + timeframes, days = values.get("timerange"), values.get("days") + if timeframes and days: + raise ValueError("Only one of timeframes or days can be provided, not both.") + return values + + class FreqAIModelListResponse(BaseModel): freqaimodels: list[str] @@ -489,7 +507,7 @@ class FreqAIModelListResponse(BaseModel): class StrategyResponse(BaseModel): strategy: str code: str - timeframe: Optional[str] + timeframe: str | None class AvailablePairs(BaseModel): @@ -501,14 +519,14 @@ class AvailablePairs(BaseModel): class PairCandlesRequest(BaseModel): pair: str timeframe: str - limit: Optional[int] = None - columns: Optional[list[str]] = None + limit: int | None = None + columns: list[str] | None = None class PairHistoryRequest(PairCandlesRequest): timerange: str strategy: str - freqaimodel: Optional[str] = None + freqaimodel: str | None = None class PairHistory(BaseModel): @@ -540,16 +558,16 @@ class BacktestFreqAIInputs(BaseModel): class BacktestRequest(BaseModel): strategy: str - timeframe: Optional[str] = None - timeframe_detail: Optional[str] = None - timerange: Optional[str] = None - max_open_trades: Optional[IntOrInf] = None - stake_amount: Optional[Union[str, float]] = None + timeframe: str | None = None + timeframe_detail: str | None = None + timerange: str | None = None + max_open_trades: IntOrInf | None = None + stake_amount: str | float | None = None enable_protections: bool - dry_run_wallet: Optional[float] = None - backtest_cache: Optional[str] = None - freqaimodel: Optional[str] = None - freqai: Optional[BacktestFreqAIInputs] = None + dry_run_wallet: float | None = None + backtest_cache: str | None = None + freqaimodel: str | None = None + freqai: BacktestFreqAIInputs | None = None class BacktestResponse(BaseModel): @@ -558,9 +576,9 @@ class BacktestResponse(BaseModel): status_msg: str step: str progress: float - trade_count: Optional[float] = None + trade_count: float | None = None # TODO: Properly type backtestresult... - backtest_result: Optional[dict[str, Any]] = None + backtest_result: dict[str, Any] | None = None # TODO: This is a copy of BacktestHistoryEntryType @@ -569,11 +587,11 @@ class BacktestHistoryEntry(BaseModel): strategy: str run_id: str backtest_start_time: int - notes: Optional[str] = "" - backtest_start_ts: Optional[int] = None - backtest_end_ts: Optional[int] = None - timeframe: Optional[str] = None - timeframe_detail: Optional[str] = None + notes: str | None = "" + backtest_start_ts: int | None = None + backtest_end_ts: int | None = None + timeframe: str | None = None + timeframe_detail: str | None = None class BacktestMetadataUpdate(BaseModel): @@ -593,9 +611,9 @@ class SysInfo(BaseModel): class Health(BaseModel): - last_process: Optional[datetime] = None - last_process_ts: Optional[int] = None - bot_start: Optional[datetime] = None - bot_start_ts: Optional[int] = None - bot_startup: Optional[datetime] = None - bot_startup_ts: Optional[int] = None + last_process: datetime | None = None + last_process_ts: int | None = None + bot_start: datetime | None = None + bot_start_ts: int | None = None + bot_startup: datetime | None = None + bot_startup_ts: int | None = None diff --git a/freqtrade/rpc/api_server/api_v1.py b/freqtrade/rpc/api_server/api_v1.py index 93602210957..25fd12efdc0 100644 --- a/freqtrade/rpc/api_server/api_v1.py +++ b/freqtrade/rpc/api_server/api_v1.py @@ -1,13 +1,12 @@ import logging from copy import deepcopy -from typing import Optional from fastapi import APIRouter, Depends, Query from fastapi.exceptions import HTTPException from freqtrade import __version__ from freqtrade.data.history import get_datahandler -from freqtrade.enums import CandleType, TradingMode +from freqtrade.enums import CandleType, State, TradingMode from freqtrade.exceptions import OperationalException from freqtrade.rpc import RPC from freqtrade.rpc.api_server.api_schemas import ( @@ -84,7 +83,8 @@ # 2.34: new entries/exits/mix_tags endpoints # 2.35: pair_candles and pair_history endpoints as Post variant # 2.40: Add hyperopt-loss endpoint -API_VERSION = 2.40 +# 2.41: Add download-data endpoint +API_VERSION = 2.41 # Public API, requires no auth. router_public = APIRouter() @@ -119,17 +119,17 @@ def count(rpc: RPC = Depends(get_rpc)): @router.get("/entries", response_model=list[Entry], tags=["info"]) -def entries(pair: Optional[str] = None, rpc: RPC = Depends(get_rpc)): +def entries(pair: str | None = None, rpc: RPC = Depends(get_rpc)): return rpc._rpc_enter_tag_performance(pair) @router.get("/exits", response_model=list[Exit], tags=["info"]) -def exits(pair: Optional[str] = None, rpc: RPC = Depends(get_rpc)): +def exits(pair: str | None = None, rpc: RPC = Depends(get_rpc)): return rpc._rpc_exit_reason_performance(pair) @router.get("/mix_tags", response_model=list[MixTag], tags=["info"]) -def mix_tags(pair: Optional[str] = None, rpc: RPC = Depends(get_rpc)): +def mix_tags(pair: str | None = None, rpc: RPC = Depends(get_rpc)): return rpc._rpc_mix_tag_performance(pair) @@ -216,8 +216,8 @@ def edge(rpc: RPC = Depends(get_rpc)): @router.get("/show_config", response_model=ShowConfig, tags=["info"]) -def show_config(rpc: Optional[RPC] = Depends(get_rpc_optional), config=Depends(get_config)): - state = "" +def show_config(rpc: RPC | None = Depends(get_rpc_optional), config=Depends(get_config)): + state: State | str = "" strategy_version = None if rpc: state = rpc._freqtrade.state @@ -304,7 +304,7 @@ def add_locks(payload: list[LocksPayload], rpc: RPC = Depends(get_rpc)): @router.get("/logs", response_model=Logs, tags=["info"]) -def logs(limit: Optional[int] = None): +def logs(limit: int | None = None): return RPC._rpc_get_logs(limit) @@ -330,9 +330,7 @@ def reload_config(rpc: RPC = Depends(get_rpc)): @router.get("/pair_candles", response_model=PairHistory, tags=["candle data"]) -def pair_candles( - pair: str, timeframe: str, limit: Optional[int] = None, rpc: RPC = Depends(get_rpc) -): +def pair_candles(pair: str, timeframe: str, limit: int | None = None, rpc: RPC = Depends(get_rpc)): return rpc._rpc_analysed_dataframe(pair, timeframe, limit, None) @@ -350,7 +348,7 @@ def pair_history( timeframe: str, timerange: str, strategy: str, - freqaimodel: Optional[str] = None, + freqaimodel: str | None = None, config=Depends(get_config), exchange=Depends(get_exchange), ): @@ -359,6 +357,7 @@ def pair_history( config = deepcopy(config) config.update( { + "timeframe": timeframe, "strategy": strategy, "timerange": timerange, "freqaimodel": freqaimodel if freqaimodel else config.get("freqaimodel"), @@ -379,6 +378,7 @@ def pair_history_filtered( config = deepcopy(config) config.update( { + "timeframe": payload.timeframe, "strategy": payload.strategy, "timerange": payload.timerange, "freqaimodel": ( @@ -396,9 +396,9 @@ def pair_history_filtered( @router.get("/plot_config", response_model=PlotConfig, tags=["candle data"]) def plot_config( - strategy: Optional[str] = None, + strategy: str | None = None, config=Depends(get_config), - rpc: Optional[RPC] = Depends(get_rpc_optional), + rpc: RPC | None = Depends(get_rpc_optional), ): if not strategy: if not rpc: @@ -494,9 +494,9 @@ def list_freqaimodels(config=Depends(get_config)): @router.get("/available_pairs", response_model=AvailablePairs, tags=["candle data"]) def list_available_pairs( - timeframe: Optional[str] = None, - stake_currency: Optional[str] = None, - candletype: Optional[CandleType] = None, + timeframe: str | None = None, + stake_currency: str | None = None, + candletype: CandleType | None = None, config=Depends(get_config), ): dh = get_datahandler(config["datadir"], config.get("dataformat_ohlcv")) diff --git a/freqtrade/rpc/api_server/deps.py b/freqtrade/rpc/api_server/deps.py index 997e8487b80..74ee82a8c48 100644 --- a/freqtrade/rpc/api_server/deps.py +++ b/freqtrade/rpc/api_server/deps.py @@ -1,5 +1,5 @@ from collections.abc import AsyncIterator -from typing import Any, Optional +from typing import Any from uuid import uuid4 from fastapi import Depends, HTTPException @@ -14,13 +14,13 @@ from .webserver import ApiServer -def get_rpc_optional() -> Optional[RPC]: +def get_rpc_optional() -> RPC | None: if ApiServer._has_rpc: return ApiServer._rpc return None -async def get_rpc() -> Optional[AsyncIterator[RPC]]: +async def get_rpc() -> AsyncIterator[RPC] | None: _rpc = get_rpc_optional() if _rpc: request_id = str(uuid4()) diff --git a/freqtrade/rpc/api_server/web_ui.py b/freqtrade/rpc/api_server/web_ui.py index bf37c6fa7a5..0a8a7301177 100644 --- a/freqtrade/rpc/api_server/web_ui.py +++ b/freqtrade/rpc/api_server/web_ui.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import Optional from fastapi import APIRouter from fastapi.exceptions import HTTPException @@ -42,7 +41,7 @@ async def index_html(rest_of_path: str): filename = uibase / rest_of_path # It's security relevant to check "relative_to". # Without this, Directory-traversal is possible. - media_type: Optional[str] = None + media_type: str | None = None if filename.suffix == ".js": # Force text/javascript for .js files - Circumvent faulty system configuration media_type = "application/javascript" diff --git a/freqtrade/rpc/api_server/webserver.py b/freqtrade/rpc/api_server/webserver.py index c96db998134..e06e77e1e9c 100644 --- a/freqtrade/rpc/api_server/webserver.py +++ b/freqtrade/rpc/api_server/webserver.py @@ -1,6 +1,6 @@ import logging from ipaddress import ip_address -from typing import Any, Optional +from typing import Any import orjson import uvicorn @@ -12,6 +12,7 @@ from freqtrade.constants import Config from freqtrade.exceptions import OperationalException from freqtrade.rpc.api_server.uvicorn_threaded import UvicornServer +from freqtrade.rpc.api_server.webserver_bgwork import ApiBG from freqtrade.rpc.api_server.ws.message_stream import MessageStream from freqtrade.rpc.rpc import RPC, RPCException, RPCHandler from freqtrade.rpc.rpc_types import RPCSendMsg @@ -39,7 +40,7 @@ class ApiServer(RPCHandler): _has_rpc: bool = False _config: Config = {} # websocket message stuff - _message_stream: Optional[MessageStream] = None + _message_stream: MessageStream | None = None def __new__(cls, *args, **kwargs): """ @@ -86,6 +87,8 @@ def cleanup(self) -> None: """Cleanup pending module resources""" ApiServer._has_rpc = False del ApiServer._rpc + ApiBG.exchanges = {} + ApiBG.jobs = {} if self._server and not self._standalone: logger.info("Stopping API Server") # self._server.force_exit, self._server.should_exit = True, True @@ -116,6 +119,7 @@ def configure_app(self, app: FastAPI, config): from freqtrade.rpc.api_server.api_auth import http_basic_or_jwt_token, router_login from freqtrade.rpc.api_server.api_background_tasks import router as api_bg_tasks from freqtrade.rpc.api_server.api_backtest import router as api_backtest + from freqtrade.rpc.api_server.api_download_data import router as api_download_data from freqtrade.rpc.api_server.api_pairlists import router as api_pairlists from freqtrade.rpc.api_server.api_v1 import router as api_v1 from freqtrade.rpc.api_server.api_v1 import router_public as api_v1_public @@ -146,6 +150,11 @@ def configure_app(self, app: FastAPI, config): prefix="/api/v1", dependencies=[Depends(http_basic_or_jwt_token), Depends(is_webserver_mode)], ) + app.include_router( + api_download_data, + prefix="/api/v1", + dependencies=[Depends(http_basic_or_jwt_token), Depends(is_webserver_mode)], + ) app.include_router(ws_router, prefix="/api/v1") # UI Router MUST be last! app.include_router(router_ui, prefix="") diff --git a/freqtrade/rpc/api_server/webserver_bgwork.py b/freqtrade/rpc/api_server/webserver_bgwork.py index dc8222490d9..4c335a2f2a8 100644 --- a/freqtrade/rpc/api_server/webserver_bgwork.py +++ b/freqtrade/rpc/api_server/webserver_bgwork.py @@ -1,16 +1,25 @@ -from typing import Any, Literal, Optional, TypedDict +from typing import Any, Literal from uuid import uuid4 +from typing_extensions import NotRequired, TypedDict + from freqtrade.exchange.exchange import Exchange +class ProgressTask(TypedDict): + progress: float + total: float + description: str + + class JobsContainer(TypedDict): - category: Literal["pairlist"] + category: Literal["pairlist", "download_data"] is_running: bool status: str - progress: Optional[float] + progress: float | None + progress_tasks: NotRequired[dict[str, ProgressTask]] result: Any - error: Optional[str] + error: str | None class ApiBG: @@ -32,6 +41,7 @@ class ApiBG: jobs: dict[str, JobsContainer] = {} # Pairlist evaluate things pairlist_running: bool = False + download_data_running: bool = False @staticmethod def get_job_id() -> str: diff --git a/freqtrade/rpc/api_server/ws/channel.py b/freqtrade/rpc/api_server/ws/channel.py index 5acbebe9f53..d05a1c1f780 100644 --- a/freqtrade/rpc/api_server/ws/channel.py +++ b/freqtrade/rpc/api_server/ws/channel.py @@ -4,7 +4,7 @@ from collections import deque from collections.abc import AsyncIterator from contextlib import asynccontextmanager -from typing import Any, Optional, Union +from typing import Any from uuid import uuid4 from fastapi import WebSocketDisconnect @@ -30,7 +30,7 @@ class WebSocketChannel: def __init__( self, websocket: WebSocketType, - channel_id: Optional[str] = None, + channel_id: str | None = None, serializer_cls: type[WebSocketSerializer] = HybridJSONWebSocketSerializer, send_throttle: float = 0.01, ): @@ -80,9 +80,7 @@ def _calc_send_limit(self): # maximum of 3 seconds per message self._send_high_limit = min(max(self.avg_send_time * 2, 1), 3) - async def send( - self, message: Union[WSMessageSchemaType, dict[str, Any]], use_timeout: bool = False - ): + async def send(self, message: WSMessageSchemaType | dict[str, Any], use_timeout: bool = False): """ Send a message on the wrapped websocket. If the sending takes too long, it will raise a TimeoutError and diff --git a/freqtrade/rpc/api_server/ws/proxy.py b/freqtrade/rpc/api_server/ws/proxy.py index a2c2cbafc02..c32494176a7 100644 --- a/freqtrade/rpc/api_server/ws/proxy.py +++ b/freqtrade/rpc/api_server/ws/proxy.py @@ -1,7 +1,7 @@ -from typing import Any, Union +from typing import Any from fastapi import WebSocket as FastAPIWebSocket -from websockets.client import WebSocketClientProtocol as WebSocket +from websockets.asyncio.client import ClientConnection as WebSocket from freqtrade.rpc.api_server.ws.types import WebSocketType @@ -13,7 +13,7 @@ class WebSocketProxy: """ def __init__(self, websocket: WebSocketType): - self._websocket: Union[FastAPIWebSocket, WebSocket] = websocket + self._websocket: FastAPIWebSocket | WebSocket = websocket @property def raw_websocket(self): diff --git a/freqtrade/rpc/api_server/ws/serializer.py b/freqtrade/rpc/api_server/ws/serializer.py index a93a776ccfd..cee7da12424 100644 --- a/freqtrade/rpc/api_server/ws/serializer.py +++ b/freqtrade/rpc/api_server/ws/serializer.py @@ -1,6 +1,6 @@ import logging from abc import ABC, abstractmethod -from typing import Any, Union +from typing import Any import orjson import rapidjson @@ -26,7 +26,7 @@ def _serialize(self, data): def _deserialize(self, data): raise NotImplementedError() - async def send(self, data: Union[WSMessageSchemaType, dict[str, Any]]): + async def send(self, data: WSMessageSchemaType | dict[str, Any]): await self._websocket.send(self._serialize(data)) async def recv(self) -> bytes: diff --git a/freqtrade/rpc/api_server/ws/types.py b/freqtrade/rpc/api_server/ws/types.py index 8f7dad33baf..7ce2eb4bf74 100644 --- a/freqtrade/rpc/api_server/ws/types.py +++ b/freqtrade/rpc/api_server/ws/types.py @@ -1,7 +1,7 @@ from typing import Any, TypeVar from fastapi import WebSocket as FastAPIWebSocket -from websockets.client import WebSocketClientProtocol as WebSocket +from websockets.asyncio.client import ClientConnection as WebSocket WebSocketType = TypeVar("WebSocketType", FastAPIWebSocket, WebSocket) diff --git a/freqtrade/rpc/api_server/ws_schemas.py b/freqtrade/rpc/api_server/ws_schemas.py index 5eb8f181201..3f9e80eeaa8 100644 --- a/freqtrade/rpc/api_server/ws_schemas.py +++ b/freqtrade/rpc/api_server/ws_schemas.py @@ -1,5 +1,5 @@ from datetime import datetime -from typing import Any, Optional, TypedDict +from typing import Any, TypedDict from pandas import DataFrame from pydantic import BaseModel, ConfigDict @@ -14,18 +14,18 @@ class BaseArbitraryModel(BaseModel): class WSRequestSchema(BaseArbitraryModel): type: RPCRequestType - data: Optional[Any] = None + data: Any | None = None class WSMessageSchemaType(TypedDict): # Type for typing to avoid doing pydantic typechecks. type: RPCMessageType - data: Optional[dict[str, Any]] + data: dict[str, Any] | None class WSMessageSchema(BaseArbitraryModel): type: RPCMessageType - data: Optional[Any] = None + data: Any | None = None model_config = ConfigDict(extra="allow") diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index e08553fab47..fe22613bd6c 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -8,8 +8,9 @@ import asyncio import logging import socket +from collections.abc import Callable from threading import Thread -from typing import Any, Callable, TypedDict, Union +from typing import Any, TypedDict import websockets from pydantic import ValidationError @@ -42,7 +43,7 @@ class Producer(TypedDict): logger = logging.getLogger(__name__) -def schema_to_dict(schema: Union[WSMessageSchema, WSRequestSchema]): +def schema_to_dict(schema: WSMessageSchema | WSRequestSchema): return schema.model_dump(exclude_none=True) @@ -212,8 +213,7 @@ async def _create_connection(self, producer: Producer, lock: asyncio.Lock): except ( socket.gaierror, ConnectionRefusedError, - websockets.exceptions.InvalidStatusCode, - websockets.exceptions.InvalidMessage, + websockets.exceptions.InvalidHandshake, ) as e: logger.error(f"Connection Refused - {e} retrying in {self.sleep_time}s") await asyncio.sleep(self.sleep_time) @@ -282,9 +282,7 @@ async def _receive_messages( logger.debug(e, exc_info=e) raise - def send_producer_request( - self, producer_name: str, request: Union[WSRequestSchema, dict[str, Any]] - ): + def send_producer_request(self, producer_name: str, request: WSRequestSchema | dict[str, Any]): """ Publish a message to the producer's message stream to be sent by the channel task. diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index c3bcfd9f167..ce19299f9b4 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -7,7 +7,7 @@ from collections.abc import Generator, Sequence from datetime import date, datetime, timedelta, timezone from math import isnan -from typing import Any, Optional, Union +from typing import TYPE_CHECKING, Any import psutil from dateutil.relativedelta import relativedelta @@ -32,14 +32,21 @@ ) from freqtrade.exceptions import ExchangeError, PricingError from freqtrade.exchange import timeframe_to_minutes, timeframe_to_msecs -from freqtrade.exchange.exchange_types import Tickers +from freqtrade.exchange.exchange_utils import price_to_precision from freqtrade.loggers import bufferHandler from freqtrade.persistence import KeyStoreKeys, KeyValueStore, PairLocks, Trade from freqtrade.persistence.models import PairLock from freqtrade.plugins.pairlist.pairlist_helpers import expand_pairlist from freqtrade.rpc.fiat_convert import CryptoToFiatConverter from freqtrade.rpc.rpc_types import RPCSendMsg -from freqtrade.util import decimals_per_coin, dt_now, dt_ts_def, format_date, shorten_date +from freqtrade.util import ( + decimals_per_coin, + dt_from_ts, + dt_now, + dt_ts_def, + format_date, + shorten_date, +) from freqtrade.util.datetime_helpers import dt_humanize_delta from freqtrade.wallets import PositionWallet, Wallet @@ -97,7 +104,11 @@ class RPC: """ # Bind _fiat_converter if needed - _fiat_converter: Optional[CryptoToFiatConverter] = None + _fiat_converter: CryptoToFiatConverter | None = None + if TYPE_CHECKING: + from freqtrade.freqtradebot import FreqtradeBot + + _freqtrade: FreqtradeBot def __init__(self, freqtrade) -> None: """ @@ -112,7 +123,7 @@ def __init__(self, freqtrade) -> None: @staticmethod def _rpc_show_config( - config, botstate: Union[State, str], strategy_version: Optional[str] = None + config, botstate: State | str, strategy_version: str | None = None ) -> dict[str, Any]: """ Return a dict of config options. @@ -168,7 +179,7 @@ def _rpc_show_config( } return val - def _rpc_trade_status(self, trade_ids: Optional[list[int]] = None) -> list[dict[str, Any]]: + def _rpc_trade_status(self, trade_ids: list[int] | None = None) -> list[dict[str, Any]]: """ Below follows the RPC backend it is prefixed with rpc_ to raise awareness that it is a remotely exposed function @@ -184,11 +195,11 @@ def _rpc_trade_status(self, trade_ids: Optional[list[int]] = None) -> list[dict[ else: results = [] for trade in trades: - current_profit_fiat: Optional[float] = None - total_profit_fiat: Optional[float] = None + current_profit_fiat: float | None = None + total_profit_fiat: float | None = None # prepare open orders details - oo_details: Optional[str] = "" + oo_details: str | None = "" oo_details_lst = [ f"({oo.order_type} {oo.side} rem={oo.safe_remaining:.8f})" for oo in trade.open_orders @@ -197,11 +208,11 @@ def _rpc_trade_status(self, trade_ids: Optional[list[int]] = None) -> list[dict[ oo_details = ", ".join(oo_details_lst) total_profit_abs = 0.0 - total_profit_ratio: Optional[float] = None + total_profit_ratio: float | None = None # calculate profit and send message to user if trade.is_open: try: - current_rate = self._freqtrade.exchange.get_rate( + current_rate: float = self._freqtrade.exchange.get_rate( trade.pair, side="exit", is_short=trade.is_short, refresh=False ) except (ExchangeError, PricingError): @@ -219,7 +230,7 @@ def _rpc_trade_status(self, trade_ids: Optional[list[int]] = None) -> list[dict[ else: # Closed trade ... - current_rate = trade.close_rate + current_rate = trade.close_rate or 0.0 current_profit = trade.close_profit or 0.0 current_profit_abs = trade.close_profit_abs or 0.0 @@ -243,7 +254,11 @@ def _rpc_trade_status(self, trade_ids: Optional[list[int]] = None) -> list[dict[ stoploss_entry_dist_ratio = stop_entry.profit_ratio # calculate distance to stoploss - stoploss_current_dist = trade.stop_loss - current_rate + stoploss_current_dist = price_to_precision( + trade.stop_loss - current_rate, + trade.price_precision, + trade.precision_mode_price, + ) stoploss_current_dist_ratio = stoploss_current_dist / current_rate trade_dict = trade.to_json() @@ -264,6 +279,7 @@ def _rpc_trade_status(self, trade_ids: Optional[list[int]] = None) -> list[dict[ stoploss_entry_dist=stoploss_entry_dist, stoploss_entry_dist_ratio=round(stoploss_entry_dist_ratio, 8), open_orders=oo_details, + nr_of_successful_entries=trade.nr_of_successful_entries, ) ) results.append(trade_dict) @@ -271,83 +287,82 @@ def _rpc_trade_status(self, trade_ids: Optional[list[int]] = None) -> list[dict[ def _rpc_status_table( self, stake_currency: str, fiat_display_currency: str - ) -> tuple[list, list, float]: - trades: list[Trade] = Trade.get_open_trades() + ) -> tuple[list, list, float, float]: + """ + :return: list of trades, list of columns, sum of fiat profit + """ nonspot = self._config.get("trading_mode", TradingMode.SPOT) != TradingMode.SPOT - if not trades: + if not Trade.get_open_trades(): raise RPCException("no active trade") - else: - trades_list = [] - fiat_profit_sum = nan - for trade in trades: - # calculate profit and send message to user - try: - current_rate = self._freqtrade.exchange.get_rate( - trade.pair, side="exit", is_short=trade.is_short, refresh=False - ) - except (PricingError, ExchangeError): - current_rate = nan - trade_profit = nan - profit_str = f"{nan:.2%}" - else: - if trade.nr_of_successful_entries > 0: - profit = trade.calculate_profit(current_rate) - trade_profit = profit.profit_abs - profit_str = f"{profit.profit_ratio:.2%}" - else: - trade_profit = 0.0 - profit_str = f"{0.0:.2f}" - leverage = f"{trade.leverage:.3g}" - direction_str = ( - (f"S {leverage}x" if trade.is_short else f"L {leverage}x") if nonspot else "" + + trades_list = [] + fiat_profit_sum = nan + fiat_total_profit_sum = nan + for trade in self._rpc_trade_status(): + # Format profit as a string with the right sign + profit = f"{trade['profit_ratio']:.2%}" + fiat_profit = trade.get("profit_fiat", None) + if fiat_profit is None or isnan(fiat_profit): + fiat_profit = trade.get("profit_abs", 0.0) + if not isnan(fiat_profit): + profit += f" ({fiat_profit:.2f})" + fiat_profit_sum = ( + fiat_profit if isnan(fiat_profit_sum) else fiat_profit_sum + fiat_profit + ) + total_profit = trade.get("total_profit_fiat", None) + if total_profit is None or isnan(total_profit): + total_profit = trade.get("total_profit_abs", 0.0) + if not isnan(total_profit): + fiat_total_profit_sum = ( + total_profit + if isnan(fiat_total_profit_sum) + else fiat_total_profit_sum + total_profit ) - if self._fiat_converter: - fiat_profit = self._fiat_converter.convert_amount( - trade_profit, stake_currency, fiat_display_currency - ) - if not isnan(fiat_profit): - profit_str += f" ({fiat_profit:.2f})" - fiat_profit_sum = ( - fiat_profit if isnan(fiat_profit_sum) else fiat_profit_sum + fiat_profit - ) - else: - profit_str += f" ({trade_profit:.2f})" - fiat_profit_sum = ( - trade_profit if isnan(fiat_profit_sum) else fiat_profit_sum + trade_profit - ) - active_attempt_side_symbols = [ - "*" if (oo and oo.ft_order_side == trade.entry_side) else "**" - for oo in trade.open_orders - ] + # Format the active order side symbols + active_order_side = "" + orders = trade.get("orders", []) + if orders: + active_order_side = ".".join( + "*" if (o.get("is_open") and o.get("ft_is_entry")) else "**" + for o in orders + if o.get("is_open") + ) - # example: '*.**.**' trying to enter, exit and exit with 3 different orders - active_attempt_side_symbols_str = ".".join(active_attempt_side_symbols) + # Direction string for non-spot + direction_str = "" + if nonspot: + leverage = trade.get("leverage", 1.0) + direction_str = f"{'S' if trade.get('is_short') else 'L'} {leverage:.3g}x" + + detail_trade = [ + f"{trade['trade_id']} {direction_str}", + f"{trade['pair']}{active_order_side}", + shorten_date(dt_humanize_delta(dt_from_ts(trade["open_timestamp"]))), + profit, + ] - detail_trade = [ - f"{trade.id} {direction_str}", - trade.pair + active_attempt_side_symbols_str, - shorten_date(dt_humanize_delta(trade.open_date_utc)), - profit_str, - ] + # Add number of entries if position adjustment is enabled + if self._config.get("position_adjustment_enable", False): + max_entry_str = "" + if self._config.get("max_entry_position_adjustment", -1) > 0: + max_entry_str = f"/{self._config['max_entry_position_adjustment'] + 1}" + filled_entries = trade.get("nr_of_successful_entries", 0) + detail_trade.append(f"{filled_entries}{max_entry_str}") + + trades_list.append(detail_trade) + + columns = [ + "ID L/S" if nonspot else "ID", + "Pair", + "Since", + f"Profit ({fiat_display_currency if self._fiat_converter else stake_currency})", + ] - if self._config.get("position_adjustment_enable", False): - max_entry_str = "" - if self._config.get("max_entry_position_adjustment", -1) > 0: - max_entry_str = f"/{self._config['max_entry_position_adjustment'] + 1}" - filled_entries = trade.nr_of_successful_entries - detail_trade.append(f"{filled_entries}{max_entry_str}") - trades_list.append(detail_trade) - profitcol = "Profit" - if self._fiat_converter: - profitcol += " (" + fiat_display_currency + ")" - else: - profitcol += " (" + stake_currency + ")" + if self._config.get("position_adjustment_enable", False): + columns.append("# Entries") - columns = ["ID L/S" if nonspot else "ID", "Pair", "Since", profitcol] - if self._config.get("position_adjustment_enable", False): - columns.append("# Entries") - return trades_list, columns, fiat_profit_sum + return trades_list, columns, fiat_profit_sum, fiat_total_profit_sum def _rpc_timeunit_profit( self, @@ -487,7 +502,7 @@ def trade_win_loss(trade): return {"exit_reasons": exit_reasons, "durations": durations} def _rpc_trade_statistics( - self, stake_currency: str, fiat_display_currency: str, start_date: Optional[datetime] = None + self, stake_currency: str, fiat_display_currency: str, start_date: datetime | None = None ) -> dict[str, Any]: """Returns cumulative profit statistics""" @@ -572,8 +587,8 @@ def _rpc_trade_statistics( # Doing the sum is not right - overall profit needs to be based on initial capital profit_all_ratio_sum = sum(profit_all_ratio) if profit_all_ratio else 0.0 starting_balance = self._freqtrade.wallets.get_starting_balance() - profit_closed_ratio_fromstart = 0 - profit_all_ratio_fromstart = 0 + profit_closed_ratio_fromstart = 0.0 + profit_all_ratio_fromstart = 0.0 if starting_balance: profit_closed_ratio_fromstart = profit_closed_coin_sum / starting_balance profit_all_ratio_fromstart = profit_all_coin_sum / starting_balance @@ -670,7 +685,7 @@ def _rpc_trade_statistics( } def __balance_get_est_stake( - self, coin: str, stake_currency: str, amount: float, balance: Wallet, tickers + self, coin: str, stake_currency: str, amount: float, balance: Wallet ) -> tuple[float, float]: est_stake = 0.0 est_bot_stake = 0.0 @@ -681,14 +696,18 @@ def __balance_get_est_stake( est_stake = balance.free est_bot_stake = amount else: - pair = self._freqtrade.exchange.get_valid_pair_combination(coin, stake_currency) - rate: Optional[float] = tickers.get(pair, {}).get("last", None) - if rate: - if pair.startswith(stake_currency) and not pair.endswith(stake_currency): - rate = 1.0 / rate - est_stake = rate * balance.total - est_bot_stake = rate * amount + try: + rate: float | None = self._freqtrade.exchange.get_conversion_rate( + coin, stake_currency + ) + if rate: + est_stake = rate * balance.total + est_bot_stake = rate * amount + return est_stake, est_bot_stake + except (ExchangeError, PricingError) as e: + logger.warning(f"Error {e} getting rate for {coin}") + pass return est_stake, est_bot_stake def _rpc_balance(self, stake_currency: str, fiat_display_currency: str) -> dict: @@ -696,10 +715,6 @@ def _rpc_balance(self, stake_currency: str, fiat_display_currency: str) -> dict: currencies: list[dict] = [] total = 0.0 total_bot = 0.0 - try: - tickers: Tickers = self._freqtrade.exchange.get_tickers(cached=True) - except ExchangeError: - raise RPCException("Error getting current tickers.") open_trades: list[Trade] = Trade.get_open_trades() open_assets: dict[str, Trade] = {t.safe_base_currency: t for t in open_trades} @@ -715,7 +730,7 @@ def _rpc_balance(self, stake_currency: str, fiat_display_currency: str) -> dict: coin: str balance: Wallet for coin, balance in self._freqtrade.wallets.get_all_balances().items(): - if not balance.total: + if not balance.total and not balance.free: continue trade = open_assets.get(coin, None) @@ -726,7 +741,7 @@ def _rpc_balance(self, stake_currency: str, fiat_display_currency: str) -> dict: try: est_stake, est_stake_bot = self.__balance_get_est_stake( - coin, stake_currency, trade_amount, balance, tickers + coin, stake_currency, trade_amount, balance ) except ValueError: continue @@ -851,7 +866,7 @@ def _rpc_reload_trade_from_exchange(self, trade_id: int) -> dict[str, str]: return {"status": "Reloaded from orders from exchange"} def __exec_force_exit( - self, trade: Trade, ordertype: Optional[str], amount: Optional[float] = None + self, trade: Trade, ordertype: str | None, amount: float | None = None ) -> bool: # Check if there is there are open orders trade_entry_cancelation_registry = [] @@ -882,14 +897,14 @@ def __exec_force_exit( order_type = ordertype or self._freqtrade.strategy.order_types.get( "force_exit", self._freqtrade.strategy.order_types["exit"] ) - sub_amount: Optional[float] = None + sub_amount: float | None = None if amount and amount < trade.amount: # Partial exit ... min_exit_stake = self._freqtrade.exchange.get_min_pair_stake_amount( - trade.pair, current_rate, trade.stop_loss_pct + trade.pair, current_rate, trade.stop_loss_pct or 0.0 ) remaining = (trade.amount - amount) * current_rate - if remaining < min_exit_stake: + if min_exit_stake and remaining < min_exit_stake: raise RPCException(f"Remaining amount of {remaining} would be too small.") sub_amount = amount @@ -901,7 +916,7 @@ def __exec_force_exit( return False def _rpc_force_exit( - self, trade_id: str, ordertype: Optional[str] = None, *, amount: Optional[float] = None + self, trade_id: str, ordertype: str | None = None, *, amount: float | None = None ) -> dict[str, str]: """ Handler for forceexit . @@ -960,14 +975,14 @@ def _force_entry_validations(self, pair: str, order_side: SignalDirection): def _rpc_force_entry( self, pair: str, - price: Optional[float], + price: float | None, *, - order_type: Optional[str] = None, + order_type: str | None = None, order_side: SignalDirection = SignalDirection.LONG, - stake_amount: Optional[float] = None, - enter_tag: Optional[str] = "force_entry", - leverage: Optional[float] = None, - ) -> Optional[Trade]: + stake_amount: float | None = None, + enter_tag: str | None = "force_entry", + leverage: float | None = None, + ) -> Trade | None: """ Handler for forcebuy Buys a pair trade at the given or current price @@ -977,7 +992,7 @@ def _rpc_force_entry( # check if valid pair # check if pair already has an open pair - trade: Optional[Trade] = Trade.get_trades( + trade: Trade | None = Trade.get_trades( [Trade.is_open.is_(True), Trade.pair == pair] ).first() is_short = order_side == SignalDirection.SHORT @@ -1052,7 +1067,7 @@ def _rpc_cancel_open_order(self, trade_id: int): ) Trade.commit() - def _rpc_delete(self, trade_id: int) -> dict[str, Union[str, int]]: + def _rpc_delete(self, trade_id: int) -> dict[str, str | int]: """ Handler for delete . Delete the given trade and close eventually existing open orders. @@ -1093,7 +1108,7 @@ def _rpc_delete(self, trade_id: int) -> dict[str, Union[str, int]]: "cancel_order_count": c_count, } - def _rpc_list_custom_data(self, trade_id: int, key: Optional[str]) -> list[dict[str, Any]]: + def _rpc_list_custom_data(self, trade_id: int, key: str | None) -> list[dict[str, Any]]: # Query for trade trade = Trade.get_trades(trade_filter=[Trade.id == trade_id]).first() if trade is None: @@ -1128,21 +1143,21 @@ def _rpc_performance(self) -> list[dict[str, Any]]: return pair_rates - def _rpc_enter_tag_performance(self, pair: Optional[str]) -> list[dict[str, Any]]: + def _rpc_enter_tag_performance(self, pair: str | None) -> list[dict[str, Any]]: """ Handler for buy tag performance. Shows a performance statistic from finished trades """ return Trade.get_enter_tag_performance(pair) - def _rpc_exit_reason_performance(self, pair: Optional[str]) -> list[dict[str, Any]]: + def _rpc_exit_reason_performance(self, pair: str | None) -> list[dict[str, Any]]: """ Handler for exit reason performance. Shows a performance statistic from finished trades """ return Trade.get_exit_reason_performance(pair) - def _rpc_mix_tag_performance(self, pair: Optional[str]) -> list[dict[str, Any]]: + def _rpc_mix_tag_performance(self, pair: str | None) -> list[dict[str, Any]]: """ Handler for mix tag (enter_tag + exit_reason) performance. Shows a performance statistic from finished trades @@ -1174,7 +1189,7 @@ def _rpc_locks(self) -> dict[str, Any]: return {"lock_count": len(locks), "locks": [lock.to_json() for lock in locks]} def _rpc_delete_lock( - self, lockid: Optional[int] = None, pair: Optional[str] = None + self, lockid: int | None = None, pair: str | None = None ) -> dict[str, Any]: """Delete specific lock(s)""" locks: Sequence[PairLock] = [] @@ -1192,9 +1207,7 @@ def _rpc_delete_lock( return self._rpc_locks() - def _rpc_add_lock( - self, pair: str, until: datetime, reason: Optional[str], side: str - ) -> PairLock: + def _rpc_add_lock(self, pair: str, until: datetime, reason: str | None, side: str) -> PairLock: lock = PairLocks.lock_pair( pair=pair, until=until, @@ -1224,14 +1237,14 @@ def _rpc_blacklist_delete(self, delete: list[str]) -> dict: resp["errors"] = errors return resp - def _rpc_blacklist(self, add: Optional[list[str]] = None) -> dict: + def _rpc_blacklist(self, add: list[str] | None = None) -> dict: """Returns the currently active blacklist""" errors = {} if add: for pair in add: if pair not in self._freqtrade.pairlists.blacklist: try: - expand_pairlist([pair], self._freqtrade.exchange.get_markets().keys()) + expand_pairlist([pair], list(self._freqtrade.exchange.get_markets().keys())) self._freqtrade.pairlists.blacklist.append(pair) except ValueError: @@ -1249,7 +1262,7 @@ def _rpc_blacklist(self, add: Optional[list[str]] = None) -> dict: return res @staticmethod - def _rpc_get_logs(limit: Optional[int]) -> dict[str, Any]: + def _rpc_get_logs(limit: int | None) -> dict[str, Any]: """Returns the last X logs""" if limit: buffer = bufferHandler.buffer[-limit:] @@ -1286,7 +1299,7 @@ def _convert_dataframe_to_dict( timeframe: str, dataframe: DataFrame, last_analyzed: datetime, - selected_cols: Optional[list[str]], + selected_cols: list[str] | None, ) -> dict[str, Any]: has_content = len(dataframe) != 0 dataframe_columns = list(dataframe.columns) @@ -1355,7 +1368,7 @@ def _convert_dataframe_to_dict( return res def _rpc_analysed_dataframe( - self, pair: str, timeframe: str, limit: Optional[int], selected_cols: Optional[list[str]] + self, pair: str, timeframe: str, limit: int | None, selected_cols: list[str] | None ) -> dict[str, Any]: """Analyzed dataframe in Dict form""" @@ -1365,7 +1378,7 @@ def _rpc_analysed_dataframe( ) def __rpc_analysed_dataframe_raw( - self, pair: str, timeframe: str, limit: Optional[int] + self, pair: str, timeframe: str, limit: int | None ) -> tuple[DataFrame, datetime]: """ Get the dataframe and last analyze from the dataprovider @@ -1383,7 +1396,7 @@ def __rpc_analysed_dataframe_raw( return _data, last_analyzed def _ws_all_analysed_dataframes( - self, pairlist: list[str], limit: Optional[int] + self, pairlist: list[str], limit: int | None ) -> Generator[dict[str, Any], None, None]: """ Get the analysed dataframes of each pair in the pairlist. @@ -1403,7 +1416,7 @@ def _ws_all_analysed_dataframes( yield {"key": (pair, timeframe, candle_type), "df": dataframe, "la": last_analyzed} - def _ws_request_analyzed_df(self, limit: Optional[int] = None, pair: Optional[str] = None): + def _ws_request_analyzed_df(self, limit: int | None = None, pair: str | None = None): """Historical Analyzed Dataframes for WebSocket""" pairlist = [pair] if pair else self._freqtrade.active_pair_whitelist @@ -1415,7 +1428,7 @@ def _ws_request_whitelist(self): @staticmethod def _rpc_analysed_history_full( - config: Config, pair: str, timeframe: str, exchange, selected_cols: Optional[list[str]] + config: Config, pair: str, timeframe: str, exchange, selected_cols: list[str] | None ) -> dict[str, Any]: timerange_parsed = TimeRange.parse_timerange(config.get("timerange")) @@ -1482,9 +1495,9 @@ def _rpc_sysinfo() -> dict[str, Any]: "ram_pct": psutil.virtual_memory().percent, } - def health(self) -> dict[str, Optional[Union[str, int]]]: + def health(self) -> dict[str, str | int | None]: last_p = self._freqtrade.last_process - res: dict[str, Union[None, str, int]] = { + res: dict[str, None | str | int] = { "last_process": None, "last_process_loc": None, "last_process_ts": None, diff --git a/freqtrade/rpc/rpc_types.py b/freqtrade/rpc/rpc_types.py index 0fa4cea7553..ad6138a91e9 100644 --- a/freqtrade/rpc/rpc_types.py +++ b/freqtrade/rpc/rpc_types.py @@ -1,5 +1,5 @@ from datetime import datetime -from typing import Any, Literal, Optional, TypedDict, Union +from typing import Any, Literal, TypedDict from freqtrade.constants import PairWithTimeframe from freqtrade.enums import RPCMessageType @@ -31,7 +31,7 @@ class RPCProtectionMsg(RPCSendMsgBase): type: Literal[RPCMessageType.PROTECTION_TRIGGER, RPCMessageType.PROTECTION_TRIGGER_GLOBAL] id: int pair: str - base_currency: Optional[str] + base_currency: str | None lock_time: str lock_timestamp: int lock_end_time: str @@ -48,23 +48,23 @@ class RPCWhitelistMsg(RPCSendMsgBase): class __RPCEntryExitMsgBase(RPCSendMsgBase): trade_id: int - buy_tag: Optional[str] - enter_tag: Optional[str] + buy_tag: str | None + enter_tag: str | None exchange: str pair: str base_currency: str quote_currency: str - leverage: Optional[float] + leverage: float | None direction: str limit: float open_rate: float order_type: str stake_amount: float stake_currency: str - fiat_currency: Optional[str] + fiat_currency: str | None amount: float open_date: datetime - current_rate: Optional[float] + current_rate: float | None sub_trade: bool @@ -84,11 +84,11 @@ class RPCExitMsg(__RPCEntryExitMsgBase): close_rate: float profit_amount: float profit_ratio: float - exit_reason: Optional[str] + exit_reason: str | None close_date: datetime - # current_rate: Optional[float] - order_rate: Optional[float] - final_profit_ratio: Optional[float] + # current_rate: float | None + order_rate: float | None + final_profit_ratio: float | None is_final_exit: bool @@ -98,7 +98,7 @@ class RPCExitCancelMsg(__RPCEntryExitMsgBase): gain: ProfitLossStr profit_amount: float profit_ratio: float - exit_reason: Optional[str] + exit_reason: str | None close_date: datetime @@ -122,18 +122,18 @@ class RPCNewCandleMsg(RPCSendMsgBase): data: PairWithTimeframe -RPCOrderMsg = Union[RPCEntryMsg, RPCExitMsg, RPCExitCancelMsg, RPCCancelMsg] +RPCOrderMsg = RPCEntryMsg | RPCExitMsg | RPCExitCancelMsg | RPCCancelMsg -RPCSendMsg = Union[ - RPCStatusMsg, - RPCStrategyMsg, - RPCProtectionMsg, - RPCWhitelistMsg, - RPCEntryMsg, - RPCCancelMsg, - RPCExitMsg, - RPCExitCancelMsg, - RPCAnalyzedDFMsg, - RPCNewCandleMsg, -] +RPCSendMsg = ( + RPCStatusMsg + | RPCStrategyMsg + | RPCProtectionMsg + | RPCWhitelistMsg + | RPCEntryMsg + | RPCCancelMsg + | RPCExitMsg + | RPCExitCancelMsg + | RPCAnalyzedDFMsg + | RPCNewCandleMsg +) diff --git a/freqtrade/rpc/telegram.py b/freqtrade/rpc/telegram.py index 2de4499f1a0..e50771481fe 100644 --- a/freqtrade/rpc/telegram.py +++ b/freqtrade/rpc/telegram.py @@ -8,7 +8,7 @@ import json import logging import re -from collections.abc import Coroutine +from collections.abc import Callable, Coroutine from copy import deepcopy from dataclasses import dataclass from datetime import date, datetime, timedelta @@ -17,7 +17,7 @@ from itertools import chain from math import isnan from threading import Thread -from typing import Any, Callable, Literal, Optional, Union +from typing import Any, Literal from tabulate import tabulate from telegram import ( @@ -41,7 +41,14 @@ from freqtrade.persistence import Trade from freqtrade.rpc import RPC, RPCException, RPCHandler from freqtrade.rpc.rpc_types import RPCEntryMsg, RPCExitMsg, RPCOrderMsg, RPCSendMsg -from freqtrade.util import dt_from_ts, dt_humanize_delta, fmt_coin, format_date, round_value +from freqtrade.util import ( + dt_from_ts, + dt_humanize_delta, + fmt_coin, + fmt_coin2, + format_date, + round_value, +) MAX_MESSAGE_LENGTH = MessageLimit.MAX_TEXT_LENGTH @@ -83,6 +90,7 @@ class TimeunitMappings: def authorized_only(command_handler: Callable[..., Coroutine[Any, Any, None]]): """ Decorator to check if the message comes from the correct chat_id + can only be used with Telegram Class to decorate instance methods. :param command_handler: Telegram CommandHandler :return: decorated function """ @@ -95,13 +103,21 @@ async def wrapper(self, *args, **kwargs): # Reject unauthorized messages if update.callback_query: cchat_id = int(update.callback_query.message.chat.id) + ctopic_id = update.callback_query.message.message_thread_id else: cchat_id = int(update.message.chat_id) + ctopic_id = update.message.message_thread_id chat_id = int(self._config["telegram"]["chat_id"]) if cchat_id != chat_id: - logger.info(f"Rejected unauthorized message from: {update.message.chat_id}") - return wrapper + logger.info(f"Rejected unauthorized message from: {cchat_id}") + return None + if (topic_id := self._config["telegram"].get("topic_id")) is not None: + if str(ctopic_id) != topic_id: + # This can be quite common in multi-topic environments. + logger.debug(f"Rejected message from wrong channel: {cchat_id}, {ctopic_id}") + return None + # Rollback session to avoid getting data stored in a transaction. Trade.rollback() logger.debug("Executing handler: %s for chat_id: %s", command_handler.__name__, chat_id) @@ -146,7 +162,7 @@ def _init_keyboard(self) -> None: Validates the keyboard configuration from telegram config section. """ - self._keyboard: list[list[Union[str, KeyboardButton]]] = [ + self._keyboard: list[list[str | KeyboardButton]] = [ ["/daily", "/profit", "/balance"], ["/status", "/status table", "/performance"], ["/count", "/start", "/stop", "/help"], @@ -284,6 +300,7 @@ def _init(self) -> None: CommandHandler("marketdir", self._changemarketdir), CommandHandler("order", self._order), CommandHandler("list_custom_data", self._list_custom_data), + CommandHandler("tg_info", self._tg_info), ] callbacks = [ CallbackQueryHandler(self._status_table, pattern="update_status_table"), @@ -399,10 +416,10 @@ def _format_entry_msg(self, msg: RPCEntryMsg) -> str: if msg.get("leverage") and msg.get("leverage", 1.0) != 1.0: message += f" ({msg['leverage']:.3g}x)" message += "`\n" - message += f"*Open Rate:* `{round_value(msg['open_rate'], 8)} {msg['quote_currency']}`\n" + message += f"*Open Rate:* `{fmt_coin2(msg['open_rate'], msg['quote_currency'])}`\n" if msg["type"] == RPCMessageType.ENTRY and msg["current_rate"]: message += ( - f"*Current Rate:* `{round_value(msg['current_rate'], 8)} {msg['quote_currency']}`\n" + f"*Current Rate:* `{fmt_coin2(msg['current_rate'], msg['quote_currency'])}`\n" ) profit_fiat_extra = self.__format_profit_fiat(msg, "stake_amount") # type: ignore @@ -467,14 +484,16 @@ def _format_exit_msg(self, msg: RPCExitMsg) -> str: f"*Direction:* `{msg['direction']}" f"{leverage_text}`\n" f"*Amount:* `{round_value(msg['amount'], 8)}`\n" - f"*Open Rate:* `{fmt_coin(msg['open_rate'], msg['quote_currency'])}`\n" + f"*Open Rate:* `{fmt_coin2(msg['open_rate'], msg['quote_currency'])}`\n" ) if msg["type"] == RPCMessageType.EXIT and msg["current_rate"]: - message += f"*Current Rate:* `{fmt_coin(msg['current_rate'], msg['quote_currency'])}`\n" + message += ( + f"*Current Rate:* `{fmt_coin2(msg['current_rate'], msg['quote_currency'])}`\n" + ) if msg["order_rate"]: - message += f"*Exit Rate:* `{fmt_coin(msg['order_rate'], msg['quote_currency'])}`" + message += f"*Exit Rate:* `{fmt_coin2(msg['order_rate'], msg['quote_currency'])}`" elif msg["type"] == RPCMessageType.EXIT_FILL: - message += f"*Exit Rate:* `{fmt_coin(msg['close_rate'], msg['quote_currency'])}`" + message += f"*Exit Rate:* `{fmt_coin2(msg['close_rate'], msg['quote_currency'])}`" if is_sub_trade: stake_amount_fiat = self.__format_profit_fiat(msg, "stake_amount") @@ -499,7 +518,7 @@ def __format_profit_fiat( profit_fiat_extra = f" / {profit_fiat:.3f} {fiat_currency}" return profit_fiat_extra - def compose_message(self, msg: RPCSendMsg) -> Optional[str]: + def compose_message(self, msg: RPCSendMsg) -> str | None: if msg["type"] == RPCMessageType.ENTRY or msg["type"] == RPCMessageType.ENTRY_FILL: message = self._format_entry_msg(msg) @@ -547,21 +566,22 @@ def compose_message(self, msg: RPCSendMsg) -> Optional[str]: return None return message - def send_msg(self, msg: RPCSendMsg) -> None: - """Send a message to telegram channel""" - + def _message_loudness(self, msg: RPCSendMsg) -> str: + """Determine the loudness of the message - on, off or silent""" default_noti = "on" msg_type = msg["type"] noti = "" - if msg["type"] == RPCMessageType.EXIT: + if msg["type"] == RPCMessageType.EXIT or msg["type"] == RPCMessageType.EXIT_FILL: sell_noti = ( self._config["telegram"].get("notification_settings", {}).get(str(msg_type), {}) ) + # For backward compatibility sell still can be string if isinstance(sell_noti, str): noti = sell_noti else: + default_noti = sell_noti.get("*", default_noti) noti = sell_noti.get(str(msg["exit_reason"]), default_noti) else: noti = ( @@ -570,8 +590,14 @@ def send_msg(self, msg: RPCSendMsg) -> None: .get(str(msg_type), default_noti) ) + return noti + + def send_msg(self, msg: RPCSendMsg) -> None: + """Send a message to telegram channel""" + noti = self._message_loudness(msg) + if noti == "off": - logger.info(f"Notification '{msg_type}' not sent.") + logger.info(f"Notification '{msg['type']}' not sent.") # Notification disabled return @@ -832,11 +858,14 @@ async def _status_table(self, update: Update, context: CallbackContext) -> None: :return: None """ fiat_currency = self._config.get("fiat_display_currency", "") - statlist, head, fiat_profit_sum = self._rpc._rpc_status_table( + statlist, head, fiat_profit_sum, fiat_total_profit_sum = self._rpc._rpc_status_table( self._config["stake_currency"], fiat_currency ) show_total = not isnan(fiat_profit_sum) and len(statlist) > 1 + show_total_realized = ( + not isnan(fiat_total_profit_sum) and len(statlist) > 1 and fiat_profit_sum + ) != fiat_total_profit_sum max_trades_per_msg = 50 """ Calculate the number of messages of 50 trades per message @@ -849,12 +878,22 @@ async def _status_table(self, update: Update, context: CallbackContext) -> None: if show_total and i == messages_count - 1: # append total line trades.append(["Total", "", "", f"{fiat_profit_sum:.2f} {fiat_currency}"]) + if show_total_realized: + trades.append( + [ + "Total", + "(incl. realized Profits)", + "", + f"{fiat_total_profit_sum:.2f} {fiat_currency}", + ] + ) message = tabulate(trades, headers=head, tablefmt="simple") if show_total and i == messages_count - 1: # insert separators line between Total lines = message.split("\n") - message = "\n".join(lines[:-1] + [lines[1]] + [lines[-1]]) + offset = 2 if show_total_realized else 1 + message = "\n".join(lines[:-offset] + [lines[1]] + lines[-offset:]) await self._send_msg( f"
{message}
", parse_mode=ParseMode.HTML, @@ -1261,7 +1300,7 @@ async def _force_exit(self, update: Update, context: CallbackContext) -> None: else: fiat_currency = self._config.get("fiat_display_currency", "") try: - statlist, _, _ = self._rpc._rpc_status_table( + statlist, _, _, _ = self._rpc._rpc_status_table( self._config["stake_currency"], fiat_currency ) except RPCException: @@ -1301,7 +1340,7 @@ async def _force_exit_inline(self, update: Update, _: CallbackContext) -> None: await query.answer() await query.edit_message_text(text="Force exit canceled.") return - trade: Optional[Trade] = Trade.get_trades(trade_filter=Trade.id == trade_id).first() + trade: Trade | None = Trade.get_trades(trade_filter=Trade.id == trade_id).first() await query.answer() if trade: await query.edit_message_text( @@ -1311,7 +1350,7 @@ async def _force_exit_inline(self, update: Update, _: CallbackContext) -> None: else: await query.edit_message_text(text=f"Trade {trade_id} not found.") - async def _force_enter_action(self, pair, price: Optional[float], order_side: SignalDirection): + async def _force_enter_action(self, pair, price: float | None, order_side: SignalDirection): if pair != "cancel": try: @@ -1999,10 +2038,10 @@ async def _send_msg( msg: str, parse_mode: str = ParseMode.MARKDOWN, disable_notification: bool = False, - keyboard: Optional[list[list[InlineKeyboardButton]]] = None, + keyboard: list[list[InlineKeyboardButton]] | None = None, callback_path: str = "", reload_able: bool = False, - query: Optional[CallbackQuery] = None, + query: CallbackQuery | None = None, ) -> None: """ Send given markdown message @@ -2011,7 +2050,7 @@ async def _send_msg( :param parse_mode: telegram parse mode :return: None """ - reply_markup: Union[InlineKeyboardMarkup, ReplyKeyboardMarkup] + reply_markup: InlineKeyboardMarkup | ReplyKeyboardMarkup if query: await self._update_msg( query=query, @@ -2038,6 +2077,7 @@ async def _send_msg( parse_mode=parse_mode, reply_markup=reply_markup, disable_notification=disable_notification, + message_thread_id=self._config["telegram"].get("topic_id"), ) except NetworkError as network_err: # Sometimes the telegram server resets the current connection, @@ -2051,6 +2091,7 @@ async def _send_msg( parse_mode=parse_mode, reply_markup=reply_markup, disable_notification=disable_notification, + message_thread_id=self._config["telegram"].get("topic_id"), ) except TelegramError as telegram_err: logger.warning("TelegramError: %s! Giving up on that message.", telegram_err.message) @@ -2096,3 +2137,37 @@ async def _changemarketdir(self, update: Update, context: CallbackContext) -> No "Invalid usage of command /marketdir. \n" "Usage: */marketdir [short | long | even | none]*" ) + + async def _tg_info(self, update: Update, context: CallbackContext) -> None: + """ + Intentionally unauthenticated Handler for /tg_info. + Returns information about the current telegram chat - even if chat_id does not + correspond to this chat. + + :param update: message update + :return: None + """ + if not update.message: + return + chat_id = update.message.chat_id + topic_id = update.message.message_thread_id + + msg = f"""Freqtrade Bot Info: + ```json + {{ + "enabled": true, + "token": "********", + "chat_id": "{chat_id}", + {f'"topic_id": "{topic_id}"' if topic_id else ""} + }} + ``` + """ + try: + await context.bot.send_message( + chat_id=chat_id, + text=msg, + parse_mode=ParseMode.MARKDOWN_V2, + message_thread_id=topic_id, + ) + except TelegramError as telegram_err: + logger.warning("TelegramError: %s! Giving up on that message.", telegram_err.message) diff --git a/freqtrade/rpc/webhook.py b/freqtrade/rpc/webhook.py index 640d5ea63a2..b1a96a8725d 100644 --- a/freqtrade/rpc/webhook.py +++ b/freqtrade/rpc/webhook.py @@ -4,7 +4,7 @@ import logging import time -from typing import Any, Optional +from typing import Any from requests import RequestException, post @@ -44,7 +44,7 @@ def cleanup(self) -> None: """ pass - def _get_value_dict(self, msg: RPCSendMsg) -> Optional[dict[str, Any]]: + def _get_value_dict(self, msg: RPCSendMsg) -> dict[str, Any] | None: whconfig = self._config["webhook"] if msg["type"].value in whconfig: # Explicit types should have priority diff --git a/freqtrade/strategy/hyper.py b/freqtrade/strategy/hyper.py index ffc4abb50ce..6281ab75495 100644 --- a/freqtrade/strategy/hyper.py +++ b/freqtrade/strategy/hyper.py @@ -6,7 +6,7 @@ import logging from collections.abc import Iterator from pathlib import Path -from typing import Any, Optional, Union +from typing import Any from freqtrade.constants import Config from freqtrade.exceptions import OperationalException @@ -39,7 +39,7 @@ def __init__(self, config: Config, *args, **kwargs): # Init/loading of parameters is done as part of ft_bot_start(). def enumerate_parameters( - self, category: Optional[str] = None + self, category: str | None = None ) -> Iterator[tuple[str, BaseParameter]]: """ Find all optimizable parameters and return (name, attr) iterator. @@ -190,7 +190,7 @@ def get_no_optimize_params(self) -> dict[str, dict]: def detect_parameters( - obj: Union[HyperStrategyMixin, type[HyperStrategyMixin]], category: str + obj: HyperStrategyMixin | type[HyperStrategyMixin], category: str ) -> Iterator[tuple[str, BaseParameter]]: """ Detect all parameters for 'category' for "obj" diff --git a/freqtrade/strategy/informative_decorator.py b/freqtrade/strategy/informative_decorator.py index cdb840512f7..69cf6f0ce8a 100644 --- a/freqtrade/strategy/informative_decorator.py +++ b/freqtrade/strategy/informative_decorator.py @@ -1,5 +1,6 @@ +from collections.abc import Callable from dataclasses import dataclass -from typing import Any, Callable, Optional, Union +from typing import Any from pandas import DataFrame @@ -13,19 +14,19 @@ @dataclass class InformativeData: - asset: Optional[str] + asset: str | None timeframe: str - fmt: Union[str, Callable[[Any], str], None] + fmt: str | Callable[[Any], str] | None ffill: bool - candle_type: Optional[CandleType] + candle_type: CandleType | None def informative( timeframe: str, asset: str = "", - fmt: Optional[Union[str, Callable[[Any], str]]] = None, + fmt: str | Callable[[Any], str] | None = None, *, - candle_type: Optional[Union[CandleType, str]] = None, + candle_type: CandleType | str | None = None, ffill: bool = True, ) -> Callable[[PopulateIndicators], PopulateIndicators]: """ @@ -73,7 +74,7 @@ def decorator(fn: PopulateIndicators): return decorator -def __get_pair_formats(market: Optional[dict[str, Any]]) -> dict[str, str]: +def __get_pair_formats(market: dict[str, Any] | None) -> dict[str, str]: if not market: return {} base = market["base"] @@ -86,7 +87,7 @@ def __get_pair_formats(market: Optional[dict[str, Any]]) -> dict[str, str]: } -def _format_pair_name(config, pair: str, market: Optional[dict[str, Any]] = None) -> str: +def _format_pair_name(config, pair: str, market: dict[str, Any] | None = None) -> str: return pair.format( stake_currency=config["stake_currency"], stake=config["stake_currency"], diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index a4bb007f18b..73d3acfa957 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -5,10 +5,8 @@ import logging from abc import ABC, abstractmethod -from collections import OrderedDict from datetime import datetime, timedelta, timezone from math import isinf, isnan -from typing import Optional, Union from pandas import DataFrame @@ -75,7 +73,7 @@ class IStrategy(ABC, HyperStrategyMixin): # trailing stoploss trailing_stop: bool = False - trailing_stop_positive: Optional[float] = None + trailing_stop_positive: float | None = None trailing_stop_positive_offset: float = 0.0 trailing_only_offset_is_reached = False use_custom_stoploss: bool = False @@ -129,7 +127,7 @@ class IStrategy(ABC, HyperStrategyMixin): # the dataprovider (dp) (access to other candles, historic data, ...) # and wallets - access to the current balance. dp: DataProvider - wallets: Optional[Wallets] = None + wallets: Wallets | None = None # Filled from configuration stake_currency: str # container variable for strategy source code @@ -142,9 +140,7 @@ class IStrategy(ABC, HyperStrategyMixin): market_direction: MarketDirection = MarketDirection.NONE # Global cache dictionary - _cached_grouped_trades_per_pair: dict[ - str, OrderedDict[tuple[datetime, datetime], DataFrame] - ] = {} + _cached_grouped_trades_per_pair: dict[str, DataFrame] = {} def __init__(self, config: Config) -> None: self.config = config @@ -355,7 +351,7 @@ def confirm_trade_entry( rate: float, time_in_force: str, current_time: datetime, - entry_tag: Optional[str], + entry_tag: str | None, side: str, **kwargs, ) -> bool: @@ -444,7 +440,7 @@ def custom_stoploss( current_profit: float, after_fill: bool, **kwargs, - ) -> Optional[float]: + ) -> float | None: """ Custom stoploss logic, returning the new distance relative to current_rate (as ratio). e.g. returning -0.05 would create a stoploss 5% below current_rate. @@ -469,10 +465,10 @@ def custom_stoploss( def custom_entry_price( self, pair: str, - trade: Optional[Trade], + trade: Trade | None, current_time: datetime, proposed_rate: float, - entry_tag: Optional[str], + entry_tag: str | None, side: str, **kwargs, ) -> float: @@ -501,7 +497,7 @@ def custom_exit_price( current_time: datetime, proposed_rate: float, current_profit: float, - exit_tag: Optional[str], + exit_tag: str | None, **kwargs, ) -> float: """ @@ -530,7 +526,7 @@ def custom_sell( current_rate: float, current_profit: float, **kwargs, - ) -> Optional[Union[str, bool]]: + ) -> str | bool | None: """ DEPRECATED - please use custom_exit instead. Custom exit signal logic indicating that specified position should be sold. Returning a @@ -562,7 +558,7 @@ def custom_exit( current_rate: float, current_profit: float, **kwargs, - ) -> Optional[Union[str, bool]]: + ) -> str | bool | None: """ Custom exit signal logic indicating that specified position should be sold. Returning a string or True from this method is equal to setting exit signal on a candle at specified @@ -591,10 +587,10 @@ def custom_stake_amount( current_time: datetime, current_rate: float, proposed_stake: float, - min_stake: Optional[float], + min_stake: float | None, max_stake: float, leverage: float, - entry_tag: Optional[str], + entry_tag: str | None, side: str, **kwargs, ) -> float: @@ -620,14 +616,14 @@ def adjust_trade_position( current_time: datetime, current_rate: float, current_profit: float, - min_stake: Optional[float], + min_stake: float | None, max_stake: float, current_entry_rate: float, current_exit_rate: float, current_entry_profit: float, current_exit_profit: float, **kwargs, - ) -> Union[Optional[float], tuple[Optional[float], Optional[str]]]: + ) -> float | None | tuple[float | None, str | None]: """ Custom trade adjustment logic, returning the stake amount that a trade should be increased or decreased. @@ -660,12 +656,12 @@ def adjust_trade_position( def adjust_entry_price( self, trade: Trade, - order: Optional[Order], + order: Order | None, pair: str, current_time: datetime, proposed_rate: float, current_order_rate: float, - entry_tag: Optional[str], + entry_tag: str | None, side: str, **kwargs, ) -> float: @@ -701,7 +697,7 @@ def leverage( current_rate: float, proposed_leverage: float, max_leverage: float, - entry_tag: Optional[str], + entry_tag: str | None, side: str, **kwargs, ) -> float: @@ -732,7 +728,7 @@ def informative_pairs(self) -> ListPairsWithTimeframes: """ return [] - def version(self) -> Optional[str]: + def version(self) -> str | None: """ Returns version of the strategy. """ @@ -743,7 +739,7 @@ def populate_any_indicators( pair: str, df: DataFrame, tf: str, - informative: Optional[DataFrame] = None, + informative: DataFrame | None = None, set_generalized_indicators: bool = False, ) -> DataFrame: """ @@ -873,14 +869,14 @@ def _adjust_trade_position_internal( current_time: datetime, current_rate: float, current_profit: float, - min_stake: Optional[float], + min_stake: float | None, max_stake: float, current_entry_rate: float, current_exit_rate: float, current_entry_profit: float, current_exit_profit: float, **kwargs, - ) -> tuple[Optional[float], str]: + ) -> tuple[float | None, str]: """ wrapper around adjust_trade_position to handle the return value """ @@ -980,7 +976,7 @@ def get_strategy_name(self) -> str: return self.__class__.__name__ def lock_pair( - self, pair: str, until: datetime, reason: Optional[str] = None, side: str = "*" + self, pair: str, until: datetime, reason: str | None = None, side: str = "*" ) -> None: """ Locks pair until a given timestamp happens. @@ -1014,7 +1010,7 @@ def unlock_reason(self, reason: str) -> None: PairLocks.unlock_reason(reason, datetime.now(timezone.utc)) def is_pair_locked( - self, pair: str, *, candle_date: Optional[datetime] = None, side: str = "*" + self, pair: str, *, candle_date: datetime | None = None, side: str = "*" ) -> bool: """ Checks if a pair is currently locked @@ -1150,7 +1146,7 @@ def get_latest_candle( pair: str, timeframe: str, dataframe: DataFrame, - ) -> tuple[Optional[DataFrame], Optional[datetime]]: + ) -> tuple[DataFrame | None, datetime | None]: """ Calculates current signal based based on the entry order or exit order columns of the dataframe. @@ -1164,10 +1160,10 @@ def get_latest_candle( logger.warning(f"Empty candle (OHLCV) data for pair {pair}") return None, None - latest_date = dataframe["date"].max() - latest = dataframe.loc[dataframe["date"] == latest_date].iloc[-1] + latest_date_pd = dataframe["date"].max() + latest = dataframe.loc[dataframe["date"] == latest_date_pd].iloc[-1] # Explicitly convert to datetime object to ensure the below comparison does not fail - latest_date = latest_date.to_pydatetime() + latest_date: datetime = latest_date_pd.to_pydatetime() # Check if dataframe is out of date timeframe_minutes = timeframe_to_minutes(timeframe) @@ -1182,8 +1178,8 @@ def get_latest_candle( return latest, latest_date def get_exit_signal( - self, pair: str, timeframe: str, dataframe: DataFrame, is_short: Optional[bool] = None - ) -> tuple[bool, bool, Optional[str]]: + self, pair: str, timeframe: str, dataframe: DataFrame, is_short: bool | None = None + ) -> tuple[bool, bool, str | None]: """ Calculates current exit signal based based on the dataframe columns of the dataframe. @@ -1219,7 +1215,7 @@ def get_entry_signal( pair: str, timeframe: str, dataframe: DataFrame, - ) -> tuple[Optional[SignalDirection], Optional[str]]: + ) -> tuple[SignalDirection | None, str | None]: """ Calculates current entry signal based based on the dataframe signals columns of the dataframe. @@ -1238,8 +1234,8 @@ def get_entry_signal( enter_short = latest.get(SignalType.ENTER_SHORT.value, 0) == 1 exit_short = latest.get(SignalType.EXIT_SHORT.value, 0) == 1 - enter_signal: Optional[SignalDirection] = None - enter_tag: Optional[str] = None + enter_signal: SignalDirection | None = None + enter_tag: str | None = None if enter_long == 1 and not any([exit_long, enter_short]): enter_signal = SignalDirection.LONG enter_tag = latest.get(SignalTagType.ENTER_TAG.value, None) @@ -1287,8 +1283,8 @@ def should_exit( *, enter: bool, exit_: bool, - low: Optional[float] = None, - high: Optional[float] = None, + low: float | None = None, + high: float | None = None, force_stoploss: float = 0, ) -> list[ExitCheckTuple]: """ @@ -1390,8 +1386,8 @@ def ft_stoploss_adjust( current_time: datetime, current_profit: float, force_stoploss: float, - low: Optional[float] = None, - high: Optional[float] = None, + low: float | None = None, + high: float | None = None, after_fill: bool = False, ) -> None: """ @@ -1464,8 +1460,8 @@ def ft_stoploss_reached( current_time: datetime, current_profit: float, force_stoploss: float, - low: Optional[float] = None, - high: Optional[float] = None, + low: float | None = None, + high: float | None = None, ) -> ExitCheckTuple: """ Based on current profit of the trade and configured (trailing) stoploss, @@ -1518,7 +1514,7 @@ def ft_stoploss_reached( return ExitCheckTuple(exit_type=ExitType.NONE) - def min_roi_reached_entry(self, trade_dur: int) -> tuple[Optional[int], Optional[float]]: + def min_roi_reached_entry(self, trade_dur: int) -> tuple[int | None, float | None]: """ Based on trade duration defines the ROI entry that may have been reached. :param trade_dur: trade duration in minutes @@ -1605,15 +1601,11 @@ def _if_enabled_populate_trades(self, dataframe: DataFrame, metadata: dict): if use_public_trades: trades = self.dp.trades(pair=metadata["pair"], copy=False) - config = self.config - config["timeframe"] = self.timeframe pair = metadata["pair"] # TODO: slice trades to size of dataframe for faster backtesting - cached_grouped_trades: OrderedDict[tuple[datetime, datetime], DataFrame] = ( - self._cached_grouped_trades_per_pair.get(pair, OrderedDict()) - ) + cached_grouped_trades: DataFrame | None = self._cached_grouped_trades_per_pair.get(pair) dataframe, cached_grouped_trades = populate_dataframe_with_trades( - cached_grouped_trades, config, dataframe, trades + cached_grouped_trades, self.config, dataframe, trades ) # dereference old cache diff --git a/freqtrade/strategy/parameters.py b/freqtrade/strategy/parameters.py index 82e93066773..282e630d0e9 100644 --- a/freqtrade/strategy/parameters.py +++ b/freqtrade/strategy/parameters.py @@ -7,7 +7,7 @@ from abc import ABC, abstractmethod from collections.abc import Sequence from contextlib import suppress -from typing import Any, Optional, Union +from typing import Any, Union from freqtrade.enums import HyperoptState from freqtrade.optimize.hyperopt_tools import HyperoptStateContainer @@ -29,7 +29,7 @@ class BaseParameter(ABC): Defines a parameter that can be optimized by hyperopt. """ - category: Optional[str] + category: str | None default: Any value: Any in_space: bool = False @@ -39,7 +39,7 @@ def __init__( self, *, default: Any, - space: Optional[str] = None, + space: str | None = None, optimize: bool = True, load: bool = True, **kwargs, @@ -83,17 +83,17 @@ def can_optimize(self): class NumericParameter(BaseParameter): """Internal parameter used for Numeric purposes""" - float_or_int = Union[int, float] + float_or_int = int | float default: float_or_int value: float_or_int def __init__( self, - low: Union[float_or_int, Sequence[float_or_int]], - high: Optional[float_or_int] = None, + low: float_or_int | Sequence[float_or_int], + high: float_or_int | None = None, *, default: float_or_int, - space: Optional[str] = None, + space: str | None = None, optimize: bool = True, load: bool = True, **kwargs, @@ -132,11 +132,11 @@ class IntParameter(NumericParameter): def __init__( self, - low: Union[int, Sequence[int]], - high: Optional[int] = None, + low: int | Sequence[int], + high: int | None = None, *, default: int, - space: Optional[str] = None, + space: str | None = None, optimize: bool = True, load: bool = True, **kwargs, @@ -186,11 +186,11 @@ class RealParameter(NumericParameter): def __init__( self, - low: Union[float, Sequence[float]], - high: Optional[float] = None, + low: float | Sequence[float], + high: float | None = None, *, default: float, - space: Optional[str] = None, + space: str | None = None, optimize: bool = True, load: bool = True, **kwargs, @@ -225,12 +225,12 @@ class DecimalParameter(NumericParameter): def __init__( self, - low: Union[float, Sequence[float]], - high: Optional[float] = None, + low: float | Sequence[float], + high: float | None = None, *, default: float, decimals: int = 3, - space: Optional[str] = None, + space: str | None = None, optimize: bool = True, load: bool = True, **kwargs, @@ -289,8 +289,8 @@ def __init__( self, categories: Sequence[Any], *, - default: Optional[Any] = None, - space: Optional[str] = None, + default: Any | None = None, + space: str | None = None, optimize: bool = True, load: bool = True, **kwargs, @@ -339,8 +339,8 @@ class BooleanParameter(CategoricalParameter): def __init__( self, *, - default: Optional[Any] = None, - space: Optional[str] = None, + default: Any | None = None, + space: str | None = None, optimize: bool = True, load: bool = True, **kwargs, diff --git a/freqtrade/strategy/strategy_helper.py b/freqtrade/strategy/strategy_helper.py index 1a91629d931..71dcc3cbffd 100644 --- a/freqtrade/strategy/strategy_helper.py +++ b/freqtrade/strategy/strategy_helper.py @@ -1,5 +1,3 @@ -from typing import Optional - import pandas as pd from freqtrade.exchange import timeframe_to_minutes @@ -13,7 +11,7 @@ def merge_informative_pair( ffill: bool = True, append_timeframe: bool = True, date_column: str = "date", - suffix: Optional[str] = None, + suffix: str | None = None, ) -> pd.DataFrame: """ Correctly merge informative samples to the original dataframe, avoiding lookahead bias. diff --git a/freqtrade/strategy/strategy_wrapper.py b/freqtrade/strategy/strategy_wrapper.py index a6f74f1c0c7..9250f54cd63 100644 --- a/freqtrade/strategy/strategy_wrapper.py +++ b/freqtrade/strategy/strategy_wrapper.py @@ -1,7 +1,8 @@ import logging +from collections.abc import Callable from copy import deepcopy from functools import wraps -from typing import Any, Callable, TypeVar, cast +from typing import Any, TypeVar, cast from freqtrade.exceptions import StrategyError diff --git a/freqtrade/templates/strategy_analysis_example.ipynb b/freqtrade/templates/strategy_analysis_example.ipynb index e81ff72caef..c81a76f7206 100644 --- a/freqtrade/templates/strategy_analysis_example.ipynb +++ b/freqtrade/templates/strategy_analysis_example.ipynb @@ -216,7 +216,7 @@ "# Get market change (average change of all pairs from start to end of the backtest period)\n", "print(stats[\"strategy\"][strategy][\"market_change\"])\n", "# Maximum drawdown ()\n", - "print(stats[\"strategy\"][strategy][\"max_drawdown\"])\n", + "print(stats[\"strategy\"][strategy][\"max_drawdown_abs\"])\n", "# Maximum drawdown start and end\n", "print(stats[\"strategy\"][strategy][\"drawdown_start\"])\n", "print(stats[\"strategy\"][strategy][\"drawdown_end\"])\n", @@ -305,7 +305,7 @@ "metadata": {}, "source": [ "## Analyze the loaded trades for trade parallelism\n", - "This can be useful to find the best `max_open_trades` parameter, when used with backtesting in conjunction with `--disable-max-market-positions`.\n", + "This can be useful to find the best `max_open_trades` parameter, when used with backtesting in conjunction with a very high `max_open_trades` setting.\n", "\n", "`analyze_trade_parallelism()` returns a timeseries dataframe with an \"open_trades\" column, specifying the number of open trades for each candle." ] diff --git a/freqtrade/templates/strategy_subtemplates/strategy_methods_advanced.j2 b/freqtrade/templates/strategy_subtemplates/strategy_methods_advanced.j2 index 07b72610a92..84d7f40c861 100644 --- a/freqtrade/templates/strategy_subtemplates/strategy_methods_advanced.j2 +++ b/freqtrade/templates/strategy_subtemplates/strategy_methods_advanced.j2 @@ -13,9 +13,16 @@ def bot_loop_start(self, current_time: datetime, **kwargs) -> None: """ pass -def custom_entry_price(self, pair: str, trade: Optional[Trade], - current_time: datetime, proposed_rate: float, - entry_tag: Optional[str], side: str, **kwargs) -> float: +def custom_entry_price( + self, + pair: str, + trade: Trade | None, + current_time: datetime, + proposed_rate: float, + entry_tag: str | None, + side: str, + **kwargs, +) -> float: """ Custom entry price logic, returning the new entry price. @@ -33,9 +40,18 @@ def custom_entry_price(self, pair: str, trade: Optional[Trade], """ return proposed_rate -def adjust_entry_price(self, trade: Trade, order: Optional[Order], pair: str, - current_time: datetime, proposed_rate: float, current_order_rate: float, - entry_tag: Optional[str], side: str, **kwargs) -> float: +def adjust_entry_price( + self, + trade: Trade, + order: Order | None, + pair: str, + current_time: datetime, + proposed_rate: float, + current_order_rate: float, + entry_tag: str | None, + side: str, + **kwargs, +) -> float: """ Entry price re-adjustment logic, returning the user desired limit price. This only executes when a order was already placed, still open (unfilled fully or partially) @@ -61,9 +77,16 @@ def adjust_entry_price(self, trade: Trade, order: Optional[Order], pair: str, """ return current_order_rate -def custom_exit_price(self, pair: str, trade: Trade, - current_time: datetime, proposed_rate: float, - current_profit: float, exit_tag: Optional[str], **kwargs) -> float: +def custom_exit_price( + self, + pair: str, + trade: Trade, + current_time: datetime, + proposed_rate: float, + current_profit: float, + exit_tag: str | None, + **kwargs, +) -> float: """ Custom exit price logic, returning the new exit price. @@ -82,10 +105,19 @@ def custom_exit_price(self, pair: str, trade: Trade, """ return proposed_rate -def custom_stake_amount(self, pair: str, current_time: datetime, current_rate: float, - proposed_stake: float, min_stake: Optional[float], max_stake: float, - leverage: float, entry_tag: Optional[str], side: str, - **kwargs) -> float: +def custom_stake_amount( + self, + pair: str, + current_time: datetime, + current_rate: float, + proposed_stake: float, + min_stake: float | None, + max_stake: float, + leverage: float, + entry_tag: str | None, + side: str, + **kwargs, +) -> float: """ Customize stake size for each new trade. @@ -104,8 +136,16 @@ def custom_stake_amount(self, pair: str, current_time: datetime, current_rate: f use_custom_stoploss = True -def custom_stoploss(self, pair: str, trade: Trade, current_time: datetime, current_rate: float, - current_profit: float, after_fill: bool, **kwargs) -> float: +def custom_stoploss( + self, + pair: str, + trade: Trade, + current_time: datetime, + current_rate: float, + current_profit: float, + after_fill: bool, + **kwargs, +) -> float | None: """ Custom stoploss logic, returning the new distance relative to current_rate (as ratio). e.g. returning -0.05 would create a stoploss 5% below current_rate. @@ -126,8 +166,15 @@ def custom_stoploss(self, pair: str, trade: Trade, current_time: datetime, curre :return float: New stoploss value, relative to the current_rate """ -def custom_exit(self, pair: str, trade: Trade, current_time: datetime, current_rate: float, - current_profit: float, **kwargs) -> Optional[Union[str, bool]]: +def custom_exit( + self, + pair: str, + trade: Trade, + current_time: datetime, + current_rate: float, + current_profit: float, + **kwargs, +) -> str | bool | None: """ Custom exit signal logic indicating that specified position should be sold. Returning a string or True from this method is equal to setting sell signal on a candle at specified @@ -150,9 +197,18 @@ def custom_exit(self, pair: str, trade: Trade, current_time: datetime, current_r """ return None -def confirm_trade_entry(self, pair: str, order_type: str, amount: float, rate: float, - time_in_force: str, current_time: datetime, entry_tag: Optional[str], - side: str, **kwargs) -> bool: +def confirm_trade_entry( + self, + pair: str, + order_type: str, + amount: float, + rate: float, + time_in_force: str, + current_time: datetime, + entry_tag: str | None, + side: str, + **kwargs, +) -> bool: """ Called right before placing a entry order. Timing for this function is critical, so avoid doing heavy computations or @@ -177,9 +233,18 @@ def confirm_trade_entry(self, pair: str, order_type: str, amount: float, rate: f """ return True -def confirm_trade_exit(self, pair: str, trade: Trade, order_type: str, amount: float, - rate: float, time_in_force: str, exit_reason: str, - current_time: datetime, **kwargs) -> bool: +def confirm_trade_exit( + self, + pair: str, + trade: Trade, + order_type: str, + amount: float, + rate: float, + time_in_force: str, + exit_reason: str, + current_time: datetime, + **kwargs, +) -> bool: """ Called right before placing a regular exit order. Timing for this function is critical, so avoid doing heavy computations or @@ -206,8 +271,9 @@ def confirm_trade_exit(self, pair: str, trade: Trade, order_type: str, amount: f """ return True -def check_entry_timeout(self, pair: str, trade: Trade, order: Order, - current_time: datetime, **kwargs) -> bool: +def check_entry_timeout( + self, pair: str, trade: Trade, order: Order, current_time: datetime, **kwargs +) -> bool: """ Check entry timeout function callback. This method can be used to override the entry-timeout. @@ -228,8 +294,9 @@ def check_entry_timeout(self, pair: str, trade: Trade, order: Order, """ return False -def check_exit_timeout(self, pair: str, trade: Trade, order: Order, - current_time: datetime, **kwargs) -> bool: +def check_exit_timeout( + self, pair: str, trade: Trade, order: Order, current_time: datetime, **kwargs +) -> bool: """ Check exit timeout function callback. This method can be used to override the exit-timeout. @@ -250,12 +317,20 @@ def check_exit_timeout(self, pair: str, trade: Trade, order: Order, """ return False -def adjust_trade_position(self, trade: Trade, current_time: datetime, - current_rate: float, current_profit: float, - min_stake: Optional[float], max_stake: float, - current_entry_rate: float, current_exit_rate: float, - current_entry_profit: float, current_exit_profit: float, - **kwargs) -> Optional[float]: +def adjust_trade_position( + self, + trade: Trade, + current_time: datetime, + current_rate: float, + current_profit: float, + min_stake: float | None, + max_stake: float, + current_entry_rate: float, + current_exit_rate: float, + current_entry_profit: float, + current_exit_profit: float, + **kwargs, +) -> float | None | tuple[float | None, str | None]: """ Custom trade adjustment logic, returning the stake amount that a trade should be increased or decreased. @@ -284,9 +359,17 @@ def adjust_trade_position(self, trade: Trade, current_time: datetime, """ return None -def leverage(self, pair: str, current_time: datetime, current_rate: float, - proposed_leverage: float, max_leverage: float, entry_tag: Optional[str], - side: str, **kwargs) -> float: +def leverage( + self, + pair: str, + current_time: datetime, + current_rate: float, + proposed_leverage: float, + max_leverage: float, + entry_tag: str | None, + side: str, + **kwargs, +) -> float: """ Customize leverage for each new trade. This method is only called in futures mode. @@ -302,8 +385,9 @@ def leverage(self, pair: str, current_time: datetime, current_rate: float, return 1.0 -def order_filled(self, pair: str, trade: Trade, order: Order, - current_time: datetime, **kwargs) -> None: +def order_filled( + self, pair: str, trade: Trade, order: Order, current_time: datetime, **kwargs +) -> None: """ Called right after an order fills. Will be called for all order types (entry, exit, stoploss, position adjustment). diff --git a/freqtrade/util/__init__.py b/freqtrade/util/__init__.py index 8343790a02f..a0b618b11f7 100644 --- a/freqtrade/util/__init__.py +++ b/freqtrade/util/__init__.py @@ -11,11 +11,15 @@ format_ms_time, shorten_date, ) -from freqtrade.util.formatters import decimals_per_coin, fmt_coin, round_value +from freqtrade.util.dry_run_wallet import get_dry_run_wallet +from freqtrade.util.formatters import decimals_per_coin, fmt_coin, fmt_coin2, round_value from freqtrade.util.ft_precise import FtPrecise from freqtrade.util.measure_time import MeasureTime from freqtrade.util.periodic_cache import PeriodicCache -from freqtrade.util.progress_tracker import get_progress_tracker # noqa F401 +from freqtrade.util.progress_tracker import ( # noqa F401 + get_progress_tracker, + retrieve_progress_tracker, +) from freqtrade.util.rich_progress import CustomProgress from freqtrade.util.rich_tables import print_df_rich_table, print_rich_table from freqtrade.util.template_renderer import render_template, render_template_with_fallback # noqa @@ -32,12 +36,14 @@ "dt_utc", "format_date", "format_ms_time", + "get_dry_run_wallet", "FtPrecise", "PeriodicCache", "shorten_date", "decimals_per_coin", "round_value", "fmt_coin", + "fmt_coin2", "MeasureTime", "print_rich_table", "print_df_rich_table", diff --git a/freqtrade/util/coin_gecko.py b/freqtrade/util/coin_gecko.py index 47b80875bc9..515e9654f66 100644 --- a/freqtrade/util/coin_gecko.py +++ b/freqtrade/util/coin_gecko.py @@ -4,23 +4,10 @@ class FtCoinGeckoApi(CoinGeckoAPI): """ Simple wrapper around pycoingecko's api to support Demo API keys. - """ - __API_URL_BASE = "https://api.coingecko.com/api/v3/" - __PRO_API_URL_BASE = "https://pro-api.coingecko.com/api/v3/" - _api_key: str = "" - def __init__(self, api_key: str = "", *, is_demo=True, retries=5): - super().__init__(retries=retries) - # Doint' pass api_key to parent, instead set the header on the session directly - self._api_key = api_key - - if api_key and not is_demo: - self.api_base_url = self.__PRO_API_URL_BASE - self.session.params.update({"x_cg_pro_api_key": api_key}) + if api_key and is_demo: + super().__init__(retries=retries, demo_api_key=api_key) else: - # Use demo api key - self.api_base_url = self.__API_URL_BASE - if api_key: - self.session.params.update({"x_cg_demo_api_key": api_key}) + super().__init__(api_key=api_key, retries=retries) diff --git a/freqtrade/util/datetime_helpers.py b/freqtrade/util/datetime_helpers.py index 3ab20efb758..25577984901 100644 --- a/freqtrade/util/datetime_helpers.py +++ b/freqtrade/util/datetime_helpers.py @@ -1,7 +1,6 @@ import re from datetime import datetime, timezone from time import time -from typing import Optional, Union import humanize @@ -26,7 +25,7 @@ def dt_utc( return datetime(year, month, day, hour, minute, second, microsecond, tzinfo=timezone.utc) -def dt_ts(dt: Optional[datetime] = None) -> int: +def dt_ts(dt: datetime | None = None) -> int: """ Return dt in ms as a timestamp in UTC. If dt is None, return the current datetime in UTC. @@ -36,7 +35,7 @@ def dt_ts(dt: Optional[datetime] = None) -> int: return int(time() * 1000) -def dt_ts_def(dt: Optional[datetime], default: int = 0) -> int: +def dt_ts_def(dt: datetime | None, default: int = 0) -> int: """ Return dt in ms as a timestamp in UTC. If dt is None, return the given default. @@ -46,7 +45,7 @@ def dt_ts_def(dt: Optional[datetime], default: int = 0) -> int: return default -def dt_ts_none(dt: Optional[datetime]) -> Optional[int]: +def dt_ts_none(dt: datetime | None) -> int | None: """ Return dt in ms as a timestamp in UTC. If dt is None, return the given default. @@ -91,7 +90,7 @@ def dt_humanize_delta(dt: datetime): return humanize.naturaltime(dt) -def format_date(date: Optional[datetime]) -> str: +def format_date(date: datetime | None) -> str: """ Return a formatted date string. Returns an empty string if date is None. @@ -102,7 +101,7 @@ def format_date(date: Optional[datetime]) -> str: return "" -def format_ms_time(date: Union[int, float]) -> str: +def format_ms_time(date: int | float) -> str: """ convert MS date to readable format. : epoch-string in ms diff --git a/freqtrade/util/dry_run_wallet.py b/freqtrade/util/dry_run_wallet.py new file mode 100644 index 00000000000..c904db6b397 --- /dev/null +++ b/freqtrade/util/dry_run_wallet.py @@ -0,0 +1,12 @@ +from freqtrade.constants import Config + + +def get_dry_run_wallet(config: Config) -> int | float: + """ + Return dry-run wallet balance in stake currency from configuration. + This setup also supports dictionary mode for dry-run-wallet. + """ + if isinstance(_start_cap := config["dry_run_wallet"], float | int): + return _start_cap + else: + return _start_cap.get("stake_currency") diff --git a/freqtrade/util/formatters.py b/freqtrade/util/formatters.py index a649b671e08..82ac1cf66db 100644 --- a/freqtrade/util/formatters.py +++ b/freqtrade/util/formatters.py @@ -47,3 +47,22 @@ def fmt_coin(value: float, coin: str, show_coin_name=True, keep_trailing_zeros=F val = f"{val} {coin}" return val + + +def fmt_coin2( + value: float, coin: str, decimals: int = 8, *, show_coin_name=True, keep_trailing_zeros=False +) -> str: + """ + Format price value for this coin. Should be preferred for rate formatting + :param value: Value to be printed + :param coin: Which coin are we printing the price / value for + :param decimals: Number of decimals to round to + :param show_coin_name: Return string in format: "222.22 USDT" or "222.22" + :param keep_trailing_zeros: Keep trailing zeros "222.200" vs. "222.2" + :return: Formatted / rounded value (with or without coin name) + """ + val = round_value(value, decimals, keep_trailing_zeros) + if show_coin_name: + val = f"{val} {coin}" + + return val diff --git a/freqtrade/util/measure_time.py b/freqtrade/util/measure_time.py index 9ce8dba16a5..baa94f0627c 100644 --- a/freqtrade/util/measure_time.py +++ b/freqtrade/util/measure_time.py @@ -1,6 +1,6 @@ import logging import time -from typing import Callable +from collections.abc import Callable from cachetools import TTLCache diff --git a/freqtrade/util/migrations/__init__.py b/freqtrade/util/migrations/__init__.py index d8c7dfad358..4e81b1c5774 100644 --- a/freqtrade/util/migrations/__init__.py +++ b/freqtrade/util/migrations/__init__.py @@ -1,11 +1,9 @@ -from typing import Optional - from freqtrade.exchange import Exchange from freqtrade.util.migrations.binance_mig import migrate_binance_futures_data from freqtrade.util.migrations.funding_rate_mig import migrate_funding_fee_timeframe -def migrate_data(config, exchange: Optional[Exchange] = None): +def migrate_data(config, exchange: Exchange | None = None): migrate_binance_futures_data(config) migrate_funding_fee_timeframe(config, exchange) diff --git a/freqtrade/util/migrations/funding_rate_mig.py b/freqtrade/util/migrations/funding_rate_mig.py index e53ec339ee5..060a5a1b661 100644 --- a/freqtrade/util/migrations/funding_rate_mig.py +++ b/freqtrade/util/migrations/funding_rate_mig.py @@ -1,5 +1,4 @@ import logging -from typing import Optional from freqtrade.constants import Config from freqtrade.enums import TradingMode @@ -9,7 +8,7 @@ logger = logging.getLogger(__name__) -def migrate_funding_fee_timeframe(config: Config, exchange: Optional[Exchange]): +def migrate_funding_fee_timeframe(config: Config, exchange: Exchange | None): from freqtrade.data.history import get_datahandler if config.get("trading_mode", TradingMode.SPOT) != TradingMode.FUTURES: diff --git a/freqtrade/util/progress_tracker.py b/freqtrade/util/progress_tracker.py index ca8f5d3e921..3f46e0b82de 100644 --- a/freqtrade/util/progress_tracker.py +++ b/freqtrade/util/progress_tracker.py @@ -10,7 +10,13 @@ from freqtrade.util.rich_progress import CustomProgress -def get_progress_tracker(**kwargs): +def retrieve_progress_tracker(pt: CustomProgress | None) -> CustomProgress: + if pt is None: + return get_progress_tracker() + return pt + + +def get_progress_tracker(**kwargs) -> CustomProgress: """ Get progress Bar with custom columns. """ diff --git a/freqtrade/util/rich_progress.py b/freqtrade/util/rich_progress.py index ef06e7f46e9..96d629819f3 100644 --- a/freqtrade/util/rich_progress.py +++ b/freqtrade/util/rich_progress.py @@ -1,23 +1,56 @@ -from typing import Callable, Optional, Union +from collections.abc import Callable +from typing import Any from rich.console import ConsoleRenderable, Group, RichCast -from rich.progress import Progress +from rich.progress import Progress, Task, TaskID class CustomProgress(Progress): def __init__( self, *args, - cust_objs: Optional[list[ConsoleRenderable]] = None, - cust_callables: Optional[list[Callable[[], ConsoleRenderable]]] = None, + cust_objs: list[ConsoleRenderable] | None = None, + cust_callables: list[Callable[[], ConsoleRenderable]] | None = None, + ft_callback: Callable[[Task], None] | None = None, **kwargs, ) -> None: self._cust_objs = cust_objs or [] self._cust_callables = cust_callables or [] + self._ft_callback = ft_callback + if self._ft_callback: + kwargs["disable"] = True super().__init__(*args, **kwargs) - def get_renderable(self) -> Union[ConsoleRenderable, RichCast, str]: + def update( + self, + task_id: TaskID, + *, + total: float | None = None, + completed: float | None = None, + advance: float | None = None, + description: str | None = None, + visible: bool | None = None, + refresh: bool = False, + **fields: Any, + ) -> None: + t = super().update( + task_id, + total=total, + completed=completed, + advance=advance, + description=description, + visible=visible, + refresh=refresh, + **fields, + ) + if self._ft_callback: + self._ft_callback( + self.tasks[task_id], + ) + return t + + def get_renderable(self) -> ConsoleRenderable | RichCast | str: objs = [obj for obj in self._cust_objs] for cust_call in self._cust_callables: objs.append(cust_call()) diff --git a/freqtrade/util/rich_tables.py b/freqtrade/util/rich_tables.py index 54f941c5813..ba232ed7546 100644 --- a/freqtrade/util/rich_tables.py +++ b/freqtrade/util/rich_tables.py @@ -1,6 +1,6 @@ import sys from collections.abc import Sequence -from typing import Any, Optional, Union +from typing import Any, TypeAlias from pandas import DataFrame from rich.console import Console @@ -8,16 +8,16 @@ from rich.text import Text -TextOrString = Union[str, Text] +TextOrString: TypeAlias = str | Text def print_rich_table( - tabular_data: Sequence[Union[dict[str, Any], Sequence[TextOrString]]], + tabular_data: Sequence[dict[str, Any] | Sequence[TextOrString]], headers: Sequence[str], - summary: Optional[str] = None, + summary: str | None = None, *, justify="right", - table_kwargs: Optional[dict[str, Any]] = None, + table_kwargs: dict[str, Any] | None = None, ) -> None: table = Table( *[c if isinstance(c, Column) else Column(c, justify=justify) for c in headers], @@ -35,7 +35,7 @@ def print_rich_table( ) else: - row_to_add: list[Union[str, Text]] = [r if isinstance(r, Text) else str(r) for r in row] + row_to_add: list[str | Text] = [r if isinstance(r, Text) else str(r) for r in row] table.add_row(*row_to_add) width = None @@ -55,11 +55,11 @@ def _format_value(value: Any, *, floatfmt: str) -> str: def print_df_rich_table( tabular_data: DataFrame, headers: Sequence[str], - summary: Optional[str] = None, + summary: str | None = None, *, show_index=False, - index_name: Optional[str] = None, - table_kwargs: Optional[dict[str, Any]] = None, + index_name: str | None = None, + table_kwargs: dict[str, Any] | None = None, ) -> None: table = Table(title=summary, **(table_kwargs or {})) diff --git a/freqtrade/util/template_renderer.py b/freqtrade/util/template_renderer.py index b2c96fdc5b3..c9dcfce52b1 100644 --- a/freqtrade/util/template_renderer.py +++ b/freqtrade/util/template_renderer.py @@ -2,8 +2,6 @@ Jinja2 rendering utils, used to generate new strategy and configurations. """ -from typing import Optional - def render_template(templatefile: str, arguments: dict) -> str: from jinja2 import Environment, PackageLoader, select_autoescape @@ -17,7 +15,7 @@ def render_template(templatefile: str, arguments: dict) -> str: def render_template_with_fallback( - templatefile: str, templatefallbackfile: str, arguments: Optional[dict] = None + templatefile: str, templatefallbackfile: str, arguments: dict | None = None ) -> str: """ Use templatefile if possible, otherwise fall back to templatefallbackfile diff --git a/freqtrade/vendor/qtpylib/indicators.py b/freqtrade/vendor/qtpylib/indicators.py index 9c92b2f8e1d..5b56b2aa6d2 100644 --- a/freqtrade/vendor/qtpylib/indicators.py +++ b/freqtrade/vendor/qtpylib/indicators.py @@ -227,7 +227,7 @@ def crossed(series1, series2, direction=None): if isinstance(series1, np.ndarray): series1 = pd.Series(series1) - if isinstance(series2, (float, int, np.ndarray, np.integer, np.floating)): + if isinstance(series2, float | int | np.ndarray | np.integer | np.floating): series2 = pd.Series(index=series1.index, data=series2) if direction is None or direction == "above": diff --git a/freqtrade/wallets.py b/freqtrade/wallets.py index e688b307a8f..e0fb1f55615 100644 --- a/freqtrade/wallets.py +++ b/freqtrade/wallets.py @@ -2,9 +2,8 @@ """Wallet""" import logging -from copy import deepcopy from datetime import datetime, timedelta -from typing import NamedTuple, Optional +from typing import NamedTuple from freqtrade.constants import UNLIMITED_STAKE_AMOUNT, Config, IntOrInf from freqtrade.enums import RunMode, TradingMode @@ -29,7 +28,7 @@ class Wallet(NamedTuple): class PositionWallet(NamedTuple): symbol: str position: float = 0 - leverage: Optional[float] = 0 # Don't use this - it's not guaranteed to be set + leverage: float | None = 0 # Don't use this - it's not guaranteed to be set collateral: float = 0 side: str = "long" @@ -41,8 +40,15 @@ def __init__(self, config: Config, exchange: Exchange, is_backtest: bool = False self._exchange = exchange self._wallets: dict[str, Wallet] = {} self._positions: dict[str, PositionWallet] = {} - self.start_cap = config["dry_run_wallet"] - self._last_wallet_refresh: Optional[datetime] = None + self._start_cap: dict[str, float] = {} + self._stake_currency = config["stake_currency"] + + if isinstance(_start_cap := config["dry_run_wallet"], float | int): + self._start_cap[self._stake_currency] = _start_cap + else: + self._start_cap = _start_cap + + self._last_wallet_refresh: datetime | None = None self.update() def get_free(self, currency: str) -> float: @@ -66,6 +72,18 @@ def get_total(self, currency: str) -> float: else: return 0 + def get_collateral(self) -> float: + """ + Get total collateral for liquidation price calculation. + """ + if self._config.get("margin_mode") == "cross": + # free includes all balances and, combined with position collateral, + # is used as "wallet balance". + return self.get_free(self._stake_currency) + sum( + pos.collateral for pos in self._positions.values() + ) + return self.get_total(self._stake_currency) + def get_owned(self, pair: str, base_currency: str) -> float: """ Get currently owned value. @@ -109,54 +127,66 @@ def _update_dry(self) -> None: for o in trade.open_orders if o.amount and o.ft_order_side == trade.exit_side ) + curr_wallet_bal = self._start_cap.get(curr, 0) - _wallets[curr] = Wallet(curr, trade.amount - pending, pending, trade.amount) - - current_stake = self.start_cap + tot_profit - tot_in_trades - total_stake = current_stake + used_stake + _wallets[curr] = Wallet( + curr, + curr_wallet_bal + trade.amount - pending, + pending, + trade.amount + curr_wallet_bal, + ) else: - tot_in_trades = 0 for position in open_trades: - # size = self._exchange._contracts_to_amount(position.pair, position['contracts']) - size = position.amount - collateral = position.stake_amount - leverage = position.leverage - tot_in_trades += collateral _positions[position.pair] = PositionWallet( position.pair, - position=size, - leverage=leverage, - collateral=collateral, + position=position.amount, + leverage=position.leverage, + collateral=position.stake_amount, side=position.trade_direction, ) - current_stake = self.start_cap + tot_profit - tot_in_trades + used_stake = tot_in_trades - total_stake = current_stake + tot_in_trades - _wallets[self._config["stake_currency"]] = Wallet( - currency=self._config["stake_currency"], - free=current_stake, + cross_margin = 0.0 + if self._config.get("margin_mode") == "cross": + # In cross-margin mode, the total balance is used as collateral. + # This is moved as "free" into the stake currency balance. + # strongly tied to the get_collateral() implementation. + for curr, bal in self._start_cap.items(): + if curr == self._stake_currency: + continue + rate = self._exchange.get_conversion_rate(curr, self._stake_currency) + if rate: + cross_margin += bal * rate + + current_stake = self._start_cap.get(self._stake_currency, 0) + tot_profit - tot_in_trades + total_stake = current_stake + used_stake + + _wallets[self._stake_currency] = Wallet( + currency=self._stake_currency, + free=current_stake + cross_margin, used=used_stake, total=total_stake, ) + for currency, bal in self._start_cap.items(): + if currency not in _wallets: + _wallets[currency] = Wallet(currency, bal, 0, bal) + self._wallets = _wallets self._positions = _positions def _update_live(self) -> None: balances = self._exchange.get_balances() + _wallets = {} for currency in balances: if isinstance(balances[currency], dict): - self._wallets[currency] = Wallet( + _wallets[currency] = Wallet( currency, balances[currency].get("free", 0), balances[currency].get("used", 0), balances[currency].get("total", 0), ) - # Remove currencies no longer in get_balances output - for currency in deepcopy(self._wallets): - if currency not in balances: - del self._wallets[currency] positions = self._exchange.fetch_positions() _parsed_positions = {} @@ -176,6 +206,7 @@ def _update_live(self) -> None: side=position["side"], ) self._positions = _parsed_positions + self._wallets = _wallets def update(self, require_update: bool = True) -> None: """ @@ -244,8 +275,10 @@ def get_starting_balance(self) -> float: else: tot_profit = Trade.get_total_closed_profit() open_stakes = Trade.total_open_trades_stakes() - available_balance = self.get_free(self._config["stake_currency"]) - return available_balance - tot_profit + open_stakes + available_balance = self.get_free(self._stake_currency) + return (available_balance - tot_profit + open_stakes) * self._config[ + "tradable_balance_ratio" + ] def get_total_stake_amount(self): """ @@ -264,9 +297,9 @@ def get_total_stake_amount(self): # Ensure % is used from the overall balance # Otherwise we'd risk lowering stakes with each open trade. # (tied up + current free) * ratio) - tied up - available_amount = ( - val_tied_up + self.get_free(self._config["stake_currency"]) - ) * self._config["tradable_balance_ratio"] + available_amount = (val_tied_up + self.get_free(self._stake_currency)) * self._config[ + "tradable_balance_ratio" + ] return available_amount def get_available_stake_amount(self) -> float: @@ -277,7 +310,7 @@ def get_available_stake_amount(self) -> float: ( + free amount) * tradable_balance_ratio - """ - free = self.get_free(self._config["stake_currency"]) + free = self.get_free(self._stake_currency) return min(self.get_total_stake_amount() - Trade.total_open_trades_stakes(), free) def _calculate_unlimited_stake_amount( @@ -316,7 +349,7 @@ def _check_available_stake_amount(self, stake_amount: float, available_amount: f f"lower than stake amount ({stake_amount} {self._config['stake_currency']})" ) - return stake_amount + return max(stake_amount, 0) def get_trade_stake_amount( self, pair: str, max_open_trades: IntOrInf, edge=None, update: bool = True @@ -336,8 +369,8 @@ def get_trade_stake_amount( if edge: stake_amount = edge.stake_amount( pair, - self.get_free(self._config["stake_currency"]), - self.get_total(self._config["stake_currency"]), + self.get_free(self._stake_currency), + self.get_total(self._stake_currency), val_tied_up, ) else: @@ -352,10 +385,10 @@ def get_trade_stake_amount( def validate_stake_amount( self, pair: str, - stake_amount: Optional[float], - min_stake_amount: Optional[float], + stake_amount: float | None, + min_stake_amount: float | None, max_stake_amount: float, - trade_amount: Optional[float], + trade_amount: float | None, ): if not stake_amount: logger.debug(f"Stake amount is {stake_amount}, ignoring possible trade for {pair}.") diff --git a/freqtrade/worker.py b/freqtrade/worker.py index d618b3dec77..61d5d9a6401 100644 --- a/freqtrade/worker.py +++ b/freqtrade/worker.py @@ -5,8 +5,9 @@ import logging import time import traceback +from collections.abc import Callable from os import getpid -from typing import Any, Callable, Optional +from typing import Any import sdnotify @@ -27,7 +28,7 @@ class Worker: Freqtradebot worker class """ - def __init__(self, args: dict[str, Any], config: Optional[Config] = None) -> None: + def __init__(self, args: dict[str, Any], config: Config | None = None) -> None: """ Init all variables and objects the bot needs to work """ @@ -79,7 +80,7 @@ def run(self) -> None: if state == State.RELOAD_CONFIG: self._reconfigure() - def _worker(self, old_state: Optional[State]) -> State: + def _worker(self, old_state: State | None) -> State: """ The main routine that runs each throttling iteration and handles the states. :param old_state: the previous service state from the previous call @@ -141,7 +142,7 @@ def _throttle( self, func: Callable[..., Any], throttle_secs: float, - timeframe: Optional[str] = None, + timeframe: str | None = None, timeframe_offset: float = 1.0, *args, **kwargs, diff --git a/ft_client/freqtrade_client/__init__.py b/ft_client/freqtrade_client/__init__.py index 31f0e4c6a31..d17eec2a750 100644 --- a/ft_client/freqtrade_client/__init__.py +++ b/ft_client/freqtrade_client/__init__.py @@ -1,7 +1,7 @@ from freqtrade_client.ft_rest_client import FtRestClient -__version__ = "2024.10-dev" +__version__ = "2024.12-dev" if "dev" in __version__: from pathlib import Path diff --git a/ft_client/freqtrade_client/ft_rest_client.py b/ft_client/freqtrade_client/ft_rest_client.py index 577001836a9..851583ee0de 100755 --- a/ft_client/freqtrade_client/ft_rest_client.py +++ b/ft_client/freqtrade_client/ft_rest_client.py @@ -7,18 +7,18 @@ import json import logging -from typing import Any, Optional, Union +from typing import Any from urllib.parse import urlencode, urlparse, urlunparse import requests from requests.adapters import HTTPAdapter -from requests.exceptions import ConnectionError +from requests.exceptions import ConnectionError as RequestConnectionError logger = logging.getLogger("ft_rest_client") -ParamsT = Optional[dict[str, Any]] -PostDataT = Optional[Union[dict[str, Any], list[dict[str, Any]]]] +ParamsT = dict[str, Any] | None +PostDataT = dict[str, Any] | list[dict[str, Any]] | None class FtRestClient: @@ -35,7 +35,7 @@ def __init__( if username and password: self._session.auth = (username, password) - def _call(self, method, apipath, params: Optional[dict] = None, data=None, files=None): + def _call(self, method, apipath, params: dict | None = None, data=None, files=None): if str(method).upper() not in ("GET", "POST", "PUT", "DELETE"): raise ValueError(f"invalid method <{method}>") basepath = f"{self._serverurl}/api/v1/{apipath}" @@ -53,7 +53,7 @@ def _call(self, method, apipath, params: Optional[dict] = None, data=None, files resp = self._session.request(method, url, headers=hd, data=json.dumps(data)) # return resp.text return resp.json() - except ConnectionError: + except RequestConnectionError: logger.warning(f"Connection error - could not connect to {netloc}.") def _get(self, apipath, params: ParamsT = None): diff --git a/ft_client/test_client/test_rest_client.py b/ft_client/test_client/test_rest_client.py index 1a709b9c541..c1af6ded22d 100644 --- a/ft_client/test_client/test_rest_client.py +++ b/ft_client/test_client/test_rest_client.py @@ -2,7 +2,7 @@ from unittest.mock import ANY, MagicMock import pytest -from requests.exceptions import ConnectionError +from requests.exceptions import ConnectionError as RequestsConnectionError from freqtrade_client import FtRestClient from freqtrade_client.ft_client import add_arguments, main_exec @@ -45,7 +45,7 @@ def test_FtRestClient_call_invalid(caplog): with pytest.raises(ValueError): client._call("PUTTY", "/dummytest") - client._session.request = MagicMock(side_effect=ConnectionError()) + client._session.request = MagicMock(side_effect=RequestsConnectionError()) client._call("GET", "/dummytest") assert log_has_re("Connection error", caplog) diff --git a/pyproject.toml b/pyproject.toml index 1db932cdcba..cc88c913194 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,7 +44,7 @@ dependencies = [ "pandas-ta", "technical", "tabulate", - "pycoingecko", + "pycoingecko>=3.2.0", "py_find_1st", "python-rapidjson", "orjson", @@ -111,6 +111,8 @@ develop = [ "pytest-cov", "pytest-mock", "pytest-random-order", + "pytest-timeout", + "pytest-xdist", "pytest", "ruff", "time-machine", @@ -215,7 +217,6 @@ exclude = [ "build_helpers/*.py", "ft_client/build/*", "build/*", - "tests/*", ] ignore = ["freqtrade/vendor/**"] pythonPlatform = "All" @@ -246,7 +247,6 @@ reportTypedDictNotRequiredAccess = false # 27 [tool.ruff] line-length = 100 extend-exclude = [".env", ".venv"] -target-version = "py39" [tool.ruff.lint] extend-select = [ diff --git a/requirements-dev.txt b/requirements-dev.txt index 1907e9a0e6b..cd507a7b123 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -7,12 +7,12 @@ -r docs/requirements-docs.txt coveralls==4.0.1 -ruff==0.7.0 -mypy==1.12.1 +ruff==0.8.4 +mypy==1.14.0 pre-commit==4.0.1 -pytest==8.3.3 -pytest-asyncio==0.24.0 -pytest-cov==5.0.0 +pytest==8.3.4 +pytest-asyncio==0.25.0 +pytest-cov==6.0.0 pytest-mock==3.14.0 pytest-random-order==1.1.1 pytest-timeout==2.3.1 @@ -28,5 +28,5 @@ nbconvert==7.16.4 types-cachetools==5.5.0.20240820 types-filelock==3.2.7 types-requests==2.32.0.20241016 -types-tabulate==0.9.0.20240106 -types-python-dateutil==2.9.0.20241003 +types-tabulate==0.9.0.20241207 +types-python-dateutil==2.9.0.20241206 diff --git a/requirements-freqai-rl.txt b/requirements-freqai-rl.txt index 14388df8642..ca5c5894355 100644 --- a/requirements-freqai-rl.txt +++ b/requirements-freqai-rl.txt @@ -3,9 +3,9 @@ # Required for freqai-rl torch==2.2.2; sys_platform == 'darwin' and platform_machine == 'x86_64' -torch==2.5.0; sys_platform != 'darwin' or platform_machine != 'x86_64' +torch==2.5.1; sys_platform != 'darwin' or platform_machine != 'x86_64' gymnasium==0.29.1 -stable_baselines3==2.3.2 +stable_baselines3==2.4.0 sb3_contrib>=2.2.1 # Progress bar for stable-baselines3 and sb3-contrib -tqdm==4.66.5 +tqdm==4.67.1 diff --git a/requirements-freqai.txt b/requirements-freqai.txt index a09eadbb39e..4b7e04c1542 100644 --- a/requirements-freqai.txt +++ b/requirements-freqai.txt @@ -3,13 +3,13 @@ -r requirements-plot.txt # Required for freqai -scikit-learn==1.5.2 +scikit-learn==1.6.0 joblib==1.4.2 catboost==1.2.7; 'arm' not in platform_machine # Pin Matplotlib - it's depended on by catboost # Temporary downgrade of matplotlib due to https://github.com/matplotlib/matplotlib/issues/28551 -matplotlib==3.9.2 +matplotlib==3.10.0 lightgbm==4.5.0 -xgboost==2.0.3 +xgboost==2.1.3 tensorboard==2.18.0 datasieve==0.1.7 diff --git a/requirements-hyperopt.txt b/requirements-hyperopt.txt index 7f60c829969..024eeecf81e 100644 --- a/requirements-hyperopt.txt +++ b/requirements-hyperopt.txt @@ -3,6 +3,6 @@ # Required for hyperopt scipy==1.14.1 -scikit-learn==1.5.2 +scikit-learn==1.6.0 ft-scikit-optimize==0.9.2 filelock==3.16.1 diff --git a/requirements.txt b/requirements.txt index 4f0fc2532a4..7a41985369d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,31 +1,34 @@ numpy==1.26.4 pandas==2.2.3 bottleneck==1.4.2 -numexpr==2.10.1 +numexpr==2.10.2 pandas-ta==0.3.14b -ccxt==4.4.20 +ccxt==4.4.42 cryptography==42.0.8; platform_machine == 'armv7l' -cryptography==43.0.3; platform_machine != 'armv7l' -aiohttp==3.10.10 +cryptography==44.0.0; platform_machine != 'armv7l' +aiohttp==3.10.11 SQLAlchemy==2.0.36 -python-telegram-bot==21.6 +python-telegram-bot==21.9 # can't be hard-pinned due to telegram-bot pinning httpx with ~ httpx>=0.24.1 humanize==4.11.0 cachetools==5.5.0 requests==2.32.3 -urllib3==2.2.3 +urllib3==2.3.0 jsonschema==4.23.0 -TA-Lib==0.4.32 -technical==1.4.4 +TA-Lib==0.4.34 +technical==1.5.0 tabulate==0.9.0 -pycoingecko==3.1.0 -jinja2==3.1.4 +pycoingecko==3.2.0 +jinja2==3.1.5 tables==3.10.1 +# Pin blosc2 to < 3.0 until piwheel has wheels for 3.x +blosc2==2.7.1; platform_machine == 'armv7l' or python_version < '3.11' +blosc2==3.0.0; platform_machine != 'armv7l' and python_version >= '3.11' joblib==1.4.2 -rich==13.9.2 -pyarrow==17.0.0; platform_machine != 'armv7l' +rich==13.9.4 +pyarrow==18.1.0; platform_machine != 'armv7l' # find first, C search in arrays py_find_1st==1.1.6 @@ -33,18 +36,18 @@ py_find_1st==1.1.6 # Load ticker files 30% faster python-rapidjson==1.20 # Properly format api responses -orjson==3.10.9 +orjson==3.10.12 # Notify systemd sdnotify==0.3.2 # API Server -fastapi==0.115.2 -pydantic==2.9.2 -uvicorn==0.32.0 -pyjwt==2.9.0 +fastapi==0.115.6 +pydantic==2.10.4 +uvicorn==0.34.0 +pyjwt==2.10.1 aiofiles==24.1.0 -psutil==6.1.0 +psutil==6.1.1 # Building config files interactively questionary==2.0.1 @@ -57,8 +60,8 @@ pytz==2024.2 schedule==1.2.2 #WS Messages -websockets==13.1 -janus==1.0.0 +websockets==14.1 +janus==2.0.0 ast-comments==1.2.2 -packaging==24.1 +packaging==24.2 diff --git a/scripts/ws_client.py b/scripts/ws_client.py index 81e539e2631..46dd2da101c 100755 --- a/scripts/ws_client.py +++ b/scripts/ws_client.py @@ -253,8 +253,7 @@ async def create_client( except ( socket.gaierror, ConnectionRefusedError, - websockets.exceptions.InvalidStatusCode, - websockets.exceptions.InvalidMessage, + websockets.exceptions.InvalidHandshake, ) as e: logger.error(f"Connection Refused - {e} retrying in {sleep_time}s") await asyncio.sleep(sleep_time) diff --git a/tests/commands/test_commands.py b/tests/commands/test_commands.py index 28baffd5a78..65a43b79533 100644 --- a/tests/commands/test_commands.py +++ b/tests/commands/test_commands.py @@ -1,5 +1,6 @@ import json import re +import shutil from datetime import datetime, timedelta from io import BytesIO from pathlib import Path @@ -44,7 +45,7 @@ from freqtrade.exceptions import OperationalException from freqtrade.persistence.models import init_db from freqtrade.persistence.pairlock_middleware import PairLocks -from freqtrade.util import dt_floor_day, dt_now, dt_utc +from freqtrade.util import dt_utc from tests.conftest import ( CURRENT_TEST_STRATEGY, EXMS, @@ -571,7 +572,7 @@ def test_create_datadir_failed(caplog): assert log_has("`create-userdir` requires --userdir to be set.", caplog) -def test_create_datadir(caplog, mocker): +def test_create_datadir(mocker): cud = mocker.patch( "freqtrade.configuration.directory_operations.create_userdata_dir", MagicMock() ) @@ -585,26 +586,46 @@ def test_create_datadir(caplog, mocker): assert csf.call_count == 1 -def test_start_new_strategy(mocker, caplog): - wt_mock = mocker.patch.object(Path, "write_text", MagicMock()) - mocker.patch.object(Path, "exists", MagicMock(return_value=False)) +def test_start_new_strategy(caplog, user_dir): + strategy_dir = user_dir / "strategies" + strategy_dir.mkdir(parents=True, exist_ok=True) + assert strategy_dir.is_dir() args = ["new-strategy", "--strategy", "CoolNewStrategy"] start_new_strategy(get_args(args)) + assert strategy_dir.exists() + assert (strategy_dir / "CoolNewStrategy.py").exists() - assert wt_mock.call_count == 1 - assert "CoolNewStrategy" in wt_mock.call_args_list[0][0][0] assert log_has_re("Writing strategy to .*", caplog) - mocker.patch("freqtrade.configuration.setup_utils_configuration") - mocker.patch.object(Path, "exists", MagicMock(return_value=True)) with pytest.raises( OperationalException, match=r".* already exists. Please choose another Strategy Name\." ): start_new_strategy(get_args(args)) + args = ["new-strategy", "--strategy", "CoolNewStrategy", "--strategy-path", str(user_dir)] + start_new_strategy(get_args(args)) + assert (user_dir / "CoolNewStrategy.py").exists() + + # strategy-path that doesn't exist + args = [ + "new-strategy", + "--strategy", + "CoolNewStrategy", + "--strategy-path", + str(user_dir / "nonexistent"), + ] + start_new_strategy(get_args(args)) + assert (user_dir / "CoolNewStrategy.py").exists() + + assert log_has_re("Creating strategy directory .*", caplog) + assert (user_dir / "nonexistent").is_dir() + assert (user_dir / "nonexistent" / "CoolNewStrategy.py").exists() -def test_start_new_strategy_no_arg(mocker, caplog): + shutil.rmtree(str(user_dir)) + + +def test_start_new_strategy_no_arg(): args = [ "new-strategy", ] @@ -757,7 +778,13 @@ def test_download_data_keyboardInterrupt(mocker, markets): assert dl_mock.call_count == 1 -def test_download_data_timerange(mocker, markets): +@pytest.mark.parametrize("time", ["00:00", "00:03", "00:30", "23:56"]) +@pytest.mark.parametrize( + "tzoffset", + ["00:00", "+01:00", "-01:00", "+05:00", "-05:00"], +) +def test_download_data_timerange(mocker, markets, time_machine, time, tzoffset): + time_machine.move_to(f"2024-11-01 {time}:00 {tzoffset}") dl_mock = mocker.patch( "freqtrade.data.history.history_utils.refresh_backtest_ohlcv_data", MagicMock(return_value=["ETH/BTC", "XRP/BTC"]), @@ -797,8 +824,9 @@ def test_download_data_timerange(mocker, markets): start_download_data(pargs) assert dl_mock.call_count == 1 # 20days ago - days_ago = dt_floor_day(dt_now() - timedelta(days=20)).timestamp() - assert dl_mock.call_args_list[0][1]["timerange"].startts == days_ago + days_ago = datetime.now() - timedelta(days=20) + days_ago = dt_utc(days_ago.year, days_ago.month, days_ago.day) + assert dl_mock.call_args_list[0][1]["timerange"].startts == days_ago.timestamp() dl_mock.reset_mock() args = [ @@ -819,28 +847,6 @@ def test_download_data_timerange(mocker, markets): assert dl_mock.call_args_list[0][1]["timerange"].startts == int(dt_utc(2020, 1, 1).timestamp()) -def test_download_data_no_markets(mocker, caplog): - dl_mock = mocker.patch( - "freqtrade.data.history.history_utils.refresh_backtest_ohlcv_data", - MagicMock(return_value=["ETH/BTC", "XRP/BTC"]), - ) - patch_exchange(mocker, exchange="binance") - mocker.patch(f"{EXMS}.get_markets", return_value={}) - args = [ - "download-data", - "--exchange", - "binance", - "--pairs", - "ETH/BTC", - "XRP/BTC", - "--days", - "20", - ] - start_download_data(get_args(args)) - assert dl_mock.call_args[1]["timerange"].starttype == "date" - assert log_has("Pairs [ETH/BTC,XRP/BTC] not available on exchange Binance.", caplog) - - def test_download_data_no_exchange(mocker): mocker.patch( "freqtrade.data.history.history_utils.refresh_backtest_ohlcv_data", @@ -919,7 +925,7 @@ def test_download_data_trades(mocker): "freqtrade.data.history.history_utils.convert_trades_to_ohlcv", MagicMock(return_value=[]) ) patch_exchange(mocker) - mocker.patch(f"{EXMS}.get_markets", return_value={}) + mocker.patch(f"{EXMS}.get_markets", return_value={"ETH/BTC": {}, "XRP/BTC": {}}) args = [ "download-data", "--exchange", @@ -954,7 +960,7 @@ def test_download_data_trades(mocker): def test_download_data_data_invalid(mocker): patch_exchange(mocker, exchange="kraken") - mocker.patch(f"{EXMS}.get_markets", return_value={}) + mocker.patch(f"{EXMS}.get_markets", return_value={"ETH/BTC": {}, "XRP/BTC": {}}) args = [ "download-data", "--exchange", @@ -1526,8 +1532,11 @@ def fake_iterator(*args, **kwargs): assert csv_file.is_file() line = csv_file.read_text() assert ( - 'Best,1,2,-1.25%,-1.2222,-0.00125625,,-2.51,"3,930.0 m",0.43662' in line - or "Best,1,2,-1.25%,-1.2222,-0.00125625,,-2.51,2 days 17:30:00,2,0,0.43662" in line + 'Best,1,2,-1.25%,-1.2222,-0.00125625,BTC,-2.51,"3,930.0 m",-0.00125625,23.00%,0.43662' + in line + or "Best,1,2,-1.25%,-1.2222,-0.00125625,BTC,-2.51,2 days 17:30:00,2,0,-0.00125625,23.00%," + "0.43662" + in line ) csv_file.unlink() diff --git a/tests/conftest.py b/tests/conftest.py index 99c42de5f48..a66bd3430cb 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,11 +1,11 @@ # pragma pylint: disable=missing-docstring import json import logging +import platform import re from copy import deepcopy from datetime import datetime, timedelta, timezone from pathlib import Path -from typing import Optional from unittest.mock import MagicMock, Mock, PropertyMock import numpy as np @@ -124,7 +124,7 @@ def get_args(args): return Arguments(args).get_parsed_arg() -def generate_trades_history(n_rows, start_date: Optional[datetime] = None, days=5): +def generate_trades_history(n_rows, start_date: datetime | None = None, days=5): np.random.seed(42) if not start_date: start_date = datetime(2020, 1, 1, tzinfo=timezone.utc) @@ -206,7 +206,7 @@ def generate_test_data_raw(timeframe: str, size: int, start: str = "2020-07-05", """Generates data in the ohlcv format used by ccxt""" df = generate_test_data(timeframe, size, start, random_seed) df["date"] = df.loc[:, "date"].astype(np.int64) // 1000 // 1000 - return list(list(x) for x in zip(*(df[x].values.tolist() for x in df.columns))) + return list(list(x) for x in zip(*(df[x].values.tolist() for x in df.columns), strict=False)) # Source: https://stackoverflow.com/questions/29881236/how-to-mock-asyncio-coroutines @@ -363,8 +363,8 @@ def patch_get_signal( exit_long=False, enter_short=False, exit_short=False, - enter_tag: Optional[str] = None, - exit_tag: Optional[str] = None, + enter_tag: str | None = None, + exit_tag: str | None = None, ) -> None: """ :param mocker: mocker to patch IStrategy class @@ -395,7 +395,7 @@ def patched_get_exit_signal(pair, timeframe, dataframe, is_short): freqtrade.exchange.refresh_latest_ohlcv = lambda p: None -def create_mock_trades(fee, is_short: Optional[bool] = False, use_db: bool = True): +def create_mock_trades(fee, is_short: bool | None = False, use_db: bool = True): """ Create some fake trades ... :param is_short: Optional bool, None creates a mix of long and short trades. @@ -474,7 +474,7 @@ def add_trade(trade): Trade.session.flush() -def create_mock_trades_usdt(fee, is_short: Optional[bool] = False, use_db: bool = True): +def create_mock_trades_usdt(fee, is_short: bool | None = False, use_db: bool = True): """ Create some fake trades ... """ @@ -518,6 +518,30 @@ def patch_gc(mocker) -> None: mocker.patch("freqtrade.main.gc_set_threshold") +def is_arm() -> bool: + machine = platform.machine() + return "arm" in machine or "aarch64" in machine + + +def is_mac() -> bool: + machine = platform.system() + return "Darwin" in machine + + +@pytest.fixture(autouse=True) +def patch_torch_initlogs(mocker) -> None: + if is_mac(): + # Mock torch import completely + import sys + import types + + module_name = "torch" + mocked_module = types.ModuleType(module_name) + sys.modules[module_name] = mocked_module + else: + mocker.patch("torch._logging._init_logs") + + @pytest.fixture(autouse=True) def user_dir(mocker, tmp_path) -> Path: user_dir = tmp_path / "user_data" @@ -601,7 +625,7 @@ def get_default_conf(testdatadir): "telegram": { "enabled": False, "token": "token", - "chat_id": "0", + "chat_id": "1235", "notification_settings": {}, }, "datadir": Path(testdatadir), @@ -2213,7 +2237,7 @@ def tickers(): "first": None, "last": 8603.67, "change": -0.879, - "percentage": None, + "percentage": -8.95, "average": None, "baseVolume": 30414.604298, "quoteVolume": 259629896.48584127, @@ -2257,7 +2281,7 @@ def tickers(): "first": None, "last": 129.28, "change": 1.795, - "percentage": None, + "percentage": -2.5, "average": None, "baseVolume": 59698.79897, "quoteVolume": 29132399.743954, diff --git a/tests/data/test_btanalysis.py b/tests/data/test_btanalysis.py index b9dee6d59d1..9b79983af12 100644 --- a/tests/data/test_btanalysis.py +++ b/tests/data/test_btanalysis.py @@ -503,7 +503,7 @@ def test_calculate_max_drawdown2(): ] dates = [dt_utc(2020, 1, 1) + timedelta(days=i) for i in range(len(values))] - df = DataFrame(zip(values, dates), columns=["profit", "open_date"]) + df = DataFrame(zip(values, dates, strict=False), columns=["profit", "open_date"]) # sort by profit and reset index df = df.sort_values("profit").reset_index(drop=True) df1 = df.copy() @@ -522,11 +522,11 @@ def test_calculate_max_drawdown2(): assert drawdown.drawdown_abs == 0.091755 assert pytest.approx(drawdown.relative_account_drawdown) == 0.32129575 - df = DataFrame(zip(values[:5], dates[:5]), columns=["profit", "open_date"]) + df = DataFrame(zip(values[:5], dates[:5], strict=False), columns=["profit", "open_date"]) with pytest.raises(ValueError, match="No losing trade, therefore no drawdown."): calculate_max_drawdown(df, date_col="open_date", value_col="profit") - df1 = DataFrame(zip(values[:5], dates[:5]), columns=["profit", "open_date"]) + df1 = DataFrame(zip(values[:5], dates[:5], strict=False), columns=["profit", "open_date"]) df1.loc[:, "profit"] = df1["profit"] * -1 # No winning trade ... drawdown = calculate_max_drawdown(df1, date_col="open_date", value_col="profit") @@ -548,7 +548,7 @@ def test_calculate_max_drawdown_abs(profits, relative, highd, lowdays, result, r """ init_date = datetime(2020, 1, 1, tzinfo=timezone.utc) dates = [init_date + timedelta(days=i) for i in range(len(profits))] - df = DataFrame(zip(profits, dates), columns=["profit_abs", "open_date"]) + df = DataFrame(zip(profits, dates, strict=False), columns=["profit_abs", "open_date"]) # sort by profit and reset index df = df.sort_values("profit_abs").reset_index(drop=True) df1 = df.copy() diff --git a/tests/data/test_converter_orderflow.py b/tests/data/test_converter_orderflow.py index 9a337da9193..656c1eab39c 100644 --- a/tests/data/test_converter_orderflow.py +++ b/tests/data/test_converter_orderflow.py @@ -1,13 +1,17 @@ -from collections import OrderedDict - import numpy as np import pandas as pd import pytest from freqtrade.constants import DEFAULT_TRADES_COLUMNS from freqtrade.data.converter import populate_dataframe_with_trades -from freqtrade.data.converter.orderflow import trades_to_volumeprofile_with_total_delta_bid_ask +from freqtrade.data.converter.orderflow import ( + ORDERFLOW_ADDED_COLUMNS, + timeframe_to_DateOffset, + trades_to_volumeprofile_with_total_delta_bid_ask, +) from freqtrade.data.converter.trade_converter import trades_list_to_df +from freqtrade.data.dataprovider import DataProvider +from tests.strategy.strats.strategy_test_v3 import StrategyTestV3 BIN_SIZE_SCALE = 0.5 @@ -37,6 +41,7 @@ def populate_dataframe_with_trades_trades(testdatadir): @pytest.fixture def candles(testdatadir): + # TODO: this fixture isn't really necessary and could be removed return pd.read_json(testdatadir / "orderflow/candles.json").copy() @@ -102,7 +107,7 @@ def test_public_trades_mock_populate_dataframe_with_trades__check_orderflow( }, } # Apply the function to populate the data frame with order flow data - df, _ = populate_dataframe_with_trades(OrderedDict(), config, dataframe, trades) + df, _ = populate_dataframe_with_trades(None, config, dataframe, trades) # Extract results from the first row of the DataFrame results = df.iloc[0] t = results["trades"] @@ -243,7 +248,7 @@ def test_public_trades_trades_mock_populate_dataframe_with_trades__check_trades( } # Populate the DataFrame with trades and order flow data - df, _ = populate_dataframe_with_trades(OrderedDict(), config, dataframe, trades) + df, _ = populate_dataframe_with_trades(None, config, dataframe, trades) # --- DataFrame and Trade Data Validation --- @@ -401,9 +406,7 @@ def test_public_trades_config_max_trades( }, } - df, _ = populate_dataframe_with_trades( - OrderedDict(), default_conf | orderflow_config, dataframe, trades - ) + df, _ = populate_dataframe_with_trades(None, default_conf | orderflow_config, dataframe, trades) assert df.delta.count() == 1 @@ -482,3 +485,94 @@ def test_public_trades_testdata_sanity( "cost", "date", ] + + +def test_analyze_with_orderflow( + default_conf_usdt, + mocker, + populate_dataframe_with_trades_dataframe, + populate_dataframe_with_trades_trades, +): + ohlcv_history = populate_dataframe_with_trades_dataframe + # call without orderflow + strategy = StrategyTestV3(config=default_conf_usdt) + strategy.dp = DataProvider(default_conf_usdt, None, None) + + mocker.patch.object(strategy.dp, "trades", return_value=populate_dataframe_with_trades_trades) + import freqtrade.data.converter.orderflow as orderflow_module + + spy = mocker.spy(orderflow_module, "trades_to_volumeprofile_with_total_delta_bid_ask") + + pair = "ETH/BTC" + df = strategy.advise_indicators(ohlcv_history, {"pair:": pair}) + assert len(df) == len(ohlcv_history) + assert "open" in df.columns + assert spy.call_count == 0 + + # Not expected to run - shouldn't have added orderflow columns + for col in ORDERFLOW_ADDED_COLUMNS: + assert col not in df.columns, f"Column {col} found in df.columns" + + default_conf_usdt["exchange"]["use_public_trades"] = True + default_conf_usdt["orderflow"] = { + "cache_size": 5, + "max_candles": 5, + "scale": 0.005, + "imbalance_volume": 0, + "imbalance_ratio": 3, + "stacked_imbalance_range": 3, + } + + strategy.config = default_conf_usdt + # First round - builds cache + df1 = strategy.advise_indicators(ohlcv_history, {"pair": pair}) + assert len(df1) == len(ohlcv_history) + assert "open" in df1.columns + assert spy.call_count == 5 + + for col in ORDERFLOW_ADDED_COLUMNS: + assert col in df1.columns, f"Column {col} not found in df.columns" + + if col not in ("stacked_imbalances_bid", "stacked_imbalances_ask"): + assert df1[col].count() == 5, f"Column {col} has {df1[col].count()} non-NaN values" + + assert len(strategy._cached_grouped_trades_per_pair[pair]) == 5 + + lastval_trades = df1.at[len(df1) - 1, "trades"] + assert isinstance(lastval_trades, list) + assert len(lastval_trades) == 122 + + lastval_of = df1.at[len(df1) - 1, "orderflow"] + assert isinstance(lastval_of, dict) + + spy.reset_mock() + # Ensure caching works - call the same logic again. + df2 = strategy.advise_indicators(ohlcv_history, {"pair": pair}) + assert len(df2) == len(ohlcv_history) + assert "open" in df2.columns + assert spy.call_count == 0 + for col in ORDERFLOW_ADDED_COLUMNS: + assert col in df2.columns, f"Round2: Column {col} not found in df.columns" + + if col not in ("stacked_imbalances_bid", "stacked_imbalances_ask"): + assert ( + df2[col].count() == 5 + ), f"Round2: Column {col} has {df2[col].count()} non-NaN values" + + lastval_trade2 = df2.at[len(df2) - 1, "trades"] + assert isinstance(lastval_trade2, list) + assert len(lastval_trade2) == 122 + + lastval_of2 = df2.at[len(df2) - 1, "orderflow"] + assert isinstance(lastval_of2, dict) + + +def test_timeframe_to_DateOffset(): + assert timeframe_to_DateOffset("1s") == pd.DateOffset(seconds=1) + assert timeframe_to_DateOffset("1m") == pd.DateOffset(minutes=1) + assert timeframe_to_DateOffset("5m") == pd.DateOffset(minutes=5) + assert timeframe_to_DateOffset("1h") == pd.DateOffset(hours=1) + assert timeframe_to_DateOffset("1d") == pd.DateOffset(days=1) + assert timeframe_to_DateOffset("1w") == pd.DateOffset(weeks=1) + assert timeframe_to_DateOffset("1M") == pd.DateOffset(months=1) + assert timeframe_to_DateOffset("1y") == pd.DateOffset(years=1) diff --git a/tests/data/test_datahandler.py b/tests/data/test_datahandler.py index 99af63eca3a..74936b89006 100644 --- a/tests/data/test_datahandler.py +++ b/tests/data/test_datahandler.py @@ -360,6 +360,11 @@ def test_hdf5datahandler_trades_load(testdatadir): # assert len([t for t in trades2 if t[0] > timerange.stopts * 1000]) == 0 +def test_hdf5datahandler_deprecated(testdatadir, caplog): + get_datahandler(testdatadir, "hdf5") + log_has_re(r"DEPRECATED: The hdf5 dataformat is deprecated.*", caplog) + + @pytest.mark.parametrize( "pair,timeframe,candle_type,candle_append,startdt,enddt", [ @@ -416,7 +421,17 @@ def test_hdf5datahandler_ohlcv_load_and_resave( ) @pytest.mark.parametrize("datahandler", ["hdf5", "feather", "parquet"]) def test_generic_datahandler_ohlcv_load_and_resave( - datahandler, testdatadir, tmp_path, pair, timeframe, candle_type, candle_append, startdt, enddt + datahandler, + mocker, + testdatadir, + tmp_path, + pair, + timeframe, + candle_type, + candle_append, + startdt, + enddt, + caplog, ): tmpdir2 = tmp_path if candle_type not in ("", "spot"): @@ -458,9 +473,26 @@ def test_generic_datahandler_ohlcv_load_and_resave( assert ohlcv[ohlcv["date"] > enddt].empty # Try loading inexisting file - ohlcv = dh.ohlcv_load("UNITTEST/NONEXIST", timeframe, candle_type=candle_type) + ohlcv = dh1.ohlcv_load("UNITTEST/NONEXIST", timeframe, candle_type=candle_type) assert ohlcv.empty + # Try loading a file that exists but errors + mocker.patch( + "freqtrade.data.history.datahandlers.featherdatahandler.read_feather", + side_effect=Exception("Test"), + ) + mocker.patch( + "freqtrade.data.history.datahandlers.parquetdatahandler.read_parquet", + side_effect=Exception("Test"), + ) + mocker.patch( + "freqtrade.data.history.datahandlers.hdf5datahandler.pd.read_hdf", + side_effect=Exception("Test"), + ) + ohlcv_e = dh1.ohlcv_load("UNITTEST/NEW", timeframe, candle_type=candle_type) + assert ohlcv_e.empty + assert log_has_re("Error loading data from", caplog) + def test_hdf5datahandler_ohlcv_purge(mocker, testdatadir): mocker.patch.object(Path, "exists", MagicMock(return_value=False)) diff --git a/tests/data/test_download_data.py b/tests/data/test_download_data.py index f26a30ce1c7..ef1d938d315 100644 --- a/tests/data/test_download_data.py +++ b/tests/data/test_download_data.py @@ -6,7 +6,7 @@ from freqtrade.data.history.history_utils import download_data_main from freqtrade.enums import RunMode from freqtrade.exceptions import OperationalException -from tests.conftest import EXMS, log_has, patch_exchange +from tests.conftest import EXMS, log_has_re, patch_exchange def test_download_data_main_no_markets(mocker, caplog): @@ -19,8 +19,8 @@ def test_download_data_main_no_markets(mocker, caplog): config = setup_utils_configuration({"exchange": "binance"}, RunMode.UTIL_EXCHANGE) config.update({"days": 20, "pairs": ["ETH/BTC", "XRP/BTC"], "timeframes": ["5m", "1h"]}) download_data_main(config) - assert dl_mock.call_args[1]["timerange"].starttype == "date" - assert log_has("Pairs [ETH/BTC,XRP/BTC] not available on exchange Binance.", caplog) + assert dl_mock.call_count == 0 + assert log_has_re("No pairs available for download..*", caplog) def test_download_data_main_all_pairs(mocker, markets): @@ -55,7 +55,7 @@ def test_download_data_main_trades(mocker): "freqtrade.data.history.history_utils.convert_trades_to_ohlcv", MagicMock(return_value=[]) ) patch_exchange(mocker) - mocker.patch(f"{EXMS}.get_markets", return_value={}) + mocker.patch(f"{EXMS}.get_markets", return_value={"ETH/BTC": {}, "XRP/BTC": {}}) config = setup_utils_configuration({"exchange": "binance"}, RunMode.UTIL_EXCHANGE) config.update( { @@ -91,7 +91,7 @@ def test_download_data_main_trades(mocker): def test_download_data_main_data_invalid(mocker): patch_exchange(mocker, exchange="kraken") - mocker.patch(f"{EXMS}.get_markets", return_value={}) + mocker.patch(f"{EXMS}.get_markets", return_value={"ETH/BTC": {}}) config = setup_utils_configuration({"exchange": "kraken"}, RunMode.UTIL_EXCHANGE) config.update( { diff --git a/tests/data/test_history.py b/tests/data/test_history.py index b505c4fe357..1b865c96344 100644 --- a/tests/data/test_history.py +++ b/tests/data/test_history.py @@ -128,8 +128,8 @@ def test_load_data_with_new_pair_1min( """ Test load_pair_history() with 1 min timeframe """ - mocker.patch(f"{EXMS}.get_historic_ohlcv", return_value=ohlcv_history) exchange = get_patched_exchange(mocker, default_conf) + mocker.patch.object(exchange, "get_historic_ohlcv", return_value=ohlcv_history) file = tmp_path / "MEME_BTC-1m.feather" # do not download a new pair if refresh_pairs isn't set @@ -210,7 +210,7 @@ def test_json_pair_trades_filename(pair, trading_mode, expected_result): assert fn == Path(expected_result + ".gz") -def test_load_cached_data_for_updating(mocker, testdatadir) -> None: +def test_load_cached_data_for_updating(testdatadir) -> None: data_handler = get_datahandler(testdatadir, "json") test_data = None @@ -225,13 +225,14 @@ def test_load_cached_data_for_updating(mocker, testdatadir) -> None: now_ts = test_data[-1][0] / 1000 + 60 * 60 # timeframe starts earlier than the cached data - # should fully update data + # Update timestamp to candle end date timerange = TimeRange("date", None, test_data[0][0] / 1000 - 1, 0) data, start_ts, end_ts = _load_cached_data_for_updating( "UNITTEST/BTC", "1m", timerange, data_handler, CandleType.SPOT ) - assert data.empty - assert start_ts == test_data[0][0] - 1000 + assert not data.empty + # Last candle was removed - so 1 candle overlap + assert start_ts == test_data[-1][0] - 60 * 1000 assert end_ts is None # timeframe starts earlier than the cached data - prepending @@ -305,8 +306,8 @@ def test_load_cached_data_for_updating(mocker, testdatadir) -> None: def test_download_pair_history( ohlcv_history, mocker, default_conf, tmp_path, candle_type, subdir, file_tail ) -> None: - mocker.patch(f"{EXMS}.get_historic_ohlcv", return_value=ohlcv_history) exchange = get_patched_exchange(mocker, default_conf) + mocker.patch.object(exchange, "get_historic_ohlcv", return_value=ohlcv_history) file1_1 = tmp_path / f"{subdir}MEME_BTC-1m{file_tail}.feather" file1_5 = tmp_path / f"{subdir}MEME_BTC-5m{file_tail}.feather" file2_1 = tmp_path / f"{subdir}CFI_BTC-1m{file_tail}.feather" @@ -356,8 +357,8 @@ def test_download_pair_history2(mocker, default_conf, testdatadir, ohlcv_history "freqtrade.data.history.datahandlers.featherdatahandler.FeatherDataHandler.ohlcv_store", return_value=None, ) - mocker.patch(f"{EXMS}.get_historic_ohlcv", return_value=ohlcv_history) exchange = get_patched_exchange(mocker, default_conf) + mocker.patch.object(exchange, "get_historic_ohlcv", return_value=ohlcv_history) _download_pair_history( datadir=testdatadir, exchange=exchange, @@ -589,8 +590,8 @@ def test_download_data_no_markets(mocker, default_conf, caplog, testdatadir): ) assert dl_mock.call_count == 0 - assert "BTT/BTC" in unav_pairs - assert "LTC/USDT" in unav_pairs + assert "BTT/BTC: Pair not available on exchange." in unav_pairs + assert "LTC/USDT: Pair not available on exchange." in unav_pairs assert log_has("Skipping pair BTT/BTC...", caplog) @@ -617,7 +618,7 @@ def test_refresh_backtest_trades_data(mocker, default_conf, markets, caplog, tes assert dl_mock.call_args[1]["timerange"].starttype == "date" assert log_has("Downloading trades for pair ETH/BTC.", caplog) - assert unavailable_pairs == ["XRP/ETH"] + assert [p for p in unavailable_pairs if "XRP/ETH" in p] assert log_has("Skipping pair XRP/ETH...", caplog) @@ -665,13 +666,16 @@ def test_download_trades_history( file1.unlink() - mocker.patch(f"{EXMS}.get_historic_trades", MagicMock(side_effect=ValueError)) + mocker.patch(f"{EXMS}.get_historic_trades", MagicMock(side_effect=ValueError("he ho!"))) caplog.clear() - assert not _download_trades_history( - data_handler=data_handler, exchange=exchange, pair="ETH/BTC", trading_mode=TradingMode.SPOT - ) - assert log_has_re('Failed to download and store historic trades for pair: "ETH/BTC".*', caplog) + with pytest.raises(ValueError, match="he ho!"): + _download_trades_history( + data_handler=data_handler, + exchange=exchange, + pair="ETH/BTC", + trading_mode=TradingMode.SPOT, + ) file2 = tmp_path / "XRP_ETH-trades.json.gz" copyfile(testdatadir / file2.name, file2) @@ -682,17 +686,15 @@ def test_download_trades_history( since_time = int(trades_history[0][0] // 1000) - 500 timerange = TimeRange("date", None, since_time, 0) - assert _download_trades_history( - data_handler=data_handler, - exchange=exchange, - pair="XRP/ETH", - timerange=timerange, - trading_mode=TradingMode.SPOT, - ) + with pytest.raises(ValueError, match=r"Start .* earlier than available data"): + _download_trades_history( + data_handler=data_handler, + exchange=exchange, + pair="XRP/ETH", + timerange=timerange, + trading_mode=TradingMode.SPOT, + ) - assert ght_mock.call_count == 1 + assert ght_mock.call_count == 0 - assert int(ght_mock.call_args_list[0][1]["since"] // 1000) == since_time - assert ght_mock.call_args_list[0][1]["from_id"] is None - assert log_has_re(r"Start .* earlier than available data. Redownloading trades for.*", caplog) _clean_test_file(file2) diff --git a/tests/exchange/test_binance.py b/tests/exchange/test_binance.py index 623a9f17afd..3cd66807483 100644 --- a/tests/exchange/test_binance.py +++ b/tests/exchange/test_binance.py @@ -1,14 +1,17 @@ -from datetime import datetime, timezone +from datetime import datetime, timedelta from random import randint from unittest.mock import MagicMock, PropertyMock import ccxt +import pandas as pd import pytest from freqtrade.enums import CandleType, MarginMode, TradingMode from freqtrade.exceptions import DependencyException, InvalidOrderException, OperationalException +from freqtrade.exchange.exchange_utils_timeframe import timeframe_to_seconds from freqtrade.persistence import Trade -from tests.conftest import EXMS, get_mock_coro, get_patched_exchange, log_has_re +from freqtrade.util.datetime_helpers import dt_from_ts, dt_ts, dt_utc +from tests.conftest import EXMS, get_patched_exchange from tests.exchange.test_exchange import ccxt_exceptionhandlers @@ -290,6 +293,7 @@ def test_liquidation_price_binance( default_conf["trading_mode"] = trading_mode default_conf["margin_mode"] = margin_mode default_conf["liquidation_buffer"] = 0.0 + mocker.patch(f"{EXMS}.price_to_precision", lambda s, x, y, **kwargs: y) exchange = get_patched_exchange(mocker, default_conf, exchange="binance") def get_maint_ratio(pair_, stake_amount): @@ -731,42 +735,243 @@ def test__set_leverage_binance(mocker, default_conf): ) -@pytest.mark.parametrize("candle_type", [CandleType.MARK, ""]) -async def test__async_get_historic_ohlcv_binance(default_conf, mocker, caplog, candle_type): - ohlcv = [ - [ - int((datetime.now(timezone.utc).timestamp() - 1000) * 1000), - 1, # open - 2, # high - 3, # low - 4, # close - 5, # volume (in quote currency) +def patch_binance_vision_ohlcv(mocker, start, archive_end, api_end, timeframe): + def make_storage(start: datetime, end: datetime, timeframe: str): + date = pd.date_range(start, end, freq=timeframe.replace("m", "min")) + df = pd.DataFrame( + data=dict(date=date, open=1.0, high=1.0, low=1.0, close=1.0), + ) + return df + + archive_storage = make_storage(start, archive_end, timeframe) + api_storage = make_storage(start, api_end, timeframe) + + ohlcv = [[dt_ts(start), 1, 1, 1, 1]] + # (pair, timeframe, candle_type, ohlcv, True) + candle_history = [None, None, None, ohlcv, None] + + def get_historic_ohlcv( + # self, + pair: str, + timeframe: str, + since_ms: int, + candle_type: CandleType, + is_new_pair: bool = False, + until_ms: int | None = None, + ): + since = dt_from_ts(since_ms) + until = dt_from_ts(until_ms) if until_ms else api_end + timedelta(seconds=1) + return api_storage.loc[(api_storage["date"] >= since) & (api_storage["date"] < until)] + + async def download_archive_ohlcv( + candle_type, + pair, + timeframe, + since_ms, + until_ms, + markets=None, + stop_on_404=False, + ): + since = dt_from_ts(since_ms) + until = dt_from_ts(until_ms) if until_ms else archive_end + timedelta(seconds=1) + if since < start: + pass + return archive_storage.loc[ + (archive_storage["date"] >= since) & (archive_storage["date"] < until) ] - ] + candle_mock = mocker.patch(f"{EXMS}._async_get_candle_history", return_value=candle_history) + api_mock = mocker.patch(f"{EXMS}.get_historic_ohlcv", side_effect=get_historic_ohlcv) + archive_mock = mocker.patch( + "freqtrade.exchange.binance.download_archive_ohlcv", side_effect=download_archive_ohlcv + ) + return candle_mock, api_mock, archive_mock + + +@pytest.mark.parametrize( + "timeframe,is_new_pair,since,until,first_date,last_date,candle_called,archive_called," + "api_called", + [ + ( + "1m", + True, + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 2), + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 1, 23, 59), + True, + True, + False, + ), + ( + "1m", + True, + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 3), + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 2, 23, 59), + True, + True, + True, + ), + ( + "1m", + True, + dt_utc(2020, 1, 2), + dt_utc(2020, 1, 2, 1), + dt_utc(2020, 1, 2), + dt_utc(2020, 1, 2, 0, 59), + True, + False, + True, + ), + ( + "1m", + False, + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 2), + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 1, 23, 59), + False, + True, + False, + ), + ( + "1m", + True, + dt_utc(2019, 1, 1), + dt_utc(2020, 1, 2), + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 1, 23, 59), + True, + True, + False, + ), + ( + "1m", + False, + dt_utc(2019, 1, 1), + dt_utc(2020, 1, 2), + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 1, 23, 59), + False, + True, + False, + ), + ( + "1m", + False, + dt_utc(2019, 1, 1), + dt_utc(2019, 1, 2), + None, + None, + False, + True, + True, + ), + ( + "1m", + True, + dt_utc(2019, 1, 1), + dt_utc(2019, 1, 2), + None, + None, + True, + False, + False, + ), + ( + "1m", + False, + dt_utc(2021, 1, 1), + dt_utc(2021, 1, 2), + None, + None, + False, + False, + False, + ), + ( + "1m", + True, + dt_utc(2021, 1, 1), + dt_utc(2021, 1, 2), + None, + None, + True, + False, + False, + ), + ( + "1h", + False, + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 2), + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 1, 23), + False, + False, + True, + ), + ( + "1m", + False, + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 1, 3, 50, 30), + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 1, 3, 50), + False, + True, + False, + ), + ], +) +def test_get_historic_ohlcv_binance( + mocker, + default_conf, + timeframe, + is_new_pair, + since, + until, + first_date, + last_date, + candle_called, + archive_called, + api_called, +): exchange = get_patched_exchange(mocker, default_conf, exchange="binance") - # Monkey-patch async function - exchange._api_async.fetch_ohlcv = get_mock_coro(ohlcv) - pair = "ETH/BTC" - respair, restf, restype, res, _ = await exchange._async_get_historic_ohlcv( - pair, "5m", 1500000000000, is_new_pair=False, candle_type=candle_type - ) - assert respair == pair - assert restf == "5m" - assert restype == candle_type - # Call with very old timestamp - causes tons of requests - assert exchange._api_async.fetch_ohlcv.call_count > 400 - # assert res == ohlcv - exchange._api_async.fetch_ohlcv.reset_mock() - _, _, _, res, _ = await exchange._async_get_historic_ohlcv( - pair, "5m", 1500000000000, is_new_pair=True, candle_type=candle_type + start = dt_utc(2020, 1, 1) + archive_end = dt_utc(2020, 1, 2) + api_end = dt_utc(2020, 1, 3) + candle_mock, api_mock, archive_mock = patch_binance_vision_ohlcv( + mocker, start=start, archive_end=archive_end, api_end=api_end, timeframe=timeframe ) - # Called twice - one "init" call - and one to get the actual data. - assert exchange._api_async.fetch_ohlcv.call_count == 2 - assert res == ohlcv - assert log_has_re(r"Candle-data for ETH/BTC available starting with .*", caplog) + candle_type = CandleType.SPOT + pair = "BTC/USDT" + + since_ms = dt_ts(since) + until_ms = dt_ts(until) + + df = exchange.get_historic_ohlcv(pair, timeframe, since_ms, candle_type, is_new_pair, until_ms) + + if df.empty: + assert first_date is None + assert last_date is None + else: + assert df["date"].iloc[0] == first_date + assert df["date"].iloc[-1] == last_date + assert ( + df["date"].diff().iloc[1:] == timedelta(seconds=timeframe_to_seconds(timeframe)) + ).all() + + if candle_called: + candle_mock.assert_called_once() + if archive_called: + archive_mock.assert_called_once() + if api_called: + api_mock.assert_called_once() @pytest.mark.parametrize( @@ -794,3 +999,57 @@ def test_get_maintenance_ratio_and_amt_binance( exchange._leverage_tiers = leverage_tiers (result_ratio, result_amt) = exchange.get_maintenance_ratio_and_amt(pair, notional_value) assert (round(result_ratio, 8), round(result_amt, 8)) == (mm_ratio, amt) + + +async def test__async_get_trade_history_id_binance(default_conf_usdt, mocker, fetch_trades_result): + exchange = get_patched_exchange(mocker, default_conf_usdt, exchange="binance") + + async def mock_get_trade_hist(pair, *args, **kwargs): + if "since" in kwargs: + # older than initial call + if kwargs["since"] < 1565798399752: + return [] + else: + # Don't expect to get here + raise ValueError("Unexpected call") + # return fetch_trades_result[:-2] + elif kwargs.get("params", {}).get(exchange._trades_pagination_arg) == "0": + # Return first 3 + return fetch_trades_result[:-2] + elif kwargs.get("params", {}).get(exchange._trades_pagination_arg) in ( + fetch_trades_result[-3]["id"], + 1565798399752, + ): + # Return 2 + return fetch_trades_result[-3:-1] + else: + # Return last 2 + return fetch_trades_result[-2:] + + exchange._api_async.fetch_trades = MagicMock(side_effect=mock_get_trade_hist) + + pair = "ETH/BTC" + ret = await exchange._async_get_trade_history_id( + pair, + since=fetch_trades_result[0]["timestamp"], + until=fetch_trades_result[-1]["timestamp"] - 1, + ) + assert ret[0] == pair + assert isinstance(ret[1], list) + assert exchange._api_async.fetch_trades.call_count == 4 + + fetch_trades_cal = exchange._api_async.fetch_trades.call_args_list + # first call (using since, not fromId) + assert fetch_trades_cal[0][0][0] == pair + assert fetch_trades_cal[0][1]["since"] == fetch_trades_result[0]["timestamp"] + + # 2nd call + assert fetch_trades_cal[1][0][0] == pair + assert "params" in fetch_trades_cal[1][1] + pagination_arg = exchange._ft_has["trades_pagination_arg"] + assert pagination_arg in fetch_trades_cal[1][1]["params"] + # Initial call was with from_id = "0" + assert fetch_trades_cal[1][1]["params"][pagination_arg] == "0" + + assert fetch_trades_cal[2][1]["params"][pagination_arg] != "0" + assert fetch_trades_cal[3][1]["params"][pagination_arg] != "0" diff --git a/tests/exchange/test_binance_public_data.py b/tests/exchange/test_binance_public_data.py new file mode 100644 index 00000000000..6eb5a00bb59 --- /dev/null +++ b/tests/exchange/test_binance_public_data.py @@ -0,0 +1,337 @@ +import asyncio +import datetime +import io +import re +import sys +import zipfile +from datetime import timedelta + +import aiohttp +import pandas as pd +import pytest + +from freqtrade.enums import CandleType +from freqtrade.exchange.binance_public_data import ( + BadHttpStatus, + Http404, + binance_vision_zip_name, + download_archive_ohlcv, + get_daily_ohlcv, +) +from freqtrade.util.datetime_helpers import dt_ts, dt_utc + + +@pytest.fixture(scope="module") +def event_loop_policy(request): + if sys.platform == "win32": + return asyncio.WindowsSelectorEventLoopPolicy() + else: + return asyncio.DefaultEventLoopPolicy() + + +class MockResponse: + """AioHTTP response mock""" + + def __init__(self, content, status, reason=""): + self._content = content + self.status = status + self.reason = reason + + async def read(self): + return self._content + + async def __aexit__(self, exc_type, exc, tb): + pass + + async def __aenter__(self): + return self + + +# spot klines archive csv file format, the futures/um klines don't have the header line +# +# open_time,open,high,low,close,volume,close_time,quote_volume,count,taker_buy_volume,taker_buy_quote_volume,ignore # noqa: E501 +# 1698364800000,34161.6,34182.5,33977.4,34024.2,409953,1698368399999,1202.97118037,15095,192220,564.12041453,0 # noqa: E501 +# 1698368400000,34024.2,34060.1,33776.4,33848.4,740960,1698371999999,2183.75671155,23938,368266,1085.17080793,0 # noqa: E501 +# 1698372000000,33848.5,34150.0,33815.1,34094.2,390376,1698375599999,1147.73267094,13854,231446,680.60405822,0 # noqa: E501 + + +def make_response_from_url(start_date, end_date): + def make_daily_df(date, timeframe): + start = dt_utc(date.year, date.month, date.day) + end = start + timedelta(days=1) + date_col = pd.date_range(start, end, freq=timeframe.replace("m", "min"), inclusive="left") + cols = ( + "open_time,open,high,low,close,volume,close_time,quote_volume,count,taker_buy_volume," + "taker_buy_quote_volume,ignore" + ) + df = pd.DataFrame(columns=cols.split(","), dtype=float) + df["open_time"] = date_col.astype("int64") // 10**6 + df["open"] = df["high"] = df["low"] = df["close"] = df["volume"] = 1.0 + return df + + def make_daily_zip(asset_type_url_segment, symbol, timeframe, date) -> bytes: + df = make_daily_df(date, timeframe) + if asset_type_url_segment == "spot": + header = True + elif asset_type_url_segment == "futures/um": + header = None + else: + raise ValueError + csv = df.to_csv(index=False, header=header) + zip_buffer = io.BytesIO() + with zipfile.ZipFile(zip_buffer, "w") as zipf: + zipf.writestr(binance_vision_zip_name(symbol, timeframe, date), csv) + return zip_buffer.getvalue() + + def make_response(url): + pattern = ( + r"https://data.binance.vision/data/(?Pspot|futures/um)" + r"/daily/klines/(?P.*?)/(?P.*?)/(?P=symbol)-(?P=timeframe)-" + r"(?P\d{4}-\d{2}-\d{2}).zip" + ) + m = re.match(pattern, url) + if not m: + return MockResponse(content="", status=404) + + date = datetime.datetime.strptime(m["date"], "%Y-%m-%d").date() + if date < start_date or date > end_date: + return MockResponse(content="", status=404) + + zip_file = make_daily_zip(m["asset_type_url_segment"], m["symbol"], m["timeframe"], date) + return MockResponse(content=zip_file, status=200) + + return make_response + + +@pytest.mark.parametrize( + "candle_type,pair,since,until,first_date,last_date,stop_on_404", + [ + ( + CandleType.SPOT, + "BTC/USDT", + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 2), + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 1, 23), + False, + ), + ( + CandleType.SPOT, + "BTC/USDT", + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 1, 23, 59, 59), + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 1, 23), + False, + ), + ( + CandleType.SPOT, + "BTC/USDT", + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 5), + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 3, 23), + False, + ), + ( + CandleType.SPOT, + "BTC/USDT", + dt_utc(2019, 12, 25), + dt_utc(2020, 1, 5), + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 3, 23), + False, + ), + ( + CandleType.SPOT, + "BTC/USDT", + dt_utc(2019, 1, 1), + dt_utc(2019, 1, 5), + None, + None, + False, + ), + ( + CandleType.SPOT, + "BTC/USDT", + dt_utc(2021, 1, 1), + dt_utc(2021, 1, 5), + None, + None, + False, + ), + ( + CandleType.SPOT, + "BTC/USDT", + dt_utc(2020, 1, 2), + None, + dt_utc(2020, 1, 2), + dt_utc(2020, 1, 3, 23), + False, + ), + ( + CandleType.SPOT, + "BTC/USDT", + dt_utc(2020, 1, 5), + dt_utc(2020, 1, 1), + None, + None, + False, + ), + ( + CandleType.FUTURES, + "BTC/USDT:USDT", + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 1, 23, 59, 59), + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 1, 23), + False, + ), + ( + CandleType.INDEX, + "N/A", + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 1, 23, 59, 59), + None, + None, + False, + ), + # stop_on_404 = True + ( + CandleType.SPOT, + "BTC/USDT", + dt_utc(2019, 12, 25), + dt_utc(2020, 1, 5), + None, + None, + True, + ), + ( + CandleType.SPOT, + "BTC/USDT", + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 5), + dt_utc(2020, 1, 1), + dt_utc(2020, 1, 3, 23), + True, + ), + ( + CandleType.FUTURES, + "BTC/USDT:USDT", + dt_utc(2019, 12, 25), + dt_utc(2020, 1, 5), + None, + None, + True, + ), + ], +) +async def test_download_archive_ohlcv( + mocker, candle_type, pair, since, until, first_date, last_date, stop_on_404 +): + history_start = dt_utc(2020, 1, 1).date() + history_end = dt_utc(2020, 1, 3).date() + timeframe = "1h" + + since_ms = dt_ts(since) + until_ms = dt_ts(until) + + mocker.patch( + "freqtrade.exchange.binance_public_data.aiohttp.ClientSession.get", + side_effect=make_response_from_url(history_start, history_end), + ) + markets = {"BTC/USDT": {"id": "BTCUSDT"}, "BTC/USDT:USDT": {"id": "BTCUSDT"}} + + df = await download_archive_ohlcv( + candle_type, + pair, + timeframe, + since_ms=since_ms, + until_ms=until_ms, + markets=markets, + stop_on_404=stop_on_404, + ) + + if df.empty: + assert first_date is None and last_date is None + else: + assert candle_type in [CandleType.SPOT, CandleType.FUTURES] + assert df["date"].iloc[0] == first_date + assert df["date"].iloc[-1] == last_date + + +async def test_download_archive_ohlcv_exception(mocker): + timeframe = "1h" + pair = "BTC/USDT" + + since_ms = dt_ts(dt_utc(2020, 1, 1)) + until_ms = dt_ts(dt_utc(2020, 1, 2)) + + markets = {"BTC/USDT": {"id": "BTCUSDT"}, "BTC/USDT:USDT": {"id": "BTCUSDT"}} + mocker.patch( + "freqtrade.exchange.binance_public_data.aiohttp.ClientSession.get", side_effect=RuntimeError + ) + + df = await download_archive_ohlcv( + CandleType.SPOT, pair, timeframe, since_ms=since_ms, until_ms=until_ms, markets=markets + ) + + assert df.empty + + +async def test_get_daily_ohlcv(mocker, testdatadir): + symbol = "BTCUSDT" + timeframe = "1h" + date = dt_utc(2024, 10, 28).date() + first_date = dt_utc(2024, 10, 28) + last_date = dt_utc(2024, 10, 28, 23) + + async with aiohttp.ClientSession() as session: + spot_path = ( + testdatadir / "binance/binance_public_data/spot-klines-BTCUSDT-1h-2024-10-28.zip" + ) + get = mocker.patch( + "freqtrade.exchange.binance_public_data.aiohttp.ClientSession.get", + return_value=MockResponse(spot_path.read_bytes(), 200), + ) + df = await get_daily_ohlcv("spot", symbol, timeframe, date, session) + assert get.call_count == 1 + assert df["date"].iloc[0] == first_date + assert df["date"].iloc[-1] == last_date + + futures_path = ( + testdatadir / "binance/binance_public_data/futures-um-klines-BTCUSDT-1h-2024-10-28.zip" + ) + get = mocker.patch( + "freqtrade.exchange.binance_public_data.aiohttp.ClientSession.get", + return_value=MockResponse(futures_path.read_bytes(), 200), + ) + df = await get_daily_ohlcv("futures/um", symbol, timeframe, date, session) + assert get.call_count == 1 + assert df["date"].iloc[0] == first_date + assert df["date"].iloc[-1] == last_date + + get = mocker.patch( + "freqtrade.exchange.binance_public_data.aiohttp.ClientSession.get", + return_value=MockResponse(b"", 404), + ) + with pytest.raises(Http404): + df = await get_daily_ohlcv("spot", symbol, timeframe, date, session, retry_delay=0) + assert get.call_count == 1 + + get = mocker.patch( + "freqtrade.exchange.binance_public_data.aiohttp.ClientSession.get", + return_value=MockResponse(b"", 500), + ) + mocker.patch("asyncio.sleep") + with pytest.raises(BadHttpStatus): + df = await get_daily_ohlcv("spot", symbol, timeframe, date, session) + assert get.call_count == 4 # 1 + 3 default retries + + get = mocker.patch( + "freqtrade.exchange.binance_public_data.aiohttp.ClientSession.get", + return_value=MockResponse(b"nop", 200), + ) + with pytest.raises(zipfile.BadZipFile): + df = await get_daily_ohlcv("spot", symbol, timeframe, date, session) + assert get.call_count == 4 # 1 + 3 default retries diff --git a/tests/exchange/test_bybit.py b/tests/exchange/test_bybit.py index f4b8a8ea181..4448f49de5b 100644 --- a/tests/exchange/test_bybit.py +++ b/tests/exchange/test_bybit.py @@ -1,6 +1,8 @@ from datetime import datetime, timedelta, timezone from unittest.mock import MagicMock +import pytest + from freqtrade.enums.marginmode import MarginMode from freqtrade.enums.tradingmode import TradingMode from tests.conftest import EXMS, get_mock_coro, get_patched_exchange, log_has @@ -172,3 +174,26 @@ def test_bybit_fetch_order_canceled_empty(default_conf_usdt, mocker): assert res2["filled"] == 0.0 assert res2["amount"] == 20.0 assert res2["status"] == "open" + + +@pytest.mark.parametrize( + "side,order_type,uta,tradingmode,expected", + [ + ("buy", "limit", False, "spot", True), + ("buy", "limit", False, "futures", True), + ("sell", "limit", False, "spot", True), + ("sell", "limit", False, "futures", True), + ("buy", "market", False, "spot", True), + ("buy", "market", False, "futures", False), + ("buy", "market", True, "spot", False), + ("buy", "market", True, "futures", False), + ], +) +def test_bybit__order_needs_price( + default_conf, mocker, side, order_type, uta, tradingmode, expected +): + exchange = get_patched_exchange(mocker, default_conf, exchange="bybit") + exchange.trading_mode = tradingmode + exchange.unified_account = uta + + assert exchange._order_needs_price(side, order_type) == expected diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 35d0b18ddc6..260dd8f0e55 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -1069,7 +1069,6 @@ def test_create_dry_run_order(default_conf, mocker, side, exchange_name, leverag assert order["type"] == "limit" assert order["symbol"] == "ETH/BTC" assert order["amount"] == 1 - assert order["leverage"] == leverage assert order["cost"] == 1 * 200 @@ -1274,6 +1273,9 @@ def test_create_order(default_conf, mocker, side, ordertype, rate, marketprice, exchange._set_leverage = MagicMock() exchange.set_margin_mode = MagicMock() + # Only applies to gate + price_req = exchange._ft_has.get("marketOrderRequiresPrice", False) + order = exchange.create_order( pair="XLTCUSDT", ordertype=ordertype, side=side, amount=1, rate=rate, leverage=1.0 ) @@ -1286,7 +1288,9 @@ def test_create_order(default_conf, mocker, side, ordertype, rate, marketprice, assert api_mock.create_order.call_args[0][1] == ordertype assert api_mock.create_order.call_args[0][2] == side assert api_mock.create_order.call_args[0][3] == 1 - assert api_mock.create_order.call_args[0][4] is rate + assert api_mock.create_order.call_args[0][4] == ( + rate if price_req or not (bool(marketprice) and side == "sell") else None + ) assert exchange._set_leverage.call_count == 0 assert exchange.set_margin_mode.call_count == 0 @@ -1364,7 +1368,7 @@ def test_buy_prod(default_conf, mocker, exchange_name): assert api_mock.create_order.call_args[0][1] == order_type assert api_mock.create_order.call_args[0][2] == "buy" assert api_mock.create_order.call_args[0][3] == 1 - if exchange._order_needs_price(order_type): + if exchange._order_needs_price("buy", order_type): assert api_mock.create_order.call_args[0][4] == 200 else: assert api_mock.create_order.call_args[0][4] is None @@ -1511,7 +1515,7 @@ def test_buy_considers_time_in_force(default_conf, mocker, exchange_name): assert api_mock.create_order.call_args[0][1] == order_type assert api_mock.create_order.call_args[0][2] == "buy" assert api_mock.create_order.call_args[0][3] == 1 - if exchange._order_needs_price(order_type): + if exchange._order_needs_price("buy", order_type): assert api_mock.create_order.call_args[0][4] == 200 else: assert api_mock.create_order.call_args[0][4] is None @@ -1556,7 +1560,7 @@ def test_sell_prod(default_conf, mocker, exchange_name): assert api_mock.create_order.call_args[0][1] == order_type assert api_mock.create_order.call_args[0][2] == "sell" assert api_mock.create_order.call_args[0][3] == 1 - if exchange._order_needs_price(order_type): + if exchange._order_needs_price("sell", order_type): assert api_mock.create_order.call_args[0][4] == 200 else: assert api_mock.create_order.call_args[0][4] is None @@ -1666,7 +1670,7 @@ def test_sell_considers_time_in_force(default_conf, mocker, exchange_name): assert api_mock.create_order.call_args[0][1] == order_type assert api_mock.create_order.call_args[0][2] == "sell" assert api_mock.create_order.call_args[0][3] == 1 - if exchange._order_needs_price(order_type): + if exchange._order_needs_price("sell", order_type): assert api_mock.create_order.call_args[0][4] == 200 else: assert api_mock.create_order.call_args[0][4] is None @@ -2002,6 +2006,46 @@ def test_get_tickers(default_conf, mocker, exchange_name, caplog): assert exchange.get_tickers() == {} +@pytest.mark.parametrize("exchange_name", EXCHANGES) +def test_get_conversion_rate(default_conf_usdt, mocker, exchange_name): + api_mock = MagicMock() + tick = { + "ETH/USDT": { + "last": 42, + }, + "BCH/USDT": { + "last": 41, + }, + "ETH/BTC": { + "last": 250, + }, + } + tick2 = { + "ADA/USDT:USDT": { + "last": 2.5, + } + } + mocker.patch(f"{EXMS}.exchange_has", return_value=True) + api_mock.fetch_tickers = MagicMock(side_effect=[tick, tick2]) + api_mock.fetch_bids_asks = MagicMock(return_value={}) + + exchange = get_patched_exchange(mocker, default_conf_usdt, api_mock, exchange=exchange_name) + # retrieve original ticker + assert exchange.get_conversion_rate("USDT", "USDT") == 1 + assert api_mock.fetch_tickers.call_count == 0 + assert exchange.get_conversion_rate("ETH", "USDT") == 42 + assert exchange.get_conversion_rate("ETH", "USDC") is None + assert exchange.get_conversion_rate("ETH", "BTC") == 250 + assert exchange.get_conversion_rate("BTC", "ETH") == 0.004 + + assert api_mock.fetch_tickers.call_count == 1 + api_mock.fetch_tickers.reset_mock() + + assert exchange.get_conversion_rate("ADA", "USDT") == 2.5 + # Only the call to the "others" market + assert api_mock.fetch_tickers.call_count == 1 + + @pytest.mark.parametrize("exchange_name", EXCHANGES) def test_fetch_ticker(default_conf, mocker, exchange_name): api_mock = MagicMock() @@ -2087,6 +2131,7 @@ def test___now_is_time_to_refresh(default_conf, mocker, exchange_name, time_mach @pytest.mark.parametrize("candle_type", ["mark", ""]) @pytest.mark.parametrize("exchange_name", EXCHANGES) def test_get_historic_ohlcv(default_conf, mocker, caplog, exchange_name, candle_type): + caplog.set_level(logging.DEBUG) exchange = get_patched_exchange(mocker, default_conf, exchange=exchange_name) pair = "ETH/BTC" calls = 0 @@ -2119,7 +2164,7 @@ async def mock_candle_hist(pair, timeframe, candle_type, since_ms): assert exchange._async_get_candle_history.call_count == 2 # Returns twice the above OHLCV data after truncating the open candle. assert len(ret) == 2 - assert log_has_re(r"Downloaded data for .* with length .*\.", caplog) + assert log_has_re(r"Downloaded data for .* from ccxt with length .*\.", caplog) caplog.clear() @@ -2152,7 +2197,7 @@ async def test__async_get_historic_ohlcv(default_conf, mocker, caplog, exchange_ pair = "ETH/USDT" respair, restf, _, res, _ = await exchange._async_get_historic_ohlcv( - pair, "5m", 1500000000000, candle_type=candle_type, is_new_pair=False + pair, "5m", 1500000000000, candle_type=candle_type ) assert respair == pair assert restf == "5m" @@ -2164,7 +2209,7 @@ async def test__async_get_historic_ohlcv(default_conf, mocker, caplog, exchange_ end_ts = 1_500_500_000_000 start_ts = 1_500_000_000_000 respair, restf, _, res, _ = await exchange._async_get_historic_ohlcv( - pair, "5m", since_ms=start_ts, candle_type=candle_type, is_new_pair=False, until_ms=end_ts + pair, "5m", since_ms=start_ts, candle_type=candle_type, until_ms=end_ts ) # Required candles candles = (end_ts - start_ts) / 300_000 @@ -4074,10 +4119,16 @@ def test_get_valid_pair_combination(default_conf, mocker, markets): ) ex = Exchange(default_conf) - assert ex.get_valid_pair_combination("ETH", "BTC") == "ETH/BTC" - assert ex.get_valid_pair_combination("BTC", "ETH") == "ETH/BTC" + assert next(ex.get_valid_pair_combination("ETH", "BTC")) == "ETH/BTC" + assert next(ex.get_valid_pair_combination("BTC", "ETH")) == "ETH/BTC" + multicombs = list(ex.get_valid_pair_combination("ETH", "USDT")) + assert len(multicombs) == 2 + assert "ETH/USDT" in multicombs + assert "ETH/USDT:USDT" in multicombs + with pytest.raises(ValueError, match=r"Could not combine.* to get a valid pair."): - ex.get_valid_pair_combination("NOPAIR", "ETH") + for x in ex.get_valid_pair_combination("NOPAIR", "ETH"): + pass @pytest.mark.parametrize( @@ -4446,6 +4497,7 @@ def test_market_is_tradable( ex = get_patched_exchange(mocker, default_conf, exchange=exchange) market = { "symbol": market_symbol, + "type": "swap", "base": base, "quote": quote, "spot": spot, @@ -6125,6 +6177,7 @@ def test_get_liquidation_price( default_conf_usdt["exchange"]["name"] = exchange_name default_conf_usdt["margin_mode"] = margin_mode mocker.patch("freqtrade.exchange.gate.Gate.validate_ordertypes") + mocker.patch(f"{EXMS}.price_to_precision", lambda s, x, y, **kwargs: y) exchange = get_patched_exchange(mocker, default_conf_usdt, exchange=exchange_name) exchange.get_maintenance_ratio_and_amt = MagicMock(return_value=(0.01, 0.01)) diff --git a/tests/exchange/test_hyperliquid.py b/tests/exchange/test_hyperliquid.py new file mode 100644 index 00000000000..808bef802ec --- /dev/null +++ b/tests/exchange/test_hyperliquid.py @@ -0,0 +1,417 @@ +from datetime import datetime, timezone +from unittest.mock import MagicMock, PropertyMock + +import pytest + +from tests.conftest import EXMS, get_mock_coro, get_patched_exchange + + +def test_hyperliquid_dry_run_liquidation_price(default_conf, mocker): + # test if liq price calculated by dry_run_liquidation_price() is close to ccxt liq price + # testing different pairs with large/small prices, different leverages, long, short + markets = { + "BTC/USDC:USDC": {"limits": {"leverage": {"max": 50}}}, + "ETH/USDC:USDC": {"limits": {"leverage": {"max": 50}}}, + "SOL/USDC:USDC": {"limits": {"leverage": {"max": 20}}}, + "DOGE/USDC:USDC": {"limits": {"leverage": {"max": 20}}}, + } + positions = [ + { + "symbol": "ETH/USDC:USDC", + "entryPrice": 2458.5, + "side": "long", + "contracts": 0.015, + "collateral": 36.864593, + "leverage": 1.0, + "liquidationPrice": 0.86915825, + }, + { + "symbol": "BTC/USDC:USDC", + "entryPrice": 63287.0, + "side": "long", + "contracts": 0.00039, + "collateral": 24.673292, + "leverage": 1.0, + "liquidationPrice": 22.37166537, + }, + { + "symbol": "SOL/USDC:USDC", + "entryPrice": 146.82, + "side": "long", + "contracts": 0.16, + "collateral": 23.482979, + "leverage": 1.0, + "liquidationPrice": 0.05269872, + }, + { + "symbol": "SOL/USDC:USDC", + "entryPrice": 145.83, + "side": "long", + "contracts": 0.33, + "collateral": 24.045107, + "leverage": 2.0, + "liquidationPrice": 74.83696193, + }, + { + "symbol": "ETH/USDC:USDC", + "entryPrice": 2459.5, + "side": "long", + "contracts": 0.0199, + "collateral": 24.454895, + "leverage": 2.0, + "liquidationPrice": 1243.0411908, + }, + { + "symbol": "BTC/USDC:USDC", + "entryPrice": 62739.0, + "side": "long", + "contracts": 0.00077, + "collateral": 24.137992, + "leverage": 2.0, + "liquidationPrice": 31708.03843631, + }, + { + "symbol": "DOGE/USDC:USDC", + "entryPrice": 0.11586, + "side": "long", + "contracts": 437.0, + "collateral": 25.29769, + "leverage": 2.0, + "liquidationPrice": 0.05945697, + }, + { + "symbol": "ETH/USDC:USDC", + "entryPrice": 2642.8, + "side": "short", + "contracts": 0.019, + "collateral": 25.091876, + "leverage": 2.0, + "liquidationPrice": 3924.18322043, + }, + { + "symbol": "SOL/USDC:USDC", + "entryPrice": 155.89, + "side": "short", + "contracts": 0.32, + "collateral": 24.924941, + "leverage": 2.0, + "liquidationPrice": 228.07847866, + }, + { + "symbol": "DOGE/USDC:USDC", + "entryPrice": 0.14333, + "side": "short", + "contracts": 351.0, + "collateral": 25.136807, + "leverage": 2.0, + "liquidationPrice": 0.20970228, + }, + { + "symbol": "BTC/USDC:USDC", + "entryPrice": 68595.0, + "side": "short", + "contracts": 0.00069, + "collateral": 23.64871, + "leverage": 2.0, + "liquidationPrice": 101849.99354283, + }, + { + "symbol": "BTC/USDC:USDC", + "entryPrice": 65536.0, + "side": "short", + "contracts": 0.00099, + "collateral": 21.604172, + "leverage": 3.0, + "liquidationPrice": 86493.46174617, + }, + { + "symbol": "SOL/USDC:USDC", + "entryPrice": 173.06, + "side": "long", + "contracts": 0.6, + "collateral": 20.735658, + "leverage": 5.0, + "liquidationPrice": 142.05186667, + }, + { + "symbol": "ETH/USDC:USDC", + "entryPrice": 2545.5, + "side": "long", + "contracts": 0.0329, + "collateral": 20.909894, + "leverage": 4.0, + "liquidationPrice": 1929.23322895, + }, + { + "symbol": "BTC/USDC:USDC", + "entryPrice": 67400.0, + "side": "short", + "contracts": 0.00031, + "collateral": 20.887308, + "leverage": 1.0, + "liquidationPrice": 133443.97317151, + }, + { + "symbol": "ETH/USDC:USDC", + "entryPrice": 2552.0, + "side": "short", + "contracts": 0.0327, + "collateral": 20.833393, + "leverage": 4.0, + "liquidationPrice": 3157.53150453, + }, + { + "symbol": "BTC/USDC:USDC", + "entryPrice": 66930.0, + "side": "long", + "contracts": 0.0015, + "collateral": 20.043862, + "leverage": 5.0, + "liquidationPrice": 54108.51043771, + }, + { + "symbol": "BTC/USDC:USDC", + "entryPrice": 67033.0, + "side": "long", + "contracts": 0.00121, + "collateral": 20.251817, + "leverage": 4.0, + "liquidationPrice": 50804.00091827, + }, + { + "symbol": "ETH/USDC:USDC", + "entryPrice": 2521.9, + "side": "long", + "contracts": 0.0237, + "collateral": 19.902091, + "leverage": 3.0, + "liquidationPrice": 1699.14071943, + }, + { + "symbol": "BTC/USDC:USDC", + "entryPrice": 68139.0, + "side": "short", + "contracts": 0.00145, + "collateral": 19.72573, + "leverage": 5.0, + "liquidationPrice": 80933.61590987, + }, + { + "symbol": "SOL/USDC:USDC", + "entryPrice": 178.29, + "side": "short", + "contracts": 0.11, + "collateral": 19.605036, + "leverage": 1.0, + "liquidationPrice": 347.82205322, + }, + { + "symbol": "SOL/USDC:USDC", + "entryPrice": 176.23, + "side": "long", + "contracts": 0.33, + "collateral": 19.364946, + "leverage": 3.0, + "liquidationPrice": 120.56240404, + }, + { + "symbol": "SOL/USDC:USDC", + "entryPrice": 173.08, + "side": "short", + "contracts": 0.33, + "collateral": 19.01881, + "leverage": 3.0, + "liquidationPrice": 225.08561715, + }, + { + "symbol": "BTC/USDC:USDC", + "entryPrice": 68240.0, + "side": "short", + "contracts": 0.00105, + "collateral": 17.887922, + "leverage": 4.0, + "liquidationPrice": 84431.79820839, + }, + { + "symbol": "ETH/USDC:USDC", + "entryPrice": 2518.4, + "side": "short", + "contracts": 0.007, + "collateral": 17.62263, + "leverage": 1.0, + "liquidationPrice": 4986.05799151, + }, + { + "symbol": "ETH/USDC:USDC", + "entryPrice": 2533.2, + "side": "long", + "contracts": 0.0347, + "collateral": 17.555195, + "leverage": 5.0, + "liquidationPrice": 2047.7642302, + }, + { + "symbol": "DOGE/USDC:USDC", + "entryPrice": 0.13284, + "side": "long", + "contracts": 360.0, + "collateral": 15.943218, + "leverage": 3.0, + "liquidationPrice": 0.09082388, + }, + { + "symbol": "SOL/USDC:USDC", + "entryPrice": 163.11, + "side": "short", + "contracts": 0.48, + "collateral": 15.650731, + "leverage": 5.0, + "liquidationPrice": 190.94213618, + }, + { + "symbol": "BTC/USDC:USDC", + "entryPrice": 67141.0, + "side": "long", + "contracts": 0.00067, + "collateral": 14.979079, + "leverage": 3.0, + "liquidationPrice": 45236.52992613, + }, + ] + + api_mock = MagicMock() + default_conf["trading_mode"] = "futures" + default_conf["margin_mode"] = "isolated" + default_conf["stake_currency"] = "USDC" + api_mock.load_markets = get_mock_coro(return_value=markets) + exchange = get_patched_exchange( + mocker, default_conf, api_mock, exchange="hyperliquid", mock_markets=False + ) + + for position in positions: + is_short = True if position["side"] == "short" else False + liq_price_returned = position["liquidationPrice"] + liq_price_calculated = exchange.dry_run_liquidation_price( + position["symbol"], + position["entryPrice"], + is_short, + position["contracts"], + position["collateral"], + position["leverage"], + position["collateral"], + [], + ) + assert pytest.approx(liq_price_returned, rel=0.0001) == liq_price_calculated + + +def test_hyperliquid_get_funding_fees(default_conf, mocker): + now = datetime.now(timezone.utc) + exchange = get_patched_exchange(mocker, default_conf, exchange="hyperliquid") + exchange._fetch_and_calculate_funding_fees = MagicMock() + exchange.get_funding_fees("BTC/USDC:USDC", 1, False, now) + assert exchange._fetch_and_calculate_funding_fees.call_count == 0 + + default_conf["trading_mode"] = "futures" + default_conf["margin_mode"] = "isolated" + exchange = get_patched_exchange(mocker, default_conf, exchange="hyperliquid") + exchange._fetch_and_calculate_funding_fees = MagicMock() + exchange.get_funding_fees("BTC/USDC:USDC", 1, False, now) + + assert exchange._fetch_and_calculate_funding_fees.call_count == 1 + + +def test_hyperliquid_get_max_leverage(default_conf, mocker): + markets = { + "BTC/USDC:USDC": {"limits": {"leverage": {"max": 50}}}, + "ETH/USDC:USDC": {"limits": {"leverage": {"max": 50}}}, + "SOL/USDC:USDC": {"limits": {"leverage": {"max": 20}}}, + "DOGE/USDC:USDC": {"limits": {"leverage": {"max": 20}}}, + } + exchange = get_patched_exchange(mocker, default_conf, exchange="hyperliquid") + assert exchange.get_max_leverage("BTC/USDC:USDC", 1) == 1.0 + + default_conf["trading_mode"] = "futures" + default_conf["margin_mode"] = "isolated" + exchange = get_patched_exchange(mocker, default_conf, exchange="hyperliquid") + mocker.patch.multiple( + EXMS, + markets=PropertyMock(return_value=markets), + ) + + assert exchange.get_max_leverage("BTC/USDC:USDC", 1) == 50 + assert exchange.get_max_leverage("ETH/USDC:USDC", 20) == 50 + assert exchange.get_max_leverage("SOL/USDC:USDC", 50) == 20 + assert exchange.get_max_leverage("DOGE/USDC:USDC", 3) == 20 + + +def test_hyperliquid__lev_prep(default_conf, mocker): + api_mock = MagicMock() + api_mock.set_margin_mode = MagicMock() + type(api_mock).has = PropertyMock(return_value={"setMarginMode": True}) + exchange = get_patched_exchange(mocker, default_conf, api_mock, exchange="hyperliquid") + exchange._lev_prep("BTC/USDC:USDC", 3.2, "buy") + + assert api_mock.set_margin_mode.call_count == 0 + + # test in futures mode + api_mock.set_margin_mode.reset_mock() + default_conf["dry_run"] = False + + default_conf["trading_mode"] = "futures" + default_conf["margin_mode"] = "isolated" + + exchange = get_patched_exchange(mocker, default_conf, api_mock, exchange="hyperliquid") + exchange._lev_prep("BTC/USDC:USDC", 3.2, "buy") + + assert api_mock.set_margin_mode.call_count == 1 + api_mock.set_margin_mode.assert_called_with("isolated", "BTC/USDC:USDC", {"leverage": 3}) + + api_mock.reset_mock() + + exchange._lev_prep("BTC/USDC:USDC", 19.99, "sell") + + assert api_mock.set_margin_mode.call_count == 1 + api_mock.set_margin_mode.assert_called_with("isolated", "BTC/USDC:USDC", {"leverage": 19}) + + +def test_hyperliquid_fetch_order(default_conf_usdt, mocker): + default_conf_usdt["dry_run"] = False + + api_mock = MagicMock() + api_mock.fetch_order = MagicMock( + return_value={ + "id": "12345", + "symbol": "ETH/USDC:USDC", + "status": "closed", + "filled": 0.1, + "average": None, + "timestamp": 1630000000, + } + ) + + mocker.patch(f"{EXMS}.exchange_has", return_value=True) + gtfo_mock = mocker.patch( + f"{EXMS}.get_trades_for_order", + return_value=[ + { + "order_id": "12345", + "price": 1000, + "amount": 3, + "filled": 3, + "remaining": 0, + }, + { + "order_id": "12345", + "price": 3000, + "amount": 1, + "filled": 1, + "remaining": 0, + }, + ], + ) + exchange = get_patched_exchange(mocker, default_conf_usdt, api_mock, exchange="hyperliquid") + o = exchange.fetch_order("12345", "ETH/USDC:USDC") + # Uses weighted average + assert o["average"] == 1500 + + assert gtfo_mock.call_count == 1 diff --git a/tests/exchange/test_kraken.py b/tests/exchange/test_kraken.py index 5715c9cc04e..c3a3b1b935f 100644 --- a/tests/exchange/test_kraken.py +++ b/tests/exchange/test_kraken.py @@ -56,13 +56,14 @@ def test_kraken_trading_agreement(default_conf, mocker, order_type, time_in_forc assert api_mock.create_order.call_args[0][5] == expected_params -def test_get_balances_prod(default_conf, mocker): - balance_item = {"free": None, "total": 10.0, "used": 0.0} +def test_get_balances_prod_kraken(default_conf, mocker): + balance_item = {"free": 0.0, "total": 10.0, "used": 0.0} api_mock = MagicMock() api_mock.fetch_balance = MagicMock( return_value={ - "1ST": balance_item.copy(), + "1ST": {"free": 0.0, "total": 0.0, "used": 0.0}, + "1ST.F": balance_item.copy(), # When "rewards" is enabled, the balance is in ".F" "2ND": balance_item.copy(), "3RD": balance_item.copy(), "4TH": balance_item.copy(), diff --git a/tests/exchange_online/conftest.py b/tests/exchange_online/conftest.py index e9c594299c8..867ef15010c 100644 --- a/tests/exchange_online/conftest.py +++ b/tests/exchange_online/conftest.py @@ -30,40 +30,64 @@ "private_methods": ["fapiPrivateGetPositionSideDual", "fapiPrivateGetMultiAssetsMargin"], "sample_order": [ { - "symbol": "SOLUSDT", - "orderId": 3551312894, - "orderListId": -1, - "clientOrderId": "x-R4DD3S8297c73a11ccb9dc8f2811ba", - "transactTime": 1674493798550, - "price": "15.50000000", - "origQty": "1.10000000", - "executedQty": "0.00000000", - "cummulativeQuoteQty": "0.00000000", - "status": "NEW", - "timeInForce": "GTC", - "type": "LIMIT", - "side": "BUY", - "workingTime": 1674493798550, - "fills": [], - "selfTradePreventionMode": "NONE", + "exchange_response": { + "symbol": "SOLUSDT", + "orderId": 3551312894, + "orderListId": -1, + "clientOrderId": "x-R4DD3S8297c73a11ccb9dc8f2811ba", + "transactTime": 1674493798550, + "price": "15.50000000", + "origQty": "1.10000000", + "executedQty": "0.00000000", + "cummulativeQuoteQty": "0.00000000", + "status": "NEW", + "timeInForce": "GTC", + "type": "LIMIT", + "side": "BUY", + "workingTime": 1674493798550, + "fills": [], + "selfTradePreventionMode": "NONE", + }, + "pair": "SOL/USDT", + "expected": { + "symbol": "SOL/USDT", + "orderId": "3551312894", + "timestamp": 1674493798550, + "datetime": "2023-03-25T15:49:58.550Z", + "price": 15.5, + "status": "open", + "amount": 1.1, + }, }, { - "symbol": "SOLUSDT", - "orderId": 3551312894, - "orderListId": -1, - "clientOrderId": "x-R4DD3S8297c73a11ccb9dc8f2811ba", - "transactTime": 1674493798550, - "price": "15.50000000", - "origQty": "1.10000000", - "executedQty": "1.10000000", - "cummulativeQuoteQty": "17.05", - "status": "FILLED", - "timeInForce": "GTC", - "type": "LIMIT", - "side": "BUY", - "workingTime": 1674493798550, - "fills": [], - "selfTradePreventionMode": "NONE", + "exchange_response": { + "symbol": "SOLUSDT", + "orderId": 3551312894, + "orderListId": -1, + "clientOrderId": "x-R4DD3S8297c73a11ccb9dc8f2811ba", + "transactTime": 1674493798550, + "price": "15.50000000", + "origQty": "1.10000000", + "executedQty": "1.10000000", + "cummulativeQuoteQty": "17.05", + "status": "FILLED", + "timeInForce": "GTC", + "type": "LIMIT", + "side": "BUY", + "workingTime": 1674493798550, + "fills": [], + "selfTradePreventionMode": "NONE", + }, + "pair": "SOL/USDT", + "expected": { + "symbol": "SOL/USDT", + "orderId": "3551312894", + "timestamp": 1674493798550, + "datetime": "2023-03-25T15:49:58.550Z", + "price": 15.5, + "status": "open", + "amount": 1.1, + }, }, ], }, @@ -76,22 +100,34 @@ "skip_ws_tests": True, "sample_order": [ { - "symbol": "SOLUSDT", - "orderId": 3551312894, - "orderListId": -1, - "clientOrderId": "x-R4DD3S8297c73a11ccb9dc8f2811ba", - "transactTime": 1674493798550, - "price": "15.50000000", - "origQty": "1.10000000", - "executedQty": "0.00000000", - "cummulativeQuoteQty": "0.00000000", - "status": "NEW", - "timeInForce": "GTC", - "type": "LIMIT", - "side": "BUY", - "workingTime": 1674493798550, - "fills": [], - "selfTradePreventionMode": "NONE", + "exchange_response": { + "symbol": "SOLUSDT", + "orderId": 3551312894, + "orderListId": -1, + "clientOrderId": "x-R4DD3S8297c73a11ccb9dc8f2811ba", + "transactTime": 1674493798550, + "price": "15.50000000", + "origQty": "1.10000000", + "executedQty": "0.00000000", + "cummulativeQuoteQty": "0.00000000", + "status": "NEW", + "timeInForce": "GTC", + "type": "LIMIT", + "side": "BUY", + "workingTime": 1674493798550, + "fills": [], + "selfTradePreventionMode": "NONE", + }, + "pair": "SOL/USDT", + "expected": { + "symbol": "SOL/USDT", + "orderId": "3551312894", + "timestamp": 1674493798550, + "datetime": "2023-03-25T15:49:58.550Z", + "price": 15.5, + "status": "open", + "amount": 1.1, + }, } ], }, @@ -112,38 +148,62 @@ "leverage_tiers_public": False, "leverage_in_spot_market": True, "sample_order": [ - {"id": "63d6742d0adc5570001d2bbf7"}, # create order { - "id": "63d6742d0adc5570001d2bbf7", - "symbol": "SOL-USDT", - "opType": "DEAL", - "type": "limit", - "side": "buy", - "price": "15.5", - "size": "1.1", - "funds": "0", - "dealFunds": "17.05", - "dealSize": "1.1", - "fee": "0.000065252", - "feeCurrency": "USDT", - "stp": "", - "stop": "", - "stopTriggered": False, - "stopPrice": "0", - "timeInForce": "GTC", - "postOnly": False, - "hidden": False, - "iceberg": False, - "visibleSize": "0", - "cancelAfter": 0, - "channel": "API", - "clientOid": "0a053870-11bf-41e5-be61-b272a4cb62e1", - "remark": None, - "tags": "partner:ccxt", - "isActive": False, - "cancelExist": False, - "createdAt": 1674493798550, - "tradeType": "TRADE", + "exchange_response": {"id": "63d6742d0adc5570001d2bbf7"}, + "pair": "SOL/USDT", + "expected": { + "symbol": "SOL/USDT", + "orderId": "3551312894", + "timestamp": 1674493798550, + "datetime": "2023-03-25T15:49:58.550Z", + "price": 15.5, + "status": "open", + "amount": 1.1, + }, + }, # create order + { + "exchange_response": { + "id": "63d6742d0adc5570001d2bbf7", + "symbol": "SOL-USDT", + "opType": "DEAL", + "type": "limit", + "side": "buy", + "price": "15.5", + "size": "1.1", + "funds": "0", + "dealFunds": "17.05", + "dealSize": "1.1", + "fee": "0.000065252", + "feeCurrency": "USDT", + "stp": "", + "stop": "", + "stopTriggered": False, + "stopPrice": "0", + "timeInForce": "GTC", + "postOnly": False, + "hidden": False, + "iceberg": False, + "visibleSize": "0", + "cancelAfter": 0, + "channel": "API", + "clientOid": "0a053870-11bf-41e5-be61-b272a4cb62e1", + "remark": None, + "tags": "partner:ccxt", + "isActive": False, + "cancelExist": False, + "createdAt": 1674493798550, + "tradeType": "TRADE", + }, + "pair": "SOL/USDT", + "expected": { + "symbol": "SOL/USDT", + "orderId": "3551312894", + "timestamp": 1674493798550, + "datetime": "2023-03-25T15:49:58.550Z", + "price": 15.5, + "status": "open", + "amount": 1.1, + }, }, ], }, @@ -159,65 +219,89 @@ "leverage_in_spot_market": True, "sample_order": [ { - "id": "276266139423", - "text": "apiv4", - "create_time": "1674493798", - "update_time": "1674493798", - "create_time_ms": "1674493798550", - "update_time_ms": "1674493798550", - "status": "closed", - "currency_pair": "SOL_USDT", - "type": "limit", - "account": "spot", - "side": "buy", - "amount": "1.1", - "price": "15.5", - "time_in_force": "gtc", - "iceberg": "0", - "left": "0", - "fill_price": "17.05", - "filled_total": "17.05", - "avg_deal_price": "15.5", - "fee": "0.0000018", - "fee_currency": "SOL", - "point_fee": "0", - "gt_fee": "0", - "gt_maker_fee": "0", - "gt_taker_fee": "0.0015", - "gt_discount": True, - "rebated_fee": "0", - "rebated_fee_currency": "USDT", + "exchange_response": { + "id": "276266139423", + "text": "apiv4", + "create_time": "1674493798", + "update_time": "1674493798", + "create_time_ms": "1674493798550", + "update_time_ms": "1674493798550", + "status": "closed", + "currency_pair": "SOL_USDT", + "type": "limit", + "account": "spot", + "side": "buy", + "amount": "1.1", + "price": "15.5", + "time_in_force": "gtc", + "iceberg": "0", + "left": "0", + "fill_price": "17.05", + "filled_total": "17.05", + "avg_deal_price": "15.5", + "fee": "0.0000018", + "fee_currency": "SOL", + "point_fee": "0", + "gt_fee": "0", + "gt_maker_fee": "0", + "gt_taker_fee": "0.0015", + "gt_discount": True, + "rebated_fee": "0", + "rebated_fee_currency": "USDT", + }, + "pair": "SOL/USDT", + "expected": { + "symbol": "SOL/USDT", + "orderId": "3551312894", + "timestamp": 1674493798550, + "datetime": "2023-03-25T15:49:58.550Z", + "price": 15.5, + "status": "open", + "amount": 1.1, + }, }, { - # market order - "id": "276401180529", - "text": "apiv4", - "create_time": "1674493798", - "update_time": "1674493798", - "create_time_ms": "1674493798550", - "update_time_ms": "1674493798550", - "status": "cancelled", - "currency_pair": "SOL_USDT", - "type": "market", - "account": "spot", - "side": "buy", - "amount": "17.05", - "price": "0", - "time_in_force": "ioc", - "iceberg": "0", - "left": "0.0000000016228", - "fill_price": "17.05", - "filled_total": "17.05", - "avg_deal_price": "15.5", - "fee": "0", - "fee_currency": "SOL", - "point_fee": "0.0199999999967544", - "gt_fee": "0", - "gt_maker_fee": "0", - "gt_taker_fee": "0", - "gt_discount": False, - "rebated_fee": "0", - "rebated_fee_currency": "USDT", + "exchange_response": { + # market order + "id": "276401180529", + "text": "apiv4", + "create_time": "1674493798", + "update_time": "1674493798", + "create_time_ms": "1674493798550", + "update_time_ms": "1674493798550", + "status": "cancelled", + "currency_pair": "SOL_USDT", + "type": "market", + "account": "spot", + "side": "buy", + "amount": "17.05", + "price": "0", + "time_in_force": "ioc", + "iceberg": "0", + "left": "0.0000000016228", + "fill_price": "17.05", + "filled_total": "17.05", + "avg_deal_price": "15.5", + "fee": "0", + "fee_currency": "SOL", + "point_fee": "0.0199999999967544", + "gt_fee": "0", + "gt_maker_fee": "0", + "gt_taker_fee": "0", + "gt_discount": False, + "rebated_fee": "0", + "rebated_fee_currency": "USDT", + }, + "pair": "SOL/USDT", + "expected": { + "symbol": "SOL/USDT", + "orderId": "3551312894", + "timestamp": 1674493798550, + "datetime": "2023-03-25T15:49:58.550Z", + "price": 15.5, + "status": "open", + "amount": 1.1, + }, }, ], "sample_my_trades": [ @@ -264,19 +348,31 @@ "leverage_in_spot_market": True, "sample_order": [ { - "orderId": "1274754916287346280", - "orderLinkId": "1666798627015730", - "symbol": "SOLUSDT", - "createdTime": "1674493798550", - "price": "15.5", - "qty": "1.1", - "orderType": "Limit", - "side": "Buy", - "orderStatus": "New", - "timeInForce": "GTC", - "accountId": "5555555", - "execQty": "0", - "orderCategory": "0", + "exchange_response": { + "orderId": "1274754916287346280", + "orderLinkId": "1666798627015730", + "symbol": "SOLUSDT", + "createdTime": "1674493798550", + "price": "15.5", + "qty": "1.1", + "orderType": "Limit", + "side": "Buy", + "orderStatus": "New", + "timeInForce": "GTC", + "accountId": "5555555", + "execQty": "0", + "orderCategory": "0", + }, + "pair": "SOL/USDT", + "expected": { + "symbol": "SOL/USDT", + "orderId": "3551312894", + "timestamp": 1674493798550, + "datetime": "2023-03-25T15:49:58.550Z", + "price": 15.5, + "status": "open", + "amount": 1.1, + }, } ], }, @@ -310,35 +406,71 @@ "futures": False, "sample_order": [ { - "symbol": "SOL-USDT", - "orderId": "1762393630149869568", - "transactTime": "1674493798550", - "price": "15.5", - "stopPrice": "0", - "origQty": "1.1", - "executedQty": "1.1", - "cummulativeQuoteQty": "17.05", - "status": "FILLED", - "type": "LIMIT", - "side": "BUY", - "clientOrderID": "", + "exchange_response": { + "symbol": "SOL-USDT", + "orderId": "1762393630149869568", + "transactTime": "1674493798550", + "price": "15.5", + "stopPrice": "0", + "origQty": "1.1", + "executedQty": "1.1", + "cummulativeQuoteQty": "17.05", + "status": "FILLED", + "type": "LIMIT", + "side": "BUY", + "clientOrderID": "", + }, + "pair": "SOL/USDT", + "expected": { + "symbol": "SOL/USDT", + "orderId": "3551312894", + "timestamp": 1674493798550, + "datetime": "2023-03-25T15:49:58.550Z", + "price": 15.5, + "status": "open", + "amount": 1.1, + }, }, { - "symbol": "SOL-USDT", - "orderId": "1762393630149869568", - "transactTime": "1674493798550", - "price": "15.5", - "stopPrice": "0", - "origQty": "1.1", - "executedQty": "1.1", - "cummulativeQuoteQty": "17.05", - "status": "FILLED", - "type": "MARKET", - "side": "BUY", - "clientOrderID": "", + "exchange_response": { + "symbol": "SOL-USDT", + "orderId": "1762393630149869568", + "transactTime": "1674493798550", + "price": "15.5", + "stopPrice": "0", + "origQty": "1.1", + "executedQty": "1.1", + "cummulativeQuoteQty": "17.05", + "status": "FILLED", + "type": "MARKET", + "side": "BUY", + "clientOrderID": "", + }, + "pair": "SOL/USDT", + "expected": { + "symbol": "SOL/USDT", + "orderId": "3551312894", + "timestamp": 1674493798550, + "datetime": "2023-03-25T15:49:58.550Z", + "price": 15.5, + "status": "open", + "amount": 1.1, + }, }, ], }, + "hyperliquid": { + "pair": "PURR/USDC", + "stake_currency": "USDC", + "hasQuoteVolume": False, + "timeframe": "1h", + "futures": True, + "orderbook_max_entries": 20, + "futures_pair": "BTC/USDC:USDC", + "hasQuoteVolumeFutures": True, + "leverage_tiers_public": False, + "leverage_in_spot_market": False, + }, } @@ -398,6 +530,7 @@ def get_futures_exchange(exchange_name, exchange_conf, class_mocker): class_mocker.patch("freqtrade.exchange.okx.Okx.additional_exchange_init") class_mocker.patch("freqtrade.exchange.binance.Binance.additional_exchange_init") class_mocker.patch("freqtrade.exchange.bybit.Bybit.additional_exchange_init") + class_mocker.patch("freqtrade.exchange.gate.Gate.additional_exchange_init") class_mocker.patch(f"{EXMS}.load_cached_leverage_tiers", return_value=None) class_mocker.patch(f"{EXMS}.cache_leverage_tiers") diff --git a/tests/exchange_online/test_ccxt_compat.py b/tests/exchange_online/test_ccxt_compat.py index 32133d8e524..6ef0bc10829 100644 --- a/tests/exchange_online/test_ccxt_compat.py +++ b/tests/exchange_online/test_ccxt_compat.py @@ -61,28 +61,31 @@ def test_load_markets_futures(self, exchange_futures: EXCHANGE_FIXTURE_TYPE): def test_ccxt_order_parse(self, exchange: EXCHANGE_FIXTURE_TYPE): exch, exchange_name = exchange if orders := EXCHANGES[exchange_name].get("sample_order"): - pair = "SOL/USDT" for order in orders: + pair = order["pair"] + exchange_response: dict = order["exchange_response"] + market = exch._api.markets[pair] - po = exch._api.parse_order(order, market) + po = exch._api.parse_order(exchange_response, market) + expected = order["expected"] assert isinstance(po["id"], str) assert po["id"] is not None - if len(order.keys()) < 5: + if len(exchange_response.keys()) < 5: # Kucoin case assert po["status"] is None continue - assert po["timestamp"] == 1674493798550 + assert po["timestamp"] == expected["timestamp"] assert isinstance(po["datetime"], str) assert isinstance(po["timestamp"], int) assert isinstance(po["price"], float) - assert po["price"] == 15.5 + assert po["price"] == expected["price"] if po["status"] == "closed": # Filled orders should have average assigned. assert isinstance(po["average"], float) assert po["average"] == 15.5 assert po["symbol"] == pair assert isinstance(po["amount"], float) - assert po["amount"] == 1.1 + assert po["amount"] == expected["amount"] assert isinstance(po["status"], str) else: pytest.skip(f"No sample order available for exchange {exchange_name}") @@ -118,9 +121,10 @@ def test_ccxt_fetch_tickers(self, exchange: EXCHANGE_FIXTURE_TYPE): tickers = exch.get_tickers() assert pair in tickers assert "ask" in tickers[pair] - assert tickers[pair]["ask"] is not None assert "bid" in tickers[pair] - assert tickers[pair]["bid"] is not None + if EXCHANGES[exchangename].get("tickers_have_bid_ask"): + assert tickers[pair]["bid"] is not None + assert tickers[pair]["ask"] is not None assert "quoteVolume" in tickers[pair] if EXCHANGES[exchangename].get("hasQuoteVolume"): assert tickers[pair]["quoteVolume"] is not None @@ -150,9 +154,10 @@ def test_ccxt_fetch_ticker(self, exchange: EXCHANGE_FIXTURE_TYPE): ticker = exch.fetch_ticker(pair) assert "ask" in ticker - assert ticker["ask"] is not None assert "bid" in ticker - assert ticker["bid"] is not None + if EXCHANGES[exchangename].get("tickers_have_bid_ask"): + assert ticker["ask"] is not None + assert ticker["bid"] is not None assert "quoteVolume" in ticker if EXCHANGES[exchangename].get("hasQuoteVolume"): assert ticker["quoteVolume"] is not None diff --git a/tests/freqai/conftest.py b/tests/freqai/conftest.py index 442f530203a..9e14111af36 100644 --- a/tests/freqai/conftest.py +++ b/tests/freqai/conftest.py @@ -1,4 +1,3 @@ -import platform import sys from copy import deepcopy from pathlib import Path @@ -20,30 +19,6 @@ def is_py12() -> bool: return sys.version_info >= (3, 12) -def is_mac() -> bool: - machine = platform.system() - return "Darwin" in machine - - -def is_arm() -> bool: - machine = platform.machine() - return "arm" in machine or "aarch64" in machine - - -@pytest.fixture(autouse=True) -def patch_torch_initlogs(mocker) -> None: - if is_mac(): - # Mock torch import completely - import sys - import types - - module_name = "torch" - mocked_module = types.ModuleType(module_name) - sys.modules[module_name] = mocked_module - else: - mocker.patch("torch._logging._init_logs") - - @pytest.fixture(scope="function") def freqai_conf(default_conf, tmp_path): freqaiconf = deepcopy(default_conf) diff --git a/tests/freqai/test_freqai_datakitchen.py b/tests/freqai/test_freqai_datakitchen.py index 27efc3a662e..7a219e46ecc 100644 --- a/tests/freqai/test_freqai_datakitchen.py +++ b/tests/freqai/test_freqai_datakitchen.py @@ -10,11 +10,10 @@ from freqtrade.data.dataprovider import DataProvider from freqtrade.exceptions import OperationalException from freqtrade.freqai.data_kitchen import FreqaiDataKitchen -from tests.conftest import get_patched_exchange +from tests.conftest import get_patched_exchange, is_mac from tests.freqai.conftest import ( get_patched_data_kitchen, get_patched_freqai_strategy, - is_mac, make_unfiltered_dataframe, ) diff --git a/tests/freqai/test_freqai_interface.py b/tests/freqai/test_freqai_interface.py index 2779ddcb8a3..0710591c926 100644 --- a/tests/freqai/test_freqai_interface.py +++ b/tests/freqai/test_freqai_interface.py @@ -13,11 +13,16 @@ from freqtrade.optimize.backtesting import Backtesting from freqtrade.persistence import Trade from freqtrade.plugins.pairlistmanager import PairListManager -from tests.conftest import EXMS, create_mock_trades, get_patched_exchange, log_has_re -from tests.freqai.conftest import ( - get_patched_freqai_strategy, +from tests.conftest import ( + EXMS, + create_mock_trades, + get_patched_exchange, is_arm, is_mac, + log_has_re, +) +from tests.freqai.conftest import ( + get_patched_freqai_strategy, make_rl_config, mock_pytorch_mlp_model_training_parameters, ) diff --git a/tests/freqtradebot/test_freqtradebot.py b/tests/freqtradebot/test_freqtradebot.py index 836f8458085..0ea7e1124fe 100644 --- a/tests/freqtradebot/test_freqtradebot.py +++ b/tests/freqtradebot/test_freqtradebot.py @@ -374,7 +374,7 @@ def test_total_open_trades_stakes(mocker, default_conf_usdt, ticker_usdt, fee) - def test_create_trade( default_conf_usdt, ticker_usdt, limit_order, fee, mocker, is_short, open_rate ) -> None: - patch_RPCManager(mocker) + send_msg_mock = patch_RPCManager(mocker) patch_exchange(mocker) mocker.patch.multiple( EXMS, @@ -387,6 +387,7 @@ def test_create_trade( whitelist = deepcopy(default_conf_usdt["exchange"]["pair_whitelist"]) freqtrade = FreqtradeBot(default_conf_usdt) patch_get_signal(freqtrade, enter_short=is_short, enter_long=not is_short) + send_msg_mock.reset_mock() freqtrade.create_trade("ETH/USDT") trade = Trade.session.scalars(select(Trade)).first() @@ -402,6 +403,14 @@ def test_create_trade( limit_order[entry_side(is_short)], "ADA/USDT", entry_side(is_short) ) trade.update_trade(oobj) + assert send_msg_mock.call_count == 1 + entry_msg = send_msg_mock.call_args_list[0][0][0] + assert entry_msg["type"] == RPCMessageType.ENTRY + assert entry_msg["stake_amount"] == trade.stake_amount + assert entry_msg["stake_currency"] == default_conf_usdt["stake_currency"] + assert entry_msg["pair"] == "ETH/USDT" + assert entry_msg["direction"] == ("Short" if is_short else "Long") + assert entry_msg["sub_trade"] is False assert trade.open_rate == open_rate assert trade.amount == 30.0 @@ -3483,16 +3492,17 @@ def test_locked_pairs( exit_check=ExitCheckTuple(exit_type=ExitType.STOP_LOSS), ) trade.close(ticker_usdt_sell_down()["bid"]) - assert freqtrade.strategy.is_pair_locked(trade.pair, side="*") + assert not freqtrade.strategy.is_pair_locked(trade.pair, side="*") # Both sides are locked - assert freqtrade.strategy.is_pair_locked(trade.pair, side="long") - assert freqtrade.strategy.is_pair_locked(trade.pair, side="short") + assert freqtrade.strategy.is_pair_locked(trade.pair, side="long") != is_short + assert freqtrade.strategy.is_pair_locked(trade.pair, side="short") == is_short # reinit - should buy other pair. caplog.clear() freqtrade.enter_positions() + direction = "short" if is_short else "long" - assert log_has_re(rf"Pair {trade.pair} \* is locked.*", caplog) + assert log_has_re(rf"Pair {trade.pair} {direction} is locked.*", caplog) @pytest.mark.parametrize("is_short", [False, True]) @@ -3844,7 +3854,7 @@ def test_get_real_amount_no_trade(default_conf_usdt, buy_order_fee, caplog, mock assert log_has( "Applying fee on amount for Trade(id=None, pair=LTC/ETH, amount=8.00000000, " "is_short=False, leverage=1.0, open_rate=0.24544100, open_since=closed) failed: " - "myTrade-Dict empty found", + "myTrade-dict empty found", caplog, ) @@ -4020,7 +4030,7 @@ def test_get_real_amount_fees_order( default_conf_usdt, market_buy_order_usdt_doublefee, fee, mocker ): tfo_mock = mocker.patch(f"{EXMS}.get_trades_for_order", return_value=[]) - mocker.patch(f"{EXMS}.get_valid_pair_combination", return_value="BNB/USDT") + mocker.patch(f"{EXMS}.get_valid_pair_combination", return_value=["BNB/USDT"]) mocker.patch(f"{EXMS}.fetch_ticker", return_value={"last": 200}) trade = Trade( pair="LTC/USDT", @@ -5189,6 +5199,13 @@ def test_update_funding_fees( open_exit_order = limit_order_open[exit_side(is_short)] bid = 0.11 enter_rate_mock = MagicMock(return_value=bid) + open_order.update( + { + "status": "closed", + "filled": open_order["amount"], + "remaining": 0, + } + ) enter_mm = MagicMock(return_value=open_order) patch_RPCManager(mocker) patch_exchange(mocker) diff --git a/tests/leverage/test_update_liquidation_price.py b/tests/leverage/test_update_liquidation_price.py index 1b25babd039..68c35509fc3 100644 --- a/tests/leverage/test_update_liquidation_price.py +++ b/tests/leverage/test_update_liquidation_price.py @@ -29,7 +29,7 @@ def test_update_liquidation_prices(mocker, margin_mode, dry_run): assert trade_mock.set_liquidation_price.call_count == 1 - assert wallets.get_total.call_count == ( + assert wallets.get_collateral.call_count == ( 0 if margin_mode == MarginMode.ISOLATED or not dry_run else 1 ) diff --git a/tests/optimize/__init__.py b/tests/optimize/__init__.py index 15e19cd7506..dfce6d8c568 100644 --- a/tests/optimize/__init__.py +++ b/tests/optimize/__init__.py @@ -1,5 +1,5 @@ from datetime import timedelta -from typing import NamedTuple, Optional +from typing import NamedTuple from pandas import DataFrame @@ -20,7 +20,7 @@ class BTrade(NamedTuple): exit_reason: ExitType open_tick: int close_tick: int - enter_tag: Optional[str] = None + enter_tag: str | None = None is_short: bool = False @@ -36,15 +36,15 @@ class BTContainer(NamedTuple): profit_perc: float trailing_stop: bool = False trailing_only_offset_is_reached: bool = False - trailing_stop_positive: Optional[float] = None + trailing_stop_positive: float | None = None trailing_stop_positive_offset: float = 0.0 use_exit_signal: bool = False use_custom_stoploss: bool = False - custom_entry_price: Optional[float] = None - custom_exit_price: Optional[float] = None + custom_entry_price: float | None = None + custom_exit_price: float | None = None leverage: float = 1.0 - timeout: Optional[int] = None - adjust_entry_price: Optional[float] = None + timeout: int | None = None + adjust_entry_price: float | None = None def _get_frame_time_from_offset(offset): diff --git a/tests/optimize/test_backtest_detail.py b/tests/optimize/test_backtest_detail.py index e0a9e4480b7..63fa1bd9615 100644 --- a/tests/optimize/test_backtest_detail.py +++ b/tests/optimize/test_backtest_detail.py @@ -1121,6 +1121,70 @@ trades=[BTrade(exit_reason=ExitType.STOP_LOSS, open_tick=1, close_tick=2, is_short=True)], ) +# Test 54: Switch position from long to short +tc54 = BTContainer( + data=[ + # D O H L C V EL XL ES Xs BT + [0, 5000, 5050, 4950, 5000, 6172, 1, 0, 0, 0], + [1, 5000, 5000, 4951, 5000, 6172, 0, 0, 0, 0], + [2, 4910, 5150, 4910, 5100, 6172, 0, 0, 1, 0], # Enter short signal being ignored + [3, 5100, 5100, 4950, 4950, 6172, 0, 1, 1, 0], # exit - re-enter short + [4, 5000, 5100, 4950, 4950, 6172, 0, 0, 0, 1], + [5, 5000, 5100, 4950, 4950, 6172, 0, 0, 0, 0], + ], + stop_loss=-0.10, + roi={"0": 0.10}, + profit_perc=0.00, + use_exit_signal=True, + trades=[ + BTrade(exit_reason=ExitType.EXIT_SIGNAL, open_tick=1, close_tick=4, is_short=False), + BTrade(exit_reason=ExitType.EXIT_SIGNAL, open_tick=4, close_tick=5, is_short=True), + ], +) + +# Test 55: Switch position from short to long +tc55 = BTContainer( + data=[ + # D O H L C V EL XL ES Xs BT + [0, 5000, 5050, 4950, 5000, 6172, 0, 0, 1, 0], + [1, 5000, 5000, 4951, 5000, 6172, 1, 0, 0, 0], # Enter long signal being ignored + [2, 4910, 5150, 4910, 5100, 6172, 1, 0, 0, 1], # Exit - reenter long + [3, 5100, 5100, 4950, 4950, 6172, 0, 0, 0, 0], + [4, 5000, 5100, 4950, 4950, 6172, 0, 1, 0, 0], + [5, 5000, 5100, 4950, 4950, 6172, 0, 0, 0, 0], + ], + stop_loss=-0.10, + roi={"0": 0.10}, + profit_perc=-0.04, + use_exit_signal=True, + trades=[ + BTrade(exit_reason=ExitType.EXIT_SIGNAL, open_tick=1, close_tick=3, is_short=True), + BTrade(exit_reason=ExitType.EXIT_SIGNAL, open_tick=3, close_tick=5, is_short=False), + ], +) + +# Test 56: Switch position from long to short +tc56 = BTContainer( + data=[ + # D O H L C V EL XL ES Xs BT + [0, 5000, 5050, 4950, 5000, 6172, 1, 0, 0, 0], + [1, 5000, 5000, 4951, 5000, 6172, 0, 0, 0, 0], + [2, 4910, 5150, 4910, 5100, 6172, 0, 0, 1, 0], # exit on stoploss - re-enter short + [3, 5100, 5100, 4888, 4950, 6172, 0, 0, 0, 0], + [4, 5000, 5100, 4950, 4950, 6172, 0, 0, 0, 1], + [5, 5000, 5100, 4950, 4950, 6172, 0, 0, 0, 0], + ], + stop_loss=-0.02, + roi={"0": 0.10}, + profit_perc=-0.0, + use_exit_signal=True, + trades=[ + BTrade(exit_reason=ExitType.STOP_LOSS, open_tick=1, close_tick=3, is_short=False), + BTrade(exit_reason=ExitType.EXIT_SIGNAL, open_tick=3, close_tick=5, is_short=True), + ], +) + + TESTS = [ tc0, tc1, @@ -1176,6 +1240,9 @@ tc51, tc52, tc53, + tc54, + tc55, + tc56, ] diff --git a/tests/optimize/test_backtesting.py b/tests/optimize/test_backtesting.py index f064247c6c0..23922ee420e 100644 --- a/tests/optimize/test_backtesting.py +++ b/tests/optimize/test_backtesting.py @@ -189,7 +189,6 @@ def test_setup_bt_configuration_with_arguments(mocker, default_conf, caplog) -> "--timeframe", "1m", "--enable-position-stacking", - "--disable-max-market-positions", "--timerange", ":100", "--export-filename", @@ -214,10 +213,6 @@ def test_setup_bt_configuration_with_arguments(mocker, default_conf, caplog) -> assert "position_stacking" in config assert log_has("Parameter --enable-position-stacking detected ...", caplog) - assert "use_max_market_positions" in config - assert log_has("Parameter --disable-max-market-positions detected ...", caplog) - assert log_has("max_open_trades set to unlimited ...", caplog) - assert "timerange" in config assert log_has("Parameter --timerange detected: {} ...".format(config["timerange"]), caplog) @@ -376,8 +371,7 @@ def get_timerange(input1): mocker.patch("freqtrade.optimize.backtesting.Backtesting.backtest") mocker.patch("freqtrade.optimize.backtesting.generate_backtest_stats") mocker.patch("freqtrade.optimize.backtesting.show_backtest_results") - sbs = mocker.patch("freqtrade.optimize.backtesting.store_backtest_stats") - sbc = mocker.patch("freqtrade.optimize.backtesting.store_backtest_analysis_results") + sbs = mocker.patch("freqtrade.optimize.backtesting.store_backtest_results") mocker.patch( "freqtrade.plugins.pairlistmanager.PairListManager.whitelist", PropertyMock(return_value=["UNITTEST/BTC"]), @@ -402,7 +396,6 @@ def get_timerange(input1): assert backtesting.strategy.bot_start.call_count == 1 assert backtesting.strategy.bot_loop_start.call_count == 0 assert sbs.call_count == 1 - assert sbc.call_count == 1 def test_backtesting_start_no_data(default_conf, mocker, caplog, testdatadir) -> None: @@ -573,6 +566,9 @@ def test_backtest__enter_trade_futures(default_conf_usdt, fee, mocker) -> None: mocker.patch(f"{EXMS}.get_fee", fee) 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")) + mocker.patch( + "freqtrade.persistence.trade_model.price_to_precision", lambda p, *args, **kwargs: p + ) mocker.patch(f"{EXMS}.get_max_leverage", return_value=100) mocker.patch("freqtrade.optimize.backtesting.price_to_precision", lambda p, *args: p) patch_exchange(mocker) @@ -637,7 +633,7 @@ def test_backtest__enter_trade_futures(default_conf_usdt, fee, mocker) -> None: trade = backtesting._enter_trade(pair, row=row, direction="short") assert pytest.approx(trade.liquidation_price) == 0.11787191 assert pytest.approx(trade.orders[0].cost) == ( - trade.stake_amount * trade.leverage + trade.fee_open + trade.stake_amount * trade.leverage * (1 + fee.return_value) ) assert pytest.approx(trade.orders[-1].stake_amount) == trade.stake_amount @@ -1681,6 +1677,131 @@ def _trend_alternate_hold(dataframe=None, metadata=None): assert len(evaluate_result_multi(results["results"], "5m", 1)) == 0 +@pytest.mark.parametrize("use_detail", [True, False]) +@pytest.mark.parametrize("pair", ["ADA/USDT", "LTC/USDT"]) +@pytest.mark.parametrize("tres", [0, 20, 30]) +def test_backtest_multi_pair_detail_simplified( + default_conf_usdt, + fee, + mocker, + tres, + pair, + use_detail, +): + """ + literally the same as test_backtest_multi_pair_detail + but with an "always enter" strategy, exiting after about half of the candle duration. + """ + + def _always_buy(dataframe, metadata): + """ + Buy every xth candle - sell every other xth -2 (hold on to pairs a bit) + """ + dataframe["enter_long"] = 1 + dataframe["enter_short"] = 0 + dataframe["exit_short"] = 0 + return dataframe + + def custom_exit( + trade: Trade, + current_time: datetime, + **kwargs, + ) -> str | bool | None: + # Exit within the same candle. + if (trade.open_date_utc + timedelta(minutes=20)) < current_time: + return "exit after 20 minutes" + + default_conf_usdt.update( + { + "runmode": "backtest", + "stoploss": -1.0, + "minimal_roi": {"0": 100}, + } + ) + + if use_detail: + default_conf_usdt["timeframe_detail"] = "5m" + + 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")) + mocker.patch(f"{EXMS}.get_fee", fee) + patch_exchange(mocker) + + raw_candles_5m = generate_test_data("5m", 1000, "2022-01-03 12:00:00+00:00") + raw_candles = ohlcv_fill_up_missing_data(raw_candles_5m, "1h", "dummy") + + pairs = ["ADA/USDT", "DASH/USDT", "ETH/USDT", "LTC/USDT", "NXT/USDT"] + data = {pair: raw_candles for pair in pairs} + detail_data = {pair: raw_candles_5m for pair in pairs} + + # Only use 500 lines to increase performance + data = trim_dictlist(data, -200) + + # Remove data for one pair from the beginning of the data + if tres > 0: + data[pair] = data[pair][tres:].reset_index() + default_conf_usdt["timeframe"] = "1h" + default_conf_usdt["max_open_trades"] = 3 + + backtesting = Backtesting(default_conf_usdt) + vr_spy = mocker.spy(backtesting, "validate_row") + bl_spy = mocker.spy(backtesting, "backtest_loop") + backtesting.detail_data = detail_data + backtesting._set_strategy(backtesting.strategylist[0]) + backtesting.strategy.bot_loop_start = MagicMock() + backtesting.strategy.advise_entry = _always_buy # Override + backtesting.strategy.advise_exit = _always_buy # Override + backtesting.strategy.custom_exit = custom_exit # Override + + processed = backtesting.strategy.advise_all_indicators(data) + min_date, max_date = get_timerange(processed) + + backtest_conf = { + "processed": deepcopy(processed), + "start_date": min_date, + "end_date": max_date, + } + + results = backtesting.backtest(**backtest_conf) + + # bot_loop_start is called once per candle. + # assert backtesting.strategy.bot_loop_start.call_count == 83 + # Validated row once per candle and pair + assert vr_spy.call_count == 415 + + if use_detail: + # Backtest loop is called once per candle per pair + # Exact numbers depend on trade state - but should be around 3_800 + assert bl_spy.call_count > 3_350 + assert bl_spy.call_count < 3_800 + else: + assert bl_spy.call_count < 995 + + # Make sure we have parallel trades + assert len(evaluate_result_multi(results["results"], "1h", 2)) > 0 + # make sure we don't have trades with more than configured max_open_trades + assert len(evaluate_result_multi(results["results"], "1h", 3)) == 0 + + # # Cached data correctly removed amounts + offset = 1 if tres == 0 else 0 + removed_candles = len(data[pair]) - offset + assert len(backtesting.dataprovider.get_analyzed_dataframe(pair, "1h")[0]) == removed_candles + assert ( + len(backtesting.dataprovider.get_analyzed_dataframe("NXT/USDT", "1h")[0]) + == len(data["NXT/USDT"]) - 1 + ) + + backtesting.strategy.max_open_trades = 1 + backtesting.config.update({"max_open_trades": 1}) + backtest_conf = { + "processed": deepcopy(processed), + "start_date": min_date, + "end_date": max_date, + } + results = backtesting.backtest(**backtest_conf) + assert len(evaluate_result_multi(results["results"], "1h", 1)) == 0 + + @pytest.mark.parametrize("use_detail", [True, False]) def test_backtest_multi_pair_long_short_switch( default_conf_usdt, @@ -1722,6 +1843,7 @@ def _trend_alternate_hold(dataframe=None, metadata=None): if use_detail: default_conf_usdt["timeframe_detail"] = "1m" + mocker.patch(f"{EXMS}.price_to_precision", lambda s, x, y, **kwargs: y) 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")) mocker.patch(f"{EXMS}.get_fee", fee) @@ -1774,7 +1896,7 @@ def _trend_alternate_hold(dataframe=None, metadata=None): if use_detail: # Backtest loop is called once per candle per pair - assert bl_spy.call_count == 1071 + assert bl_spy.call_count == 1523 else: assert bl_spy.call_count == 479 @@ -1784,7 +1906,7 @@ def _trend_alternate_hold(dataframe=None, metadata=None): assert len(evaluate_result_multi(results["results"], "5m", 1)) == 0 # Expect 26 results initially - assert len(results["results"]) == 30 + assert len(results["results"]) == 53 def test_backtest_start_timerange(default_conf, mocker, caplog, testdatadir): @@ -1811,14 +1933,12 @@ def test_backtest_start_timerange(default_conf, mocker, caplog, testdatadir): "--timerange", "1510694220-1510700340", "--enable-position-stacking", - "--disable-max-market-positions", ] args = get_args(args) start_backtesting(args) # check the logs, that will contain the backtest result exists = [ "Parameter -i/--timeframe detected ... Using timeframe: 1m ...", - "Ignoring max_open_trades (--disable-max-market-positions was used) ...", "Parameter --timerange detected: 1510694220-1510700340 ...", f"Using data directory: {testdatadir} ...", "Loading data from 2017-11-14 20:57:00 up to 2017-11-14 22:59:00 (0 days).", @@ -1892,7 +2012,6 @@ def test_backtest_start_multi_strat(default_conf, mocker, caplog, testdatadir): "--timerange", "1510694220-1510700340", "--enable-position-stacking", - "--disable-max-market-positions", "--strategy-list", CURRENT_TEST_STRATEGY, "StrategyTestV2", @@ -1909,7 +2028,6 @@ def test_backtest_start_multi_strat(default_conf, mocker, caplog, testdatadir): # check the logs, that will contain the backtest result exists = [ "Parameter -i/--timeframe detected ... Using timeframe: 1m ...", - "Ignoring max_open_trades (--disable-max-market-positions was used) ...", "Parameter --timerange detected: 1510694220-1510700340 ...", f"Using data directory: {testdatadir} ...", "Loading data from 2017-11-14 20:57:00 up to 2017-11-14 22:59:00 (0 days).", @@ -2030,7 +2148,6 @@ def test_backtest_start_multi_strat_nomock(default_conf, mocker, caplog, testdat "--timerange", "1510694220-1510700340", "--enable-position-stacking", - "--disable-max-market-positions", "--breakdown", "day", "--strategy-list", @@ -2043,7 +2160,6 @@ def test_backtest_start_multi_strat_nomock(default_conf, mocker, caplog, testdat # check the logs, that will contain the backtest result exists = [ "Parameter -i/--timeframe detected ... Using timeframe: 1m ...", - "Ignoring max_open_trades (--disable-max-market-positions was used) ...", "Parameter --timerange detected: 1510694220-1510700340 ...", f"Using data directory: {testdatadir} ...", "Loading data from 2017-11-14 20:57:00 up to 2017-11-14 22:59:00 (0 days).", @@ -2468,7 +2584,6 @@ def test_backtest_start_multi_strat_caching( "--timerange", "1510694220-1510700340", "--enable-position-stacking", - "--disable-max-market-positions", "--cache", cache, "--strategy-list", @@ -2495,7 +2610,6 @@ def test_backtest_start_multi_strat_caching( exists = [ "Running backtesting for Strategy StrategyTestV2", "Running backtesting for Strategy StrategyTestV3", - "Ignoring max_open_trades (--disable-max-market-positions was used) ...", "Backtesting with data from 2017-11-14 21:17:00 up to 2017-11-14 22:59:00 (0 days).", ] elif run_id == "2" and min_backtest_date < start_time: @@ -2508,7 +2622,6 @@ def test_backtest_start_multi_strat_caching( exists = [ "Reusing result of previous backtest for StrategyTestV2", "Running backtesting for Strategy StrategyTestV3", - "Ignoring max_open_trades (--disable-max-market-positions was used) ...", "Backtesting with data from 2017-11-14 21:17:00 up to 2017-11-14 22:59:00 (0 days).", ] assert backtestmock.call_count == 1 diff --git a/tests/optimize/test_hyperopt.py b/tests/optimize/test_hyperopt.py index a9f6976290e..a0cc4eb736a 100644 --- a/tests/optimize/test_hyperopt.py +++ b/tests/optimize/test_hyperopt.py @@ -14,7 +14,7 @@ from freqtrade.enums import ExitType, RunMode from freqtrade.exceptions import OperationalException from freqtrade.optimize.hyperopt import Hyperopt -from freqtrade.optimize.hyperopt_auto import HyperOptAuto +from freqtrade.optimize.hyperopt.hyperopt_auto import HyperOptAuto from freqtrade.optimize.hyperopt_tools import HyperoptTools from freqtrade.optimize.optimize_reports import generate_strategy_stats from freqtrade.optimize.space import SKDecimal @@ -102,7 +102,6 @@ def test_setup_hyperopt_configuration_with_arguments(mocker, default_conf, caplo "--timerange", ":100", "--enable-position-stacking", - "--disable-max-market-positions", "--epochs", "1000", "--spaces", @@ -126,10 +125,6 @@ def test_setup_hyperopt_configuration_with_arguments(mocker, default_conf, caplo assert "position_stacking" in config assert log_has("Parameter --enable-position-stacking detected ...", caplog) - assert "use_max_market_positions" in config - assert log_has("Parameter --disable-max-market-positions detected ...", caplog) - assert log_has("max_open_trades set to unlimited ...", caplog) - assert "timerange" in config assert log_has("Parameter --timerange detected: {} ...".format(config["timerange"]), caplog) @@ -227,7 +222,7 @@ def test_start_no_data(mocker, hyperopt_conf, tmp_path) -> None: patched_configuration_load_config_file(mocker, hyperopt_conf) mocker.patch("freqtrade.data.history.load_pair_history", MagicMock(return_value=pd.DataFrame)) mocker.patch( - "freqtrade.optimize.hyperopt.get_timerange", + "freqtrade.optimize.hyperopt.hyperopt_optimizer.get_timerange", MagicMock(return_value=(datetime(2017, 12, 10), datetime(2017, 12, 13))), ) @@ -320,12 +315,17 @@ def test_roi_table_generation(hyperopt) -> None: "roi_p3": 3, } - assert hyperopt.custom_hyperopt.generate_roi_table(params) == {0: 6, 15: 3, 25: 1, 30: 0} + assert hyperopt.hyperopter.custom_hyperopt.generate_roi_table(params) == { + 0: 6, + 15: 3, + 25: 1, + 30: 0, + } def test_params_no_optimize_details(hyperopt) -> None: - hyperopt.config["spaces"] = ["buy"] - res = hyperopt._get_no_optimize_details() + hyperopt.hyperopter.config["spaces"] = ["buy"] + res = hyperopt.hyperopter._get_no_optimize_details() assert isinstance(res, dict) assert "trailing" in res assert res["trailing"]["trailing_stop"] is False @@ -338,21 +338,23 @@ def test_params_no_optimize_details(hyperopt) -> None: def test_start_calls_optimizer(mocker, hyperopt_conf, capsys) -> None: - dumper = mocker.patch("freqtrade.optimize.hyperopt.dump") + dumper = mocker.patch("freqtrade.optimize.hyperopt.hyperopt_optimizer.dump") dumper2 = mocker.patch("freqtrade.optimize.hyperopt.Hyperopt._save_result") - mocker.patch("freqtrade.optimize.hyperopt.calculate_market_change", return_value=1.5) - mocker.patch("freqtrade.optimize.hyperopt.file_dump_json") + mocker.patch( + "freqtrade.optimize.hyperopt.hyperopt_optimizer.calculate_market_change", return_value=1.5 + ) + mocker.patch("freqtrade.optimize.hyperopt.hyperopt.file_dump_json") mocker.patch( "freqtrade.optimize.backtesting.Backtesting.load_bt_data", MagicMock(return_value=(MagicMock(), None)), ) mocker.patch( - "freqtrade.optimize.hyperopt.get_timerange", + "freqtrade.optimize.hyperopt.hyperopt_optimizer.get_timerange", MagicMock(return_value=(datetime(2017, 12, 10), datetime(2017, 12, 13))), ) # Dummy-reduce points to ensure scikit-learn is forced to generate new values - mocker.patch("freqtrade.optimize.hyperopt.INITIAL_POINTS", 2) + mocker.patch("freqtrade.optimize.hyperopt.hyperopt.INITIAL_POINTS", 2) parallel = mocker.patch( "freqtrade.optimize.hyperopt.Hyperopt.run_optimizer_parallel", @@ -372,8 +374,8 @@ def test_start_calls_optimizer(mocker, hyperopt_conf, capsys) -> None: del hyperopt_conf["timeframe"] hyperopt = Hyperopt(hyperopt_conf) - hyperopt.backtesting.strategy.advise_all_indicators = MagicMock() - hyperopt.custom_hyperopt.generate_roi_table = MagicMock(return_value={}) + hyperopt.hyperopter.backtesting.strategy.advise_all_indicators = MagicMock() + hyperopt.hyperopter.custom_hyperopt.generate_roi_table = MagicMock(return_value={}) hyperopt.start() @@ -384,10 +386,12 @@ def test_start_calls_optimizer(mocker, hyperopt_conf, capsys) -> None: # Should be called for historical candle data assert dumper.call_count == 1 assert dumper2.call_count == 1 - assert hasattr(hyperopt.backtesting.strategy, "advise_exit") - assert hasattr(hyperopt.backtesting.strategy, "advise_entry") - assert hyperopt.backtesting.strategy.max_open_trades == hyperopt_conf["max_open_trades"] - assert hasattr(hyperopt.backtesting, "_position_stacking") + assert hasattr(hyperopt.hyperopter.backtesting.strategy, "advise_exit") + assert hasattr(hyperopt.hyperopter.backtesting.strategy, "advise_entry") + assert ( + hyperopt.hyperopter.backtesting.strategy.max_open_trades == hyperopt_conf["max_open_trades"] + ) + assert hasattr(hyperopt.hyperopter.backtesting, "_position_stacking") def test_hyperopt_format_results(hyperopt): @@ -466,7 +470,7 @@ def test_hyperopt_format_results(hyperopt): def test_populate_indicators(hyperopt, testdatadir) -> None: data = load_data(testdatadir, "1m", ["UNITTEST/BTC"], fill_up_missing=True) - dataframes = hyperopt.backtesting.strategy.advise_all_indicators(data) + dataframes = hyperopt.hyperopter.backtesting.strategy.advise_all_indicators(data) dataframe = dataframes["UNITTEST/BTC"] # Check if some indicators are generated. We will not test all of them @@ -526,15 +530,20 @@ def test_generate_optimizer(mocker, hyperopt_conf) -> None: "final_balance": 1000, } - mocker.patch("freqtrade.optimize.hyperopt.Backtesting.backtest", return_value=backtest_result) mocker.patch( - "freqtrade.optimize.hyperopt.get_timerange", + "freqtrade.optimize.hyperopt.hyperopt_optimizer.Backtesting.backtest", + return_value=backtest_result, + ) + mocker.patch( + "freqtrade.optimize.hyperopt.hyperopt_optimizer.get_timerange", return_value=(dt_utc(2017, 12, 10), dt_utc(2017, 12, 13)), ) patch_exchange(mocker) mocker.patch.object(Path, "open") mocker.patch("freqtrade.configuration.config_validation.validate_config_schema") - mocker.patch("freqtrade.optimize.hyperopt.load", return_value={"XRP/BTC": None}) + mocker.patch( + "freqtrade.optimize.hyperopt.hyperopt_optimizer.load", return_value={"XRP/BTC": None} + ) optimizer_param = { "buy_plusdi": 0.02, @@ -594,10 +603,12 @@ def test_generate_optimizer(mocker, hyperopt_conf) -> None: } hyperopt = Hyperopt(hyperopt_conf) - hyperopt.min_date = dt_utc(2017, 12, 10) - hyperopt.max_date = dt_utc(2017, 12, 13) - hyperopt.init_spaces() - generate_optimizer_value = hyperopt.generate_optimizer(list(optimizer_param.values())) + hyperopt.hyperopter.min_date = dt_utc(2017, 12, 10) + hyperopt.hyperopter.max_date = dt_utc(2017, 12, 13) + hyperopt.hyperopter.init_spaces() + generate_optimizer_value = hyperopt.hyperopter.generate_optimizer( + list(optimizer_param.values()) + ) assert generate_optimizer_value == response_expected @@ -608,8 +619,8 @@ def test_clean_hyperopt(mocker, hyperopt_conf, caplog): "freqtrade.strategy.hyper.HyperStrategyMixin.load_params_from_file", MagicMock(return_value={}), ) - mocker.patch("freqtrade.optimize.hyperopt.Path.is_file", MagicMock(return_value=True)) - unlinkmock = mocker.patch("freqtrade.optimize.hyperopt.Path.unlink", MagicMock()) + mocker.patch("freqtrade.optimize.hyperopt.hyperopt.Path.is_file", MagicMock(return_value=True)) + unlinkmock = mocker.patch("freqtrade.optimize.hyperopt.hyperopt.Path.unlink", MagicMock()) h = Hyperopt(hyperopt_conf) assert unlinkmock.call_count == 2 @@ -617,17 +628,19 @@ def test_clean_hyperopt(mocker, hyperopt_conf, caplog): def test_print_json_spaces_all(mocker, hyperopt_conf, capsys) -> None: - dumper = mocker.patch("freqtrade.optimize.hyperopt.dump") + dumper = mocker.patch("freqtrade.optimize.hyperopt.hyperopt_optimizer.dump") dumper2 = mocker.patch("freqtrade.optimize.hyperopt.Hyperopt._save_result") - mocker.patch("freqtrade.optimize.hyperopt.file_dump_json") - mocker.patch("freqtrade.optimize.hyperopt.calculate_market_change", return_value=1.5) + mocker.patch("freqtrade.optimize.hyperopt.hyperopt.file_dump_json") + mocker.patch( + "freqtrade.optimize.hyperopt.hyperopt_optimizer.calculate_market_change", return_value=1.5 + ) mocker.patch( "freqtrade.optimize.backtesting.Backtesting.load_bt_data", MagicMock(return_value=(MagicMock(), None)), ) mocker.patch( - "freqtrade.optimize.hyperopt.get_timerange", + "freqtrade.optimize.hyperopt.hyperopt_optimizer.get_timerange", MagicMock(return_value=(datetime(2017, 12, 10), datetime(2017, 12, 13))), ) @@ -663,8 +676,8 @@ def test_print_json_spaces_all(mocker, hyperopt_conf, capsys) -> None: ) hyperopt = Hyperopt(hyperopt_conf) - hyperopt.backtesting.strategy.advise_all_indicators = MagicMock() - hyperopt.custom_hyperopt.generate_roi_table = MagicMock(return_value={}) + hyperopt.hyperopter.backtesting.strategy.advise_all_indicators = MagicMock() + hyperopt.hyperopter.custom_hyperopt.generate_roi_table = MagicMock(return_value={}) hyperopt.start() @@ -682,16 +695,18 @@ def test_print_json_spaces_all(mocker, hyperopt_conf, capsys) -> None: def test_print_json_spaces_default(mocker, hyperopt_conf, capsys) -> None: - dumper = mocker.patch("freqtrade.optimize.hyperopt.dump") + dumper = mocker.patch("freqtrade.optimize.hyperopt.hyperopt_optimizer.dump") dumper2 = mocker.patch("freqtrade.optimize.hyperopt.Hyperopt._save_result") - mocker.patch("freqtrade.optimize.hyperopt.file_dump_json") - mocker.patch("freqtrade.optimize.hyperopt.calculate_market_change", return_value=1.5) + mocker.patch("freqtrade.optimize.hyperopt.hyperopt.file_dump_json") + mocker.patch( + "freqtrade.optimize.hyperopt.hyperopt_optimizer.calculate_market_change", return_value=1.5 + ) mocker.patch( "freqtrade.optimize.backtesting.Backtesting.load_bt_data", MagicMock(return_value=(MagicMock(), None)), ) mocker.patch( - "freqtrade.optimize.hyperopt.get_timerange", + "freqtrade.optimize.hyperopt.hyperopt_optimizer.get_timerange", MagicMock(return_value=(datetime(2017, 12, 10), datetime(2017, 12, 13))), ) @@ -719,8 +734,8 @@ def test_print_json_spaces_default(mocker, hyperopt_conf, capsys) -> None: hyperopt_conf.update({"print_json": True}) hyperopt = Hyperopt(hyperopt_conf) - hyperopt.backtesting.strategy.advise_all_indicators = MagicMock() - hyperopt.custom_hyperopt.generate_roi_table = MagicMock(return_value={}) + hyperopt.hyperopter.backtesting.strategy.advise_all_indicators = MagicMock() + hyperopt.hyperopter.custom_hyperopt.generate_roi_table = MagicMock(return_value={}) hyperopt.start() @@ -737,16 +752,18 @@ def test_print_json_spaces_default(mocker, hyperopt_conf, capsys) -> None: def test_print_json_spaces_roi_stoploss(mocker, hyperopt_conf, capsys) -> None: - dumper = mocker.patch("freqtrade.optimize.hyperopt.dump") + dumper = mocker.patch("freqtrade.optimize.hyperopt.hyperopt_optimizer.dump") dumper2 = mocker.patch("freqtrade.optimize.hyperopt.Hyperopt._save_result") - mocker.patch("freqtrade.optimize.hyperopt.calculate_market_change", return_value=1.5) - mocker.patch("freqtrade.optimize.hyperopt.file_dump_json") + mocker.patch( + "freqtrade.optimize.hyperopt.hyperopt_optimizer.calculate_market_change", return_value=1.5 + ) + mocker.patch("freqtrade.optimize.hyperopt.hyperopt.file_dump_json") mocker.patch( "freqtrade.optimize.backtesting.Backtesting.load_bt_data", MagicMock(return_value=(MagicMock(), None)), ) mocker.patch( - "freqtrade.optimize.hyperopt.get_timerange", + "freqtrade.optimize.hyperopt.hyperopt_optimizer.get_timerange", MagicMock(return_value=(datetime(2017, 12, 10), datetime(2017, 12, 13))), ) @@ -775,8 +792,8 @@ def test_print_json_spaces_roi_stoploss(mocker, hyperopt_conf, capsys) -> None: ) hyperopt = Hyperopt(hyperopt_conf) - hyperopt.backtesting.strategy.advise_all_indicators = MagicMock() - hyperopt.custom_hyperopt.generate_roi_table = MagicMock(return_value={}) + hyperopt.hyperopter.backtesting.strategy.advise_all_indicators = MagicMock() + hyperopt.hyperopter.custom_hyperopt.generate_roi_table = MagicMock(return_value={}) hyperopt.start() @@ -790,16 +807,18 @@ def test_print_json_spaces_roi_stoploss(mocker, hyperopt_conf, capsys) -> None: def test_simplified_interface_roi_stoploss(mocker, hyperopt_conf, capsys) -> None: - dumper = mocker.patch("freqtrade.optimize.hyperopt.dump") + dumper = mocker.patch("freqtrade.optimize.hyperopt.hyperopt_optimizer.dump") dumper2 = mocker.patch("freqtrade.optimize.hyperopt.Hyperopt._save_result") - mocker.patch("freqtrade.optimize.hyperopt.calculate_market_change", return_value=1.5) - mocker.patch("freqtrade.optimize.hyperopt.file_dump_json") + mocker.patch( + "freqtrade.optimize.hyperopt.hyperopt_optimizer.calculate_market_change", return_value=1.5 + ) + mocker.patch("freqtrade.optimize.hyperopt.hyperopt.file_dump_json") mocker.patch( "freqtrade.optimize.backtesting.Backtesting.load_bt_data", MagicMock(return_value=(MagicMock(), None)), ) mocker.patch( - "freqtrade.optimize.hyperopt.get_timerange", + "freqtrade.optimize.hyperopt.hyperopt_optimizer.get_timerange", MagicMock(return_value=(datetime(2017, 12, 10), datetime(2017, 12, 13))), ) @@ -821,8 +840,8 @@ def test_simplified_interface_roi_stoploss(mocker, hyperopt_conf, capsys) -> Non hyperopt_conf.update({"spaces": "roi stoploss"}) hyperopt = Hyperopt(hyperopt_conf) - hyperopt.backtesting.strategy.advise_all_indicators = MagicMock() - hyperopt.custom_hyperopt.generate_roi_table = MagicMock(return_value={}) + hyperopt.hyperopter.backtesting.strategy.advise_all_indicators = MagicMock() + hyperopt.hyperopter.custom_hyperopt.generate_roi_table = MagicMock(return_value={}) hyperopt.start() @@ -833,21 +852,23 @@ def test_simplified_interface_roi_stoploss(mocker, hyperopt_conf, capsys) -> Non assert dumper.call_count == 1 assert dumper2.call_count == 1 - assert hasattr(hyperopt.backtesting.strategy, "advise_exit") - assert hasattr(hyperopt.backtesting.strategy, "advise_entry") - assert hyperopt.backtesting.strategy.max_open_trades == hyperopt_conf["max_open_trades"] - assert hasattr(hyperopt.backtesting, "_position_stacking") + assert hasattr(hyperopt.hyperopter.backtesting.strategy, "advise_exit") + assert hasattr(hyperopt.hyperopter.backtesting.strategy, "advise_entry") + assert ( + hyperopt.hyperopter.backtesting.strategy.max_open_trades == hyperopt_conf["max_open_trades"] + ) + assert hasattr(hyperopt.hyperopter.backtesting, "_position_stacking") def test_simplified_interface_all_failed(mocker, hyperopt_conf, caplog) -> None: - mocker.patch("freqtrade.optimize.hyperopt.dump", MagicMock()) - mocker.patch("freqtrade.optimize.hyperopt.file_dump_json") + mocker.patch("freqtrade.optimize.hyperopt.hyperopt_optimizer.dump", MagicMock()) + mocker.patch("freqtrade.optimize.hyperopt.hyperopt.file_dump_json") mocker.patch( "freqtrade.optimize.backtesting.Backtesting.load_bt_data", MagicMock(return_value=(MagicMock(), None)), ) mocker.patch( - "freqtrade.optimize.hyperopt.get_timerange", + "freqtrade.optimize.hyperopt.hyperopt_optimizer.get_timerange", MagicMock(return_value=(datetime(2017, 12, 10), datetime(2017, 12, 13))), ) @@ -860,34 +881,37 @@ def test_simplified_interface_all_failed(mocker, hyperopt_conf, caplog) -> None: ) mocker.patch( - "freqtrade.optimize.hyperopt_auto.HyperOptAuto._generate_indicator_space", return_value=[] + "freqtrade.optimize.hyperopt.hyperopt_auto.HyperOptAuto._generate_indicator_space", + return_value=[], ) hyperopt = Hyperopt(hyperopt_conf) - hyperopt.backtesting.strategy.advise_all_indicators = MagicMock() - hyperopt.custom_hyperopt.generate_roi_table = MagicMock(return_value={}) + hyperopt.hyperopter.backtesting.strategy.advise_all_indicators = MagicMock() + hyperopt.hyperopter.custom_hyperopt.generate_roi_table = MagicMock(return_value={}) with pytest.raises(OperationalException, match=r"The 'protection' space is included into *"): - hyperopt.init_spaces() + hyperopt.hyperopter.init_spaces() hyperopt.config["hyperopt_ignore_missing_space"] = True caplog.clear() - hyperopt.init_spaces() + hyperopt.hyperopter.init_spaces() assert log_has_re(r"The 'protection' space is included into *", caplog) - assert hyperopt.protection_space == [] + assert hyperopt.hyperopter.protection_space == [] def test_simplified_interface_buy(mocker, hyperopt_conf, capsys) -> None: - dumper = mocker.patch("freqtrade.optimize.hyperopt.dump") + dumper = mocker.patch("freqtrade.optimize.hyperopt.hyperopt_optimizer.dump") dumper2 = mocker.patch("freqtrade.optimize.hyperopt.Hyperopt._save_result") - mocker.patch("freqtrade.optimize.hyperopt.calculate_market_change", return_value=1.5) - mocker.patch("freqtrade.optimize.hyperopt.file_dump_json") + mocker.patch( + "freqtrade.optimize.hyperopt.hyperopt_optimizer.calculate_market_change", return_value=1.5 + ) + mocker.patch("freqtrade.optimize.hyperopt.hyperopt.file_dump_json") mocker.patch( "freqtrade.optimize.backtesting.Backtesting.load_bt_data", MagicMock(return_value=(MagicMock(), None)), ) mocker.patch( - "freqtrade.optimize.hyperopt.get_timerange", + "freqtrade.optimize.hyperopt.hyperopt_optimizer.get_timerange", MagicMock(return_value=(datetime(2017, 12, 10), datetime(2017, 12, 13))), ) @@ -909,8 +933,8 @@ def test_simplified_interface_buy(mocker, hyperopt_conf, capsys) -> None: hyperopt_conf.update({"spaces": "buy"}) hyperopt = Hyperopt(hyperopt_conf) - hyperopt.backtesting.strategy.advise_all_indicators = MagicMock() - hyperopt.custom_hyperopt.generate_roi_table = MagicMock(return_value={}) + hyperopt.hyperopter.backtesting.strategy.advise_all_indicators = MagicMock() + hyperopt.hyperopter.custom_hyperopt.generate_roi_table = MagicMock(return_value={}) hyperopt.start() @@ -921,23 +945,27 @@ def test_simplified_interface_buy(mocker, hyperopt_conf, capsys) -> None: assert dumper.called assert dumper.call_count == 1 assert dumper2.call_count == 1 - assert hasattr(hyperopt.backtesting.strategy, "advise_exit") - assert hasattr(hyperopt.backtesting.strategy, "advise_entry") - assert hyperopt.backtesting.strategy.max_open_trades == hyperopt_conf["max_open_trades"] - assert hasattr(hyperopt.backtesting, "_position_stacking") + assert hasattr(hyperopt.hyperopter.backtesting.strategy, "advise_exit") + assert hasattr(hyperopt.hyperopter.backtesting.strategy, "advise_entry") + assert ( + hyperopt.hyperopter.backtesting.strategy.max_open_trades == hyperopt_conf["max_open_trades"] + ) + assert hasattr(hyperopt.hyperopter.backtesting, "_position_stacking") def test_simplified_interface_sell(mocker, hyperopt_conf, capsys) -> None: - dumper = mocker.patch("freqtrade.optimize.hyperopt.dump") + dumper = mocker.patch("freqtrade.optimize.hyperopt.hyperopt_optimizer.dump") dumper2 = mocker.patch("freqtrade.optimize.hyperopt.Hyperopt._save_result") - mocker.patch("freqtrade.optimize.hyperopt.calculate_market_change", return_value=1.5) - mocker.patch("freqtrade.optimize.hyperopt.file_dump_json") + mocker.patch( + "freqtrade.optimize.hyperopt.hyperopt_optimizer.calculate_market_change", return_value=1.5 + ) + mocker.patch("freqtrade.optimize.hyperopt.hyperopt.file_dump_json") mocker.patch( "freqtrade.optimize.backtesting.Backtesting.load_bt_data", MagicMock(return_value=(MagicMock(), None)), ) mocker.patch( - "freqtrade.optimize.hyperopt.get_timerange", + "freqtrade.optimize.hyperopt.hyperopt_optimizer.get_timerange", MagicMock(return_value=(datetime(2017, 12, 10), datetime(2017, 12, 13))), ) @@ -963,8 +991,8 @@ def test_simplified_interface_sell(mocker, hyperopt_conf, capsys) -> None: ) hyperopt = Hyperopt(hyperopt_conf) - hyperopt.backtesting.strategy.advise_all_indicators = MagicMock() - hyperopt.custom_hyperopt.generate_roi_table = MagicMock(return_value={}) + hyperopt.hyperopter.backtesting.strategy.advise_all_indicators = MagicMock() + hyperopt.hyperopter.custom_hyperopt.generate_roi_table = MagicMock(return_value={}) hyperopt.start() @@ -975,10 +1003,12 @@ def test_simplified_interface_sell(mocker, hyperopt_conf, capsys) -> None: assert dumper.called assert dumper.call_count == 1 assert dumper2.call_count == 1 - assert hasattr(hyperopt.backtesting.strategy, "advise_exit") - assert hasattr(hyperopt.backtesting.strategy, "advise_entry") - assert hyperopt.backtesting.strategy.max_open_trades == hyperopt_conf["max_open_trades"] - assert hasattr(hyperopt.backtesting, "_position_stacking") + assert hasattr(hyperopt.hyperopter.backtesting.strategy, "advise_exit") + assert hasattr(hyperopt.hyperopter.backtesting.strategy, "advise_entry") + assert ( + hyperopt.hyperopter.backtesting.strategy.max_open_trades == hyperopt_conf["max_open_trades"] + ) + assert hasattr(hyperopt.hyperopter.backtesting, "_position_stacking") @pytest.mark.parametrize( @@ -990,18 +1020,19 @@ def test_simplified_interface_sell(mocker, hyperopt_conf, capsys) -> None: ], ) def test_simplified_interface_failed(mocker, hyperopt_conf, space) -> None: - mocker.patch("freqtrade.optimize.hyperopt.dump", MagicMock()) - mocker.patch("freqtrade.optimize.hyperopt.file_dump_json") + mocker.patch("freqtrade.optimize.hyperopt.hyperopt_optimizer.dump", MagicMock()) + mocker.patch("freqtrade.optimize.hyperopt.hyperopt.file_dump_json") mocker.patch( "freqtrade.optimize.backtesting.Backtesting.load_bt_data", MagicMock(return_value=(MagicMock(), None)), ) mocker.patch( - "freqtrade.optimize.hyperopt.get_timerange", + "freqtrade.optimize.hyperopt.hyperopt_optimizer.get_timerange", MagicMock(return_value=(datetime(2017, 12, 10), datetime(2017, 12, 13))), ) mocker.patch( - "freqtrade.optimize.hyperopt_auto.HyperOptAuto._generate_indicator_space", return_value=[] + "freqtrade.optimize.hyperopt.hyperopt_auto.HyperOptAuto._generate_indicator_space", + return_value=[], ) patch_exchange(mocker) @@ -1009,8 +1040,8 @@ def test_simplified_interface_failed(mocker, hyperopt_conf, space) -> None: hyperopt_conf.update({"spaces": space}) hyperopt = Hyperopt(hyperopt_conf) - hyperopt.backtesting.strategy.advise_all_indicators = MagicMock() - hyperopt.custom_hyperopt.generate_roi_table = MagicMock(return_value={}) + hyperopt.hyperopter.backtesting.strategy.advise_all_indicators = MagicMock() + hyperopt.hyperopter.custom_hyperopt.generate_roi_table = MagicMock(return_value={}) with pytest.raises(OperationalException, match=f"The '{space}' space is included into *"): hyperopt.start() @@ -1020,7 +1051,7 @@ def test_in_strategy_auto_hyperopt(mocker, hyperopt_conf, tmp_path, fee) -> None patch_exchange(mocker) mocker.patch(f"{EXMS}.get_fee", fee) # Dummy-reduce points to ensure scikit-learn is forced to generate new values - mocker.patch("freqtrade.optimize.hyperopt.INITIAL_POINTS", 2) + mocker.patch("freqtrade.optimize.hyperopt.hyperopt.INITIAL_POINTS", 2) (tmp_path / "hyperopt_results").mkdir(parents=True) # No hyperopt needed hyperopt_conf.update( @@ -1032,32 +1063,33 @@ def test_in_strategy_auto_hyperopt(mocker, hyperopt_conf, tmp_path, fee) -> None } ) hyperopt = Hyperopt(hyperopt_conf) - hyperopt.backtesting.exchange.get_max_leverage = MagicMock(return_value=1.0) - assert isinstance(hyperopt.custom_hyperopt, HyperOptAuto) - assert isinstance(hyperopt.backtesting.strategy.buy_rsi, IntParameter) - assert hyperopt.backtesting.strategy.bot_started is True - assert hyperopt.backtesting.strategy.bot_loop_started is False - - assert hyperopt.backtesting.strategy.buy_rsi.in_space is True - assert hyperopt.backtesting.strategy.buy_rsi.value == 35 - assert hyperopt.backtesting.strategy.sell_rsi.value == 74 - assert hyperopt.backtesting.strategy.protection_cooldown_lookback.value == 30 - assert hyperopt.backtesting.strategy.max_open_trades == 1 - buy_rsi_range = hyperopt.backtesting.strategy.buy_rsi.range + opt = hyperopt.hyperopter + opt.backtesting.exchange.get_max_leverage = MagicMock(return_value=1.0) + assert isinstance(opt.custom_hyperopt, HyperOptAuto) + assert isinstance(opt.backtesting.strategy.buy_rsi, IntParameter) + assert opt.backtesting.strategy.bot_started is True + assert opt.backtesting.strategy.bot_loop_started is False + + assert opt.backtesting.strategy.buy_rsi.in_space is True + assert opt.backtesting.strategy.buy_rsi.value == 35 + assert opt.backtesting.strategy.sell_rsi.value == 74 + assert opt.backtesting.strategy.protection_cooldown_lookback.value == 30 + assert opt.backtesting.strategy.max_open_trades == 1 + buy_rsi_range = opt.backtesting.strategy.buy_rsi.range assert isinstance(buy_rsi_range, range) # Range from 0 - 50 (inclusive) assert len(list(buy_rsi_range)) == 51 hyperopt.start() # All values should've changed. - assert hyperopt.backtesting.strategy.protection_cooldown_lookback.value != 30 - assert hyperopt.backtesting.strategy.buy_rsi.value != 35 - assert hyperopt.backtesting.strategy.sell_rsi.value != 74 - assert hyperopt.backtesting.strategy.max_open_trades != 1 + assert opt.backtesting.strategy.protection_cooldown_lookback.value != 30 + assert opt.backtesting.strategy.buy_rsi.value != 35 + assert opt.backtesting.strategy.sell_rsi.value != 74 + assert opt.backtesting.strategy.max_open_trades != 1 - hyperopt.custom_hyperopt.generate_estimator = lambda *args, **kwargs: "ET1" + opt.custom_hyperopt.generate_estimator = lambda *args, **kwargs: "ET1" with pytest.raises(OperationalException, match="Estimator ET1 not supported."): - hyperopt.get_optimizer([], 2) + opt.get_optimizer(2, 42, 2, 2) @pytest.mark.filterwarnings("ignore::DeprecationWarning") @@ -1068,7 +1100,7 @@ def test_in_strategy_auto_hyperopt_with_parallel(mocker, hyperopt_conf, tmp_path mocker.patch(f"{EXMS}.markets", PropertyMock(return_value=get_markets())) (tmp_path / "hyperopt_results").mkdir(parents=True) # Dummy-reduce points to ensure scikit-learn is forced to generate new values - mocker.patch("freqtrade.optimize.hyperopt.INITIAL_POINTS", 2) + mocker.patch("freqtrade.optimize.hyperopt.hyperopt.INITIAL_POINTS", 2) # No hyperopt needed hyperopt_conf.update( { @@ -1083,21 +1115,22 @@ def test_in_strategy_auto_hyperopt_with_parallel(mocker, hyperopt_conf, tmp_path } ) hyperopt = Hyperopt(hyperopt_conf) - hyperopt.backtesting.exchange.get_max_leverage = lambda *x, **xx: 1.0 - hyperopt.backtesting.exchange.get_min_pair_stake_amount = lambda *x, **xx: 0.00001 - hyperopt.backtesting.exchange.get_max_pair_stake_amount = lambda *x, **xx: 100.0 - hyperopt.backtesting.exchange._markets = get_markets() - - assert isinstance(hyperopt.custom_hyperopt, HyperOptAuto) - assert isinstance(hyperopt.backtesting.strategy.buy_rsi, IntParameter) - assert hyperopt.backtesting.strategy.bot_started is True - assert hyperopt.backtesting.strategy.bot_loop_started is False - - assert hyperopt.backtesting.strategy.buy_rsi.in_space is True - assert hyperopt.backtesting.strategy.buy_rsi.value == 35 - assert hyperopt.backtesting.strategy.sell_rsi.value == 74 - assert hyperopt.backtesting.strategy.protection_cooldown_lookback.value == 30 - buy_rsi_range = hyperopt.backtesting.strategy.buy_rsi.range + opt = hyperopt.hyperopter + opt.backtesting.exchange.get_max_leverage = lambda *x, **xx: 1.0 + opt.backtesting.exchange.get_min_pair_stake_amount = lambda *x, **xx: 0.00001 + opt.backtesting.exchange.get_max_pair_stake_amount = lambda *x, **xx: 100.0 + opt.backtesting.exchange._markets = get_markets() + + assert isinstance(opt.custom_hyperopt, HyperOptAuto) + assert isinstance(opt.backtesting.strategy.buy_rsi, IntParameter) + assert opt.backtesting.strategy.bot_started is True + assert opt.backtesting.strategy.bot_loop_started is False + + assert opt.backtesting.strategy.buy_rsi.in_space is True + assert opt.backtesting.strategy.buy_rsi.value == 35 + assert opt.backtesting.strategy.sell_rsi.value == 74 + assert opt.backtesting.strategy.protection_cooldown_lookback.value == 30 + buy_rsi_range = opt.backtesting.strategy.buy_rsi.range assert isinstance(buy_rsi_range, range) # Range from 0 - 50 (inclusive) assert len(list(buy_rsi_range)) == 51 @@ -1121,7 +1154,7 @@ def test_in_strategy_auto_hyperopt_per_epoch(mocker, hyperopt_conf, tmp_path, fe } ) go = mocker.patch( - "freqtrade.optimize.hyperopt.Hyperopt.generate_optimizer", + "freqtrade.optimize.hyperopt.hyperopt_optimizer.HyperOptimizer.generate_optimizer", return_value={ "loss": 0.05, "results_explanation": "foo result", @@ -1130,17 +1163,18 @@ def test_in_strategy_auto_hyperopt_per_epoch(mocker, hyperopt_conf, tmp_path, fe }, ) hyperopt = Hyperopt(hyperopt_conf) - hyperopt.backtesting.exchange.get_max_leverage = MagicMock(return_value=1.0) - assert isinstance(hyperopt.custom_hyperopt, HyperOptAuto) - assert isinstance(hyperopt.backtesting.strategy.buy_rsi, IntParameter) - assert hyperopt.backtesting.strategy.bot_loop_started is False - assert hyperopt.backtesting.strategy.bot_started is True - - assert hyperopt.backtesting.strategy.buy_rsi.in_space is True - assert hyperopt.backtesting.strategy.buy_rsi.value == 35 - assert hyperopt.backtesting.strategy.sell_rsi.value == 74 - assert hyperopt.backtesting.strategy.protection_cooldown_lookback.value == 30 - buy_rsi_range = hyperopt.backtesting.strategy.buy_rsi.range + opt = hyperopt.hyperopter + opt.backtesting.exchange.get_max_leverage = MagicMock(return_value=1.0) + assert isinstance(opt.custom_hyperopt, HyperOptAuto) + assert isinstance(opt.backtesting.strategy.buy_rsi, IntParameter) + assert opt.backtesting.strategy.bot_loop_started is False + assert opt.backtesting.strategy.bot_started is True + + assert opt.backtesting.strategy.buy_rsi.in_space is True + assert opt.backtesting.strategy.buy_rsi.value == 35 + assert opt.backtesting.strategy.sell_rsi.value == 74 + assert opt.backtesting.strategy.protection_cooldown_lookback.value == 30 + buy_rsi_range = opt.backtesting.strategy.buy_rsi.range assert isinstance(buy_rsi_range, range) # Range from 0 - 50 (inclusive) assert len(list(buy_rsi_range)) == 51 @@ -1184,17 +1218,17 @@ def test_stake_amount_unlimited_max_open_trades(mocker, hyperopt_conf, tmp_path, ) hyperopt = Hyperopt(hyperopt_conf) mocker.patch( - "freqtrade.optimize.hyperopt.Hyperopt._get_params_dict", + "freqtrade.optimize.hyperopt.hyperopt_optimizer.HyperOptimizer._get_params_dict", return_value={"max_open_trades": -1}, ) - assert isinstance(hyperopt.custom_hyperopt, HyperOptAuto) + assert isinstance(hyperopt.hyperopter.custom_hyperopt, HyperOptAuto) - assert hyperopt.backtesting.strategy.max_open_trades == 1 + assert hyperopt.hyperopter.backtesting.strategy.max_open_trades == 1 hyperopt.start() - assert hyperopt.backtesting.strategy.max_open_trades == 1 + assert hyperopt.hyperopter.backtesting.strategy.max_open_trades == 1 def test_max_open_trades_dump(mocker, hyperopt_conf, tmp_path, fee, capsys) -> None: @@ -1213,11 +1247,11 @@ def test_max_open_trades_dump(mocker, hyperopt_conf, tmp_path, fee, capsys) -> N ) hyperopt = Hyperopt(hyperopt_conf) mocker.patch( - "freqtrade.optimize.hyperopt.Hyperopt._get_params_dict", + "freqtrade.optimize.hyperopt.hyperopt_optimizer.HyperOptimizer._get_params_dict", return_value={"max_open_trades": -1}, ) - assert isinstance(hyperopt.custom_hyperopt, HyperOptAuto) + assert isinstance(hyperopt.hyperopter.custom_hyperopt, HyperOptAuto) hyperopt.start() @@ -1232,11 +1266,11 @@ def test_max_open_trades_dump(mocker, hyperopt_conf, tmp_path, fee, capsys) -> N hyperopt = Hyperopt(hyperopt_conf) mocker.patch( - "freqtrade.optimize.hyperopt.Hyperopt._get_params_dict", + "freqtrade.optimize.hyperopt.hyperopt_optimizer.HyperOptimizer._get_params_dict", return_value={"max_open_trades": -1}, ) - assert isinstance(hyperopt.custom_hyperopt, HyperOptAuto) + assert isinstance(hyperopt.hyperopter.custom_hyperopt, HyperOptAuto) hyperopt.start() @@ -1267,9 +1301,9 @@ def test_max_open_trades_consistency(mocker, hyperopt_conf, tmp_path, fee) -> No ) hyperopt = Hyperopt(hyperopt_conf) - assert isinstance(hyperopt.custom_hyperopt, HyperOptAuto) + assert isinstance(hyperopt.hyperopter.custom_hyperopt, HyperOptAuto) - hyperopt.custom_hyperopt.max_open_trades_space = lambda: [ + hyperopt.hyperopter.custom_hyperopt.max_open_trades_space = lambda: [ Integer(1, 10, name="max_open_trades") ] @@ -1287,11 +1321,13 @@ def wrapper(*args, **kwargs): return wrapper - hyperopt.backtesting.wallets._calculate_unlimited_stake_amount = stake_amount_interceptor( - hyperopt.backtesting.wallets._calculate_unlimited_stake_amount + hyperopt.hyperopter.backtesting.wallets._calculate_unlimited_stake_amount = ( + stake_amount_interceptor( + hyperopt.hyperopter.backtesting.wallets._calculate_unlimited_stake_amount + ) ) hyperopt.start() - assert hyperopt.backtesting.strategy.max_open_trades == 8 + assert hyperopt.hyperopter.backtesting.strategy.max_open_trades == 8 assert hyperopt.config["max_open_trades"] == 8 diff --git a/tests/optimize/test_hyperoptloss.py b/tests/optimize/test_hyperoptloss.py index 53de37a0e2a..8f1b1c7867e 100644 --- a/tests/optimize/test_hyperoptloss.py +++ b/tests/optimize/test_hyperoptloss.py @@ -39,13 +39,34 @@ def test_loss_calculation_prefer_correct_trade_count(hyperopt_conf, hyperopt_res hyperopt_conf.update({"hyperopt_loss": "ShortTradeDurHyperOptLoss"}) hl = HyperOptLossResolver.load_hyperoptloss(hyperopt_conf) correct = hl.hyperopt_loss_function( - hyperopt_results, 600, datetime(2019, 1, 1), datetime(2019, 5, 1) + results=hyperopt_results, + trade_count=600, + min_date=datetime(2019, 1, 1), + max_date=datetime(2019, 5, 1), + config=hyperopt_conf, + processed=None, + backtest_stats={"profit_total": hyperopt_results["profit_abs"].sum()}, + starting_balance=hyperopt_conf["dry_run_wallet"], ) over = hl.hyperopt_loss_function( - hyperopt_results, 600 + 100, datetime(2019, 1, 1), datetime(2019, 5, 1) + results=hyperopt_results, + trade_count=600 + 100, + min_date=datetime(2019, 1, 1), + max_date=datetime(2019, 5, 1), + config=hyperopt_conf, + processed=None, + backtest_stats={"profit_total": hyperopt_results["profit_abs"].sum()}, + starting_balance=hyperopt_conf["dry_run_wallet"], ) under = hl.hyperopt_loss_function( - hyperopt_results, 600 - 100, datetime(2019, 1, 1), datetime(2019, 5, 1) + results=hyperopt_results, + trade_count=600 - 100, + min_date=datetime(2019, 1, 1), + max_date=datetime(2019, 5, 1), + config=hyperopt_conf, + processed=None, + backtest_stats={"profit_total": hyperopt_results["profit_abs"].sum()}, + starting_balance=hyperopt_conf["dry_run_wallet"], ) assert over > correct assert under > correct @@ -58,9 +79,25 @@ def test_loss_calculation_prefer_shorter_trades(hyperopt_conf, hyperopt_results) hyperopt_conf.update({"hyperopt_loss": "ShortTradeDurHyperOptLoss"}) hl = HyperOptLossResolver.load_hyperoptloss(hyperopt_conf) longer = hl.hyperopt_loss_function( - hyperopt_results, 100, datetime(2019, 1, 1), datetime(2019, 5, 1) + results=hyperopt_results, + trade_count=100, + min_date=datetime(2019, 1, 1), + max_date=datetime(2019, 5, 1), + config=hyperopt_conf, + processed=None, + backtest_stats={"profit_total": hyperopt_results["profit_abs"].sum()}, + starting_balance=hyperopt_conf["dry_run_wallet"], + ) + shorter = hl.hyperopt_loss_function( + results=resultsb, + trade_count=100, + min_date=datetime(2019, 1, 1), + max_date=datetime(2019, 5, 1), + config=hyperopt_conf, + processed=None, + backtest_stats={"profit_total": resultsb["profit_abs"].sum()}, + starting_balance=hyperopt_conf["dry_run_wallet"], ) - shorter = hl.hyperopt_loss_function(resultsb, 100, datetime(2019, 1, 1), datetime(2019, 5, 1)) assert shorter < longer @@ -73,11 +110,34 @@ def test_loss_calculation_has_limited_profit(hyperopt_conf, hyperopt_results) -> hyperopt_conf.update({"hyperopt_loss": "ShortTradeDurHyperOptLoss"}) hl = HyperOptLossResolver.load_hyperoptloss(hyperopt_conf) correct = hl.hyperopt_loss_function( - hyperopt_results, 600, datetime(2019, 1, 1), datetime(2019, 5, 1) + results=hyperopt_results, + trade_count=600, + min_date=datetime(2019, 1, 1), + max_date=datetime(2019, 5, 1), + config=hyperopt_conf, + processed=None, + backtest_stats={"profit_total": hyperopt_results["profit_abs"].sum()}, + starting_balance=hyperopt_conf["dry_run_wallet"], + ) + over = hl.hyperopt_loss_function( + results=results_over, + trade_count=600, + min_date=datetime(2019, 1, 1), + max_date=datetime(2019, 5, 1), + config=hyperopt_conf, + processed=None, + backtest_stats={"profit_total": results_over["profit_abs"].sum()}, + starting_balance=hyperopt_conf["dry_run_wallet"], ) - over = hl.hyperopt_loss_function(results_over, 600, datetime(2019, 1, 1), datetime(2019, 5, 1)) under = hl.hyperopt_loss_function( - results_under, 600, datetime(2019, 1, 1), datetime(2019, 5, 1) + results=results_under, + trade_count=600, + min_date=datetime(2019, 1, 1), + max_date=datetime(2019, 5, 1), + config=hyperopt_conf, + processed=None, + backtest_stats={"profit_total": results_under["profit_abs"].sum()}, + starting_balance=hyperopt_conf["dry_run_wallet"], ) assert over < correct assert under > correct @@ -109,31 +169,34 @@ def test_loss_functions_better_profits(default_conf, hyperopt_results, lossfunct default_conf.update({"hyperopt_loss": lossfunction}) hl = HyperOptLossResolver.load_hyperoptloss(default_conf) correct = hl.hyperopt_loss_function( - hyperopt_results, + results=hyperopt_results, trade_count=len(hyperopt_results), min_date=datetime(2019, 1, 1), max_date=datetime(2019, 5, 1), config=default_conf, processed=None, backtest_stats={"profit_total": hyperopt_results["profit_abs"].sum()}, + starting_balance=default_conf["dry_run_wallet"], ) over = hl.hyperopt_loss_function( - results_over, + results=results_over, trade_count=len(results_over), min_date=datetime(2019, 1, 1), max_date=datetime(2019, 5, 1), config=default_conf, processed=None, backtest_stats={"profit_total": results_over["profit_abs"].sum()}, + starting_balance=default_conf["dry_run_wallet"], ) under = hl.hyperopt_loss_function( - results_under, + results=results_under, trade_count=len(results_under), min_date=datetime(2019, 1, 1), max_date=datetime(2019, 5, 1), config=default_conf, processed=None, backtest_stats={"profit_total": results_under["profit_abs"].sum()}, + starting_balance=default_conf["dry_run_wallet"], ) assert over < correct assert under > correct diff --git a/tests/optimize/test_optimize_reports.py b/tests/optimize/test_optimize_reports.py index 40673a1b66b..77fb106556b 100644 --- a/tests/optimize/test_optimize_reports.py +++ b/tests/optimize/test_optimize_reports.py @@ -26,8 +26,7 @@ generate_strategy_comparison, generate_trading_stats, show_sorted_pairlist, - store_backtest_analysis_results, - store_backtest_stats, + store_backtest_results, text_table_bt_results, text_table_strategy, ) @@ -226,8 +225,9 @@ def test_generate_backtest_stats(default_conf, testdatadir, tmp_path): filename_last = tmp_path / LAST_BT_RESULT_FN _backup_file(filename_last, copy_file=True) assert not filename.is_file() + default_conf["exportfilename"] = filename - store_backtest_stats(filename, stats, "2022_01_01_15_05_13") + store_backtest_results(default_conf, stats, "2022_01_01_15_05_13") # get real Filename (it's btresult-.json) last_fn = get_latest_backtest_filename(filename_last.parent) @@ -246,11 +246,12 @@ def test_generate_backtest_stats(default_conf, testdatadir, tmp_path): filename1.unlink() -def test_store_backtest_stats(testdatadir, mocker): +def test_store_backtest_results(testdatadir, mocker): dump_mock = mocker.patch("freqtrade.optimize.optimize_reports.bt_storage.file_dump_json") data = {"metadata": {}, "strategy": {}, "strategy_comparison": []} - store_backtest_stats(testdatadir, data, "2022_01_01_15_05_13") + + store_backtest_results({"exportfilename": testdatadir}, data, "2022_01_01_15_05_13") assert dump_mock.call_count == 3 assert isinstance(dump_mock.call_args_list[0][0][0], Path) @@ -258,16 +259,16 @@ def test_store_backtest_stats(testdatadir, mocker): dump_mock.reset_mock() filename = testdatadir / "testresult.json" - store_backtest_stats(filename, data, "2022_01_01_15_05_13") + store_backtest_results({"exportfilename": filename}, data, "2022_01_01_15_05_13") assert dump_mock.call_count == 3 assert isinstance(dump_mock.call_args_list[0][0][0], Path) # result will be testdatadir / testresult-.json assert str(dump_mock.call_args_list[0][0][0]).startswith(str(testdatadir / "testresult")) -def test_store_backtest_stats_real(tmp_path): +def test_store_backtest_results_real(tmp_path): data = {"metadata": {}, "strategy": {}, "strategy_comparison": []} - store_backtest_stats(tmp_path, data, "2022_01_01_15_05_13") + store_backtest_results({"exportfilename": tmp_path}, data, "2022_01_01_15_05_13") assert (tmp_path / "backtest-result-2022_01_01_15_05_13.json").is_file() assert (tmp_path / "backtest-result-2022_01_01_15_05_13.meta.json").is_file() @@ -276,7 +277,9 @@ def test_store_backtest_stats_real(tmp_path): fn = get_latest_backtest_filename(tmp_path) assert fn == "backtest-result-2022_01_01_15_05_13.json" - store_backtest_stats(tmp_path, data, "2024_01_01_15_05_25", market_change_data=pd.DataFrame()) + store_backtest_results( + {"exportfilename": tmp_path}, data, "2024_01_01_15_05_25", market_change_data=pd.DataFrame() + ) assert (tmp_path / "backtest-result-2024_01_01_15_05_25.json").is_file() assert (tmp_path / "backtest-result-2024_01_01_15_05_25.meta.json").is_file() assert (tmp_path / "backtest-result-2024_01_01_15_05_25_market_change.feather").is_file() @@ -287,13 +290,27 @@ def test_store_backtest_stats_real(tmp_path): assert fn == "backtest-result-2024_01_01_15_05_25.json" -def test_store_backtest_candles(testdatadir, mocker): +def test_store_backtest_candles(tmp_path, mocker): + mocker.patch("freqtrade.optimize.optimize_reports.bt_storage.file_dump_json") dump_mock = mocker.patch("freqtrade.optimize.optimize_reports.bt_storage.file_dump_joblib") candle_dict = {"DefStrat": {"UNITTEST/BTC": pd.DataFrame()}} + bt_results = {"metadata": {}, "strategy": {}, "strategy_comparison": []} + + mock_conf = { + "exportfilename": tmp_path, + "export": "signals", + "runmode": "backtest", + } # mock directory exporting - store_backtest_analysis_results(testdatadir, candle_dict, {}, {}, "2022_01_01_15_05_13") + data = { + "signals": candle_dict, + "rejected": {}, + "exited": {}, + } + + store_backtest_results(mock_conf, bt_results, "2022_01_01_15_05_13", analysis_results=data) assert dump_mock.call_count == 3 assert isinstance(dump_mock.call_args_list[0][0][0], Path) @@ -303,11 +320,12 @@ def test_store_backtest_candles(testdatadir, mocker): dump_mock.reset_mock() # mock file exporting - filename = Path(testdatadir / "testresult") - store_backtest_analysis_results(filename, candle_dict, {}, {}, "2022_01_01_15_05_13") + filename = Path(tmp_path / "testresult") + mock_conf["exportfilename"] = filename + store_backtest_results(mock_conf, bt_results, "2022_01_01_15_05_13", analysis_results=data) assert dump_mock.call_count == 3 assert isinstance(dump_mock.call_args_list[0][0][0], Path) - # result will be testdatadir / testresult-_signals.pkl + # result will be tmp_path / testresult-_signals.pkl assert str(dump_mock.call_args_list[0][0][0]).endswith("_signals.pkl") assert str(dump_mock.call_args_list[1][0][0]).endswith("_rejected.pkl") assert str(dump_mock.call_args_list[2][0][0]).endswith("_exited.pkl") @@ -317,10 +335,21 @@ def test_store_backtest_candles(testdatadir, mocker): def test_write_read_backtest_candles(tmp_path): candle_dict = {"DefStrat": {"UNITTEST/BTC": pd.DataFrame()}} + bt_results = {"metadata": {}, "strategy": {}, "strategy_comparison": []} + mock_conf = { + "exportfilename": tmp_path, + "export": "signals", + "runmode": "backtest", + } # test directory exporting sample_date = "2022_01_01_15_05_13" - store_backtest_analysis_results(tmp_path, candle_dict, {}, {}, sample_date) + data = { + "signals": candle_dict, + "rejected": {}, + "exited": {}, + } + store_backtest_results(mock_conf, bt_results, sample_date, analysis_results=data) stored_file = tmp_path / f"backtest-result-{sample_date}_signals.pkl" with stored_file.open("rb") as scp: pickled_signal_candles = joblib.load(scp) @@ -335,7 +364,8 @@ def test_write_read_backtest_candles(tmp_path): # test file exporting filename = tmp_path / "testresult" - store_backtest_analysis_results(filename, candle_dict, {}, {}, sample_date) + mock_conf["exportfilename"] = filename + store_backtest_results(mock_conf, bt_results, sample_date, analysis_results=data) stored_file = tmp_path / f"testresult-{sample_date}_signals.pkl" with stored_file.open("rb") as scp: pickled_signal_candles = joblib.load(scp) diff --git a/tests/persistence/test_persistence.py b/tests/persistence/test_persistence.py index 05160c74a70..a5e237a45fa 100644 --- a/tests/persistence/test_persistence.py +++ b/tests/persistence/test_persistence.py @@ -2144,6 +2144,7 @@ def test_Trade_object_idem(): "bt_trades_open", "bt_trades_open_pp", "bt_open_open_trade_count", + "bt_open_open_trade_count_candle", "bt_total_profit", "from_json", ) @@ -2682,6 +2683,36 @@ def test_select_filled_orders(fee): assert len(orders) == 0 +@pytest.mark.usefixtures("init_persistence") +def test_select_filled_orders_usdt(fee): + create_mock_trades_usdt(fee) + + trades = Trade.get_trades().all() + + # Closed buy order, no sell order + orders = trades[0].select_filled_orders("buy") + assert isinstance(orders, list) + assert len(orders) == 1 + assert orders[0].amount == 2.0 + assert orders[0].filled == 2.0 + assert orders[0].side == "buy" + assert orders[0].price == 10.0 + assert orders[0].stake_amount == 20 + assert orders[0].stake_amount_filled == 20 + + orders = trades[3].select_filled_orders("buy") + assert isinstance(orders, list) + assert len(orders) == 0 + orders = trades[3].select_filled_or_open_orders() + assert isinstance(orders, list) + assert len(orders) == 1 + assert orders[0].price == 2.0 + assert orders[0].amount == 10 + assert orders[0].filled == 0 + assert orders[0].stake_amount == 20 + assert orders[0].stake_amount_filled == 0 + + @pytest.mark.usefixtures("init_persistence") def test_order_to_ccxt(limit_buy_order_open, limit_sell_order_usdt_open): order = Order.parse_from_ccxt_object(limit_buy_order_open, "mocked", "buy") diff --git a/tests/plugins/test_pairlist.py b/tests/plugins/test_pairlist.py index 1c138cc559e..a4f66a702aa 100644 --- a/tests/plugins/test_pairlist.py +++ b/tests/plugins/test_pairlist.py @@ -2450,7 +2450,7 @@ def test_MarketCapPairList_filter_special_no_pair_from_coingecko( assert pm.whitelist == [] -def test_MarketCapPairList_exceptions(mocker, default_conf_usdt): +def test_MarketCapPairList_exceptions(mocker, default_conf_usdt, caplog): exchange = get_patched_exchange(mocker, default_conf_usdt) default_conf_usdt["pairlists"] = [{"method": "MarketCapPairList"}] with pytest.raises(OperationalException, match=r"`number_assets` not specified.*"): @@ -2458,13 +2458,11 @@ def test_MarketCapPairList_exceptions(mocker, default_conf_usdt): PairListManager(exchange, default_conf_usdt) default_conf_usdt["pairlists"] = [ - {"method": "MarketCapPairList", "number_assets": 20, "max_rank": 260} + {"method": "MarketCapPairList", "number_assets": 20, "max_rank": 500} ] - with pytest.raises( - OperationalException, match="This filter only support marketcap rank up to 250." - ): + with caplog.at_level(logging.WARNING): PairListManager(exchange, default_conf_usdt) - + assert log_has_re("The max rank you have set \\(500\\) is quite high", caplog) # Test invalid coinmarkets list mocker.patch( "freqtrade.plugins.pairlist.MarketCapPairList.FtCoinGeckoApi.get_coins_categories_list", diff --git a/tests/plugins/test_pairlocks.py b/tests/plugins/test_pairlocks.py index 0102079fe7a..f227818b3e0 100644 --- a/tests/plugins/test_pairlocks.py +++ b/tests/plugins/test_pairlocks.py @@ -37,6 +37,7 @@ def test_PairLocks(use_db): assert not PairLocks.is_pair_locked(pair) assert not PairLocks.is_pair_locked(pair, side="long") assert PairLocks.is_pair_locked(pair, side="short") + assert len(PairLocks.get_pair_locks(pair)) == 1 # XRP/BTC should not be locked now pair = "XRP/BTC" @@ -47,9 +48,11 @@ def test_PairLocks(use_db): PairLocks.lock_pair(pair, dt_now() + timedelta(minutes=4)) assert PairLocks.is_pair_locked(pair) - # Get both locks from above + # Get all locks from above locks = PairLocks.get_pair_locks(None) - assert len(locks) == 2 + assert len(locks) == 4 + + assert len(PairLocks.get_pair_locks(None, side="*")) == 2 # Unlock original pair pair = "ETH/BTC" diff --git a/tests/plugins/test_percentchangepairlist.py b/tests/plugins/test_percentchangepairlist.py index df165cf9860..6f399fc9f43 100644 --- a/tests/plugins/test_percentchangepairlist.py +++ b/tests/plugins/test_percentchangepairlist.py @@ -360,9 +360,16 @@ def test_gen_pairlist_from_tickers(mocker, rpl_config, tickers): exchange = get_patched_exchange(mocker, rpl_config, exchange="binance") pairlistmanager = PairListManager(exchange, rpl_config) - remote_pairlist = PercentChangePairList( - exchange, pairlistmanager, rpl_config, rpl_config["pairlists"][0], 0 - ) + remote_pairlist = pairlistmanager._pairlist_handlers[0] + + # The generator returns BTC ETH and TKN - filtering the first ensures removing pairs + # in this step ain't problematic. + def _validate_pair(pair, ticker): + if pair == "BTC/USDT": + return False + return True + + remote_pairlist._validate_pair = _validate_pair result = remote_pairlist.gen_pairlist(tickers.return_value) diff --git a/tests/rpc/test_fiat_convert.py b/tests/rpc/test_fiat_convert.py index 061df2e5387..4ae7441c8e5 100644 --- a/tests/rpc/test_fiat_convert.py +++ b/tests/rpc/test_fiat_convert.py @@ -206,14 +206,16 @@ def test_convert_amount(mocker): def test_FtCoinGeckoApi(): ftc = FtCoinGeckoApi() - assert ftc._api_key == "" + assert ftc.extra_params is None assert ftc.api_base_url == "https://api.coingecko.com/api/v3/" # defaults to demo ftc = FtCoinGeckoApi(api_key="123456") - assert ftc._api_key == "123456" + assert ftc.extra_params is not None + assert ftc.extra_params["x_cg_demo_api_key"] == "123456" assert ftc.api_base_url == "https://api.coingecko.com/api/v3/" ftc = FtCoinGeckoApi(api_key="123456", is_demo=False) - assert ftc._api_key == "123456" + assert ftc.extra_params is not None + assert ftc.extra_params["x_cg_pro_api_key"] == "123456" assert ftc.api_base_url == "https://pro-api.coingecko.com/api/v3/" diff --git a/tests/rpc/test_rpc.py b/tests/rpc/test_rpc.py index dd8c1bb9a87..d0ec44061bf 100644 --- a/tests/rpc/test_rpc.py +++ b/tests/rpc/test_rpc.py @@ -99,6 +99,7 @@ def test_rpc_trade_status(default_conf, ticker, fee, mocker) -> None: "precision_mode_price": 2, "contract_size": 1, "has_open_orders": False, + "nr_of_successful_entries": ANY, "orders": [ { "amount": 91.07468123, @@ -250,18 +251,23 @@ def test_rpc_status_table(default_conf, ticker, fee, mocker) -> None: mocker.patch(f"{EXMS}._dry_is_price_crossed", return_value=False) freqtradebot.enter_positions() - result, headers, fiat_profit_sum = rpc._rpc_status_table(default_conf["stake_currency"], "USD") + result, headers, fiat_profit_sum, total_sum = rpc._rpc_status_table( + default_conf["stake_currency"], "USD" + ) assert "Since" in headers assert "Pair" in headers assert "now" == result[0][2] assert "ETH/BTC" in result[0][1] - assert "0.00 (0.00)" == result[0][3] + assert "0.00% (0.00)" == result[0][3] assert "0.00" == f"{fiat_profit_sum:.2f}" + assert "0.00" == f"{total_sum:.2f}" mocker.patch(f"{EXMS}._dry_is_price_crossed", return_value=True) freqtradebot.process() - result, headers, fiat_profit_sum = rpc._rpc_status_table(default_conf["stake_currency"], "USD") + result, headers, fiat_profit_sum, total_sum = rpc._rpc_status_table( + default_conf["stake_currency"], "USD" + ) assert "Since" in headers assert "Pair" in headers assert "now" == result[0][2] @@ -270,8 +276,11 @@ def test_rpc_status_table(default_conf, ticker, fee, mocker) -> None: assert "-0.00" == f"{fiat_profit_sum:.2f}" # Test with fiat convert + rpc._config["fiat_display_currency"] = "USD" rpc._fiat_converter = CryptoToFiatConverter({}) - result, headers, fiat_profit_sum = rpc._rpc_status_table(default_conf["stake_currency"], "USD") + result, headers, fiat_profit_sum, total_sum = rpc._rpc_status_table( + default_conf["stake_currency"], "USD" + ) assert "Since" in headers assert "Pair" in headers assert len(result[0]) == 4 @@ -279,10 +288,13 @@ def test_rpc_status_table(default_conf, ticker, fee, mocker) -> None: assert "ETH/BTC" in result[0][1] assert "-0.41% (-0.06)" == result[0][3] assert "-0.06" == f"{fiat_profit_sum:.2f}" + assert "-0.06" == f"{total_sum:.2f}" rpc._config["position_adjustment_enable"] = True rpc._config["max_entry_position_adjustment"] = 3 - result, headers, fiat_profit_sum = rpc._rpc_status_table(default_conf["stake_currency"], "USD") + result, headers, fiat_profit_sum, total_sum = rpc._rpc_status_table( + default_conf["stake_currency"], "USD" + ) assert "# Entries" in headers assert len(result[0]) == 5 # 4th column should be 1/4 - as 1 order filled (a total of 4 is possible) @@ -292,7 +304,9 @@ def test_rpc_status_table(default_conf, ticker, fee, mocker) -> None: mocker.patch( f"{EXMS}.get_rate", MagicMock(side_effect=ExchangeError("Pair 'ETH/BTC' not available")) ) - result, headers, fiat_profit_sum = rpc._rpc_status_table(default_conf["stake_currency"], "USD") + result, headers, fiat_profit_sum, total_sum = rpc._rpc_status_table( + default_conf["stake_currency"], "USD" + ) assert "now" == result[0][2] assert "ETH/BTC" in result[0][1] assert "nan%" == result[0][3] @@ -514,8 +528,13 @@ def test_rpc_balance_handle_error(default_conf, mocker): patch_get_signal(freqtradebot) rpc = RPC(freqtradebot) rpc._fiat_converter = CryptoToFiatConverter({}) - with pytest.raises(RPCException, match="Error getting current tickers."): - rpc._rpc_balance(default_conf["stake_currency"], default_conf["fiat_display_currency"]) + res = rpc._rpc_balance(default_conf["stake_currency"], default_conf["fiat_display_currency"]) + assert res["stake"] == "BTC" + + assert len(res["currencies"]) == 1 + assert res["currencies"][0]["currency"] == "BTC" + # ETH has not been converted. + assert all(currency["currency"] != "ETH" for currency in res["currencies"]) def test_rpc_balance_handle(default_conf_usdt, mocker, tickers): @@ -530,6 +549,13 @@ def test_rpc_balance_handle(default_conf_usdt, mocker, tickers): "total": 5.0, "used": 4.0, }, + # Invalid coin not in tickers list. + # This triggers a 2nd call to get_tickers + "NotACoin": { + "free": 0.0, + "total": 2.0, + "used": 0.0, + }, "USDT": { "free": 50.0, "total": 100.0, @@ -574,7 +600,7 @@ def test_rpc_balance_handle(default_conf_usdt, mocker, tickers): fetch_positions=MagicMock(return_value=mock_pos), get_tickers=tickers, get_valid_pair_combination=MagicMock( - side_effect=lambda a, b: f"{b}/{a}" if a == "USDT" else f"{a}/{b}" + side_effect=lambda a, b: [f"{b}/{a}" if a == "USDT" else f"{a}/{b}"] ), ) default_conf_usdt["dry_run"] = False @@ -590,8 +616,10 @@ def test_rpc_balance_handle(default_conf_usdt, mocker, tickers): assert pytest.approx(result["total"]) == 2824.83464 assert pytest.approx(result["value"]) == 2824.83464 * 1.2 - assert tickers.call_count == 1 + assert tickers.call_count == 4 assert tickers.call_args_list[0][1]["cached"] is True + # Testing futures - so we should get spot tickers + assert tickers.call_args_list[-1][1]["market_type"] == "spot" assert "USD" == result["symbol"] assert result["currencies"] == [ { @@ -622,6 +650,20 @@ def test_rpc_balance_handle(default_conf_usdt, mocker, tickers): "is_bot_managed": False, "is_position": False, }, + { + "currency": "NotACoin", + "balance": 2.0, + "bot_owned": 0, + "est_stake": 0, + "est_stake_bot": 0, + "free": 0.0, + "is_bot_managed": False, + "is_position": False, + "position": 0, + "side": "long", + "stake": "USDT", + "used": 0.0, + }, { "currency": "USDT", "free": 50.0, @@ -652,8 +694,8 @@ def test_rpc_balance_handle(default_conf_usdt, mocker, tickers): ] assert pytest.approx(result["total_bot"]) == 69.5 assert pytest.approx(result["total"]) == 2824.83464 # ETH stake is missing. - assert result["starting_capital"] == 50 - assert result["starting_capital_ratio"] == pytest.approx(0.3899999) + assert result["starting_capital"] == 50 * default_conf_usdt["tradable_balance_ratio"] + assert result["starting_capital_ratio"] == pytest.approx(0.4040404) def test_rpc_start(mocker, default_conf) -> None: diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index 730a6b05e74..de347288571 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -556,7 +556,7 @@ def test_api_balance(botclient, mocker, rpc_balance, tickers): ftbot.config["dry_run"] = False mocker.patch(f"{EXMS}.get_balances", return_value=rpc_balance) mocker.patch(f"{EXMS}.get_tickers", tickers) - mocker.patch(f"{EXMS}.get_valid_pair_combination", side_effect=lambda a, b: f"{a}/{b}") + mocker.patch(f"{EXMS}.get_valid_pair_combination", side_effect=lambda a, b: [f"{a}/{b}"]) ftbot.wallets.update() rc = client_get(client, f"{BASE_URI}/balance") @@ -691,20 +691,22 @@ def test_api_show_config(botclient): def test_api_daily(botclient, mocker, ticker, fee, markets): ftbot, client = botclient - patch_get_signal(ftbot) - mocker.patch.multiple( - EXMS, - get_balances=MagicMock(return_value=ticker), - fetch_ticker=ticker, - get_fee=fee, - markets=PropertyMock(return_value=markets), - ) + + ftbot.config["dry_run"] = False + mocker.patch(f"{EXMS}.get_balances", return_value=ticker) + mocker.patch(f"{EXMS}.get_tickers", ticker) + mocker.patch(f"{EXMS}.get_fee", fee) + mocker.patch(f"{EXMS}.markets", PropertyMock(return_value=markets)) + ftbot.wallets.update() + rc = client_get(client, f"{BASE_URI}/daily") assert_response(rc) - assert len(rc.json()["data"]) == 7 - assert rc.json()["stake_currency"] == "BTC" - assert rc.json()["fiat_display_currency"] == "USD" - assert rc.json()["data"][0]["date"] == str(datetime.now(timezone.utc).date()) + response = rc.json() + assert "data" in response + assert len(response["data"]) == 7 + assert response["stake_currency"] == "BTC" + assert response["fiat_display_currency"] == "USD" + assert response["data"][0]["date"] == str(datetime.now(timezone.utc).date()) def test_api_weekly(botclient, mocker, ticker, fee, markets, time_machine): @@ -1054,6 +1056,7 @@ def test_api_edge_disabled(botclient, mocker, ticker, fee, markets): ) def test_api_profit(botclient, mocker, ticker, fee, markets, is_short, expected): ftbot, client = botclient + ftbot.config["tradable_balance_ratio"] = 1 patch_get_signal(ftbot) mocker.patch.multiple( EXMS, @@ -2861,3 +2864,74 @@ def test_api_ws_send_msg(default_conf, mocker, caplog): finally: ApiServer.shutdown() ApiServer.shutdown() + + +def test_api_download_data(botclient, mocker, tmp_path, caplog): + ftbot, client = botclient + + rc = client_post(client, f"{BASE_URI}/download_data", data={}) + assert_response(rc, 503) + assert rc.json()["detail"] == "Bot is not in the correct state." + + ftbot.config["runmode"] = RunMode.WEBSERVER + ftbot.config["user_data_dir"] = tmp_path + + body = { + "pairs": ["ETH/BTC", "XRP/BTC"], + "timeframes": ["5m"], + } + + # Fail, already running + ApiBG.download_data_running = True + rc = client_post(client, f"{BASE_URI}/download_data", body) + assert_response(rc, 400) + assert rc.json()["detail"] == "Data Download is already running." + + # Reset running state + ApiBG.download_data_running = False + + # Test successful download + mocker.patch( + "freqtrade.data.history.history_utils.download_data", + return_value=None, + ) + + rc = client_post(client, f"{BASE_URI}/download_data", body) + assert_response(rc) + assert rc.json()["status"] == "Data Download started in background." + job_id = rc.json()["job_id"] + + rc = client_get(client, f"{BASE_URI}/background/{job_id}") + assert_response(rc) + response = rc.json() + assert response["job_id"] == job_id + assert response["job_category"] == "download_data" + # Job finishes immediately due to mock. + assert response["status"] == "success" + + # Background list contains the job + rc = client_get(client, f"{BASE_URI}/background") + assert_response(rc) + response = rc.json() + assert isinstance(response, list) + assert len(response) == 1 + assert response[0]["job_id"] == job_id + + # Test error case + ApiBG.download_data_running = False + mocker.patch( + "freqtrade.data.history.history_utils.download_data", + side_effect=OperationalException("Download error"), + ) + rc = client_post(client, f"{BASE_URI}/download_data", body) + assert_response(rc) + assert rc.json()["status"] == "Data Download started in background." + job_id = rc.json()["job_id"] + + rc = client_get(client, f"{BASE_URI}/background/{job_id}") + assert_response(rc) + response = rc.json() + assert response["job_id"] == job_id + assert response["job_category"] == "download_data" + assert response["status"] == "failed" + assert response["error"] == "Download error" diff --git a/tests/rpc/test_rpc_telegram.py b/tests/rpc/test_rpc_telegram.py index 971e1384637..5cf689da91e 100644 --- a/tests/rpc/test_rpc_telegram.py +++ b/tests/rpc/test_rpc_telegram.py @@ -67,7 +67,7 @@ def default_conf(default_conf) -> dict: @pytest.fixture def update(): - message = Message(0, datetime.now(timezone.utc), Chat(0, 0)) + message = Message(0, datetime.now(timezone.utc), Chat(1235, 0)) _update = Update(0, message=message) return _update @@ -167,7 +167,7 @@ def test_telegram_init(default_conf, mocker, caplog) -> None: "['stopbuy', 'stopentry'], ['whitelist'], ['blacklist'], " "['bl_delete', 'blacklist_delete'], " "['logs'], ['edge'], ['health'], ['help'], ['version'], ['marketdir'], " - "['order'], ['list_custom_data']]" + "['order'], ['list_custom_data'], ['tg_info']]" ) assert log_has(message_str, caplog) @@ -224,8 +224,8 @@ async def test_authorized_only(default_conf, mocker, caplog, update) -> None: patch_get_signal(bot) await dummy.dummy_handler(update=update, context=MagicMock()) assert dummy.state["called"] is True - assert log_has("Executing handler: dummy_handler for chat_id: 0", caplog) - assert not log_has("Rejected unauthorized message from: 0", caplog) + assert log_has("Executing handler: dummy_handler for chat_id: 1235", caplog) + assert not log_has("Rejected unauthorized message from: 1235", caplog) assert not log_has("Exception occurred within Telegram module", caplog) @@ -960,7 +960,7 @@ async def test_telegram_balance_handle(default_conf, update, mocker, rpc_balance default_conf["dry_run"] = False mocker.patch(f"{EXMS}.get_balances", return_value=rpc_balance) mocker.patch(f"{EXMS}.get_tickers", tickers) - mocker.patch(f"{EXMS}.get_valid_pair_combination", side_effect=lambda a, b: f"{a}/{b}") + mocker.patch(f"{EXMS}.get_valid_pair_combination", side_effect=lambda a, b: [f"{a}/{b}"]) telegram, freqtradebot, msg_mock = get_telegram_testobject(mocker, default_conf) patch_get_signal(freqtradebot) @@ -1049,7 +1049,7 @@ async def test_telegram_balance_handle_futures( mocker.patch(f"{EXMS}.get_balances", return_value=rpc_balance) mocker.patch(f"{EXMS}.fetch_positions", return_value=mock_pos) mocker.patch(f"{EXMS}.get_tickers", tickers) - mocker.patch(f"{EXMS}.get_valid_pair_combination", side_effect=lambda a, b: f"{a}/{b}") + mocker.patch(f"{EXMS}.get_valid_pair_combination", side_effect=lambda a, b: [f"{a}/{b}"]) telegram, freqtradebot, msg_mock = get_telegram_testobject(mocker, default_conf) patch_get_signal(freqtradebot) @@ -1087,7 +1087,7 @@ async def test_balance_handle_empty_response_dry(default_conf, update, mocker) - result = msg_mock.call_args_list[0][0][0] assert msg_mock.call_count == 1 assert "*Warning:* Simulated balances in Dry Mode." in result - assert "Starting capital: `1000 BTC`" in result + assert "Starting capital: `990 BTC`" in result async def test_balance_handle_too_large_response(default_conf, update, mocker) -> None: @@ -2355,8 +2355,8 @@ def test_send_msg_exit_notification(default_conf, mocker) -> None: "*Direction:* `Long`\n" "*Amount:* `1333.33333333`\n" "*Open Rate:* `0.00075 ETH`\n" - "*Current Rate:* `0.00032 ETH`\n" - "*Exit Rate:* `0.00032 ETH`\n" + "*Current Rate:* `0.0003201 ETH`\n" + "*Exit Rate:* `0.0003201 ETH`\n" "*Duration:* `1:00:00 (60.0 min)`" ) @@ -2398,8 +2398,8 @@ def test_send_msg_exit_notification(default_conf, mocker) -> None: "*Direction:* `Long`\n" "*Amount:* `1333.33333333`\n" "*Open Rate:* `0.00075 ETH`\n" - "*Current Rate:* `0.00032 ETH`\n" - "*Exit Rate:* `0.00032 ETH`\n" + "*Current Rate:* `0.0003201 ETH`\n" + "*Exit Rate:* `0.0003201 ETH`\n" "*Remaining:* `0.01 ETH / -24.812 USD`" ) @@ -2437,8 +2437,8 @@ def test_send_msg_exit_notification(default_conf, mocker) -> None: "*Direction:* `Long`\n" "*Amount:* `1333.33333333`\n" "*Open Rate:* `0.00075 ETH`\n" - "*Current Rate:* `0.00032 ETH`\n" - "*Exit Rate:* `0.00032 ETH`\n" + "*Current Rate:* `0.0003201 ETH`\n" + "*Exit Rate:* `0.0003201 ETH`\n" "*Duration:* `1 day, 2:30:00 (1590.0 min)`" ) # Reset singleton function to avoid random breaks @@ -2536,7 +2536,7 @@ def test_send_msg_exit_fill_notification( f"{leverage_text}" "*Amount:* `1333.33333333`\n" "*Open Rate:* `0.00075 ETH`\n" - "*Exit Rate:* `0.00032 ETH`\n" + "*Exit Rate:* `0.0003201 ETH`\n" "*Duration:* `1 day, 2:30:00 (1590.0 min)`" ) @@ -2686,8 +2686,8 @@ def test_send_msg_exit_notification_no_fiat( f"{leverage_text}`\n" "*Amount:* `1333.33333333`\n" "*Open Rate:* `0.00075 ETH`\n" - "*Current Rate:* `0.00032 ETH`\n" - "*Exit Rate:* `0.00032 ETH`\n" + "*Current Rate:* `0.0003201 ETH`\n" + "*Exit Rate:* `0.0003201 ETH`\n" "*Duration:* `2:35:03 (155.1 min)`" ) @@ -2885,3 +2885,97 @@ async def test_telegram_list_custom_data(default_conf_usdt, update, ticker, fee, ) in msg_mock.call_args_list[2][0][0] msg_mock.reset_mock() + + +def test_noficiation_settings(default_conf_usdt, mocker): + (telegram, _, _) = get_telegram_testobject(mocker, default_conf_usdt) + telegram._config["telegram"].update( + { + "notification_settings": { + "status": "silent", + "warning": "on", + "startup": "off", + "entry": "silent", + "entry_fill": "on", + "entry_cancel": "silent", + "exit": { + "roi": "silent", + "emergency_exit": "on", + "force_exit": "on", + "exit_signal": "silent", + "trailing_stop_loss": "on", + "stop_loss": "on", + "stoploss_on_exchange": "on", + "custom_exit": "silent", + "partial_exit": "off", + }, + "exit_fill": { + "roi": "silent", + "partial_exit": "off", + "*": "silent", # Default to silent + }, + "exit_cancel": "on", + "protection_trigger": "off", + "protection_trigger_global": "on", + "strategy_msg": "off", + "show_candle": "off", + } + } + ) + + loudness = telegram._message_loudness + + assert loudness({"type": RPCMessageType.ENTRY, "exit_reason": ""}) == "silent" + assert loudness({"type": RPCMessageType.ENTRY_FILL, "exit_reason": ""}) == "on" + assert loudness({"type": RPCMessageType.EXIT, "exit_reason": ""}) == "on" + # Default to silent due to "*" definition + assert loudness({"type": RPCMessageType.EXIT_FILL, "exit_reason": ""}) == "silent" + assert loudness({"type": RPCMessageType.PROTECTION_TRIGGER, "exit_reason": ""}) == "off" + assert loudness({"type": RPCMessageType.EXIT, "exit_reason": "roi"}) == "silent" + assert loudness({"type": RPCMessageType.EXIT, "exit_reason": "partial_exit"}) == "off" + # Not given key defaults to on + assert loudness({"type": RPCMessageType.EXIT, "exit_reason": "cust_exit112"}) == "on" + + assert loudness({"type": RPCMessageType.EXIT_FILL, "exit_reason": "roi"}) == "silent" + assert loudness({"type": RPCMessageType.EXIT_FILL, "exit_reason": "partial_exit"}) == "off" + # Default to silent due to "*" definition + assert loudness({"type": RPCMessageType.EXIT_FILL, "exit_reason": "cust_exit112"}) == "silent" + + # Simplified setup for exit + telegram._config["telegram"].update( + { + "notification_settings": { + "status": "silent", + "warning": "on", + "startup": "off", + "entry": "silent", + "entry_fill": "on", + "entry_cancel": "silent", + "exit": "off", + "exit_cancel": "on", + "exit_fill": "on", + "protection_trigger": "off", + "protection_trigger_global": "on", + "strategy_msg": "off", + "show_candle": "off", + } + } + ) + + assert loudness({"type": RPCMessageType.EXIT_FILL, "exit_reason": "roi"}) == "on" + # All regular exits are off + assert loudness({"type": RPCMessageType.EXIT, "exit_reason": "roi"}) == "off" + assert loudness({"type": RPCMessageType.EXIT, "exit_reason": "partial_exit"}) == "off" + assert loudness({"type": RPCMessageType.EXIT, "exit_reason": "cust_exit112"}) == "off" + + +async def test__tg_info(default_conf_usdt, mocker, update): + (telegram, _, _) = get_telegram_testobject(mocker, default_conf_usdt) + context = AsyncMock() + + await telegram._tg_info(update, context) + + assert context.bot.send_message.call_count == 1 + content = context.bot.send_message.call_args[1]["text"] + assert "Freqtrade Bot Info:\n" in content + assert '"chat_id": "1235"' in content diff --git a/tests/strategy/strats/strategy_test_v3.py b/tests/strategy/strats/strategy_test_v3.py index 007c7655e73..e87810111a9 100644 --- a/tests/strategy/strats/strategy_test_v3.py +++ b/tests/strategy/strats/strategy_test_v3.py @@ -1,7 +1,6 @@ # pragma pylint: disable=missing-docstring, invalid-name, pointless-string-statement from datetime import datetime -from typing import Optional import talib.abstract as ta from pandas import DataFrame @@ -175,7 +174,7 @@ def leverage( current_rate: float, proposed_leverage: float, max_leverage: float, - entry_tag: Optional[str], + entry_tag: str | None, side: str, **kwargs, ) -> float: @@ -190,14 +189,14 @@ def adjust_trade_position( current_time: datetime, current_rate: float, current_profit: float, - min_stake: Optional[float], + min_stake: float | None, max_stake: float, current_entry_rate: float, current_exit_rate: float, current_entry_profit: float, current_exit_profit: float, **kwargs, - ) -> Optional[float]: + ) -> float | None: if current_profit < -0.0075: orders = trade.select_filled_orders(trade.entry_side) return round(orders[0].stake_amount, 0) diff --git a/tests/strategy/strats/strategy_test_v3_custom_entry_price.py b/tests/strategy/strats/strategy_test_v3_custom_entry_price.py index 956766d14c7..2689db27a9f 100644 --- a/tests/strategy/strats/strategy_test_v3_custom_entry_price.py +++ b/tests/strategy/strats/strategy_test_v3_custom_entry_price.py @@ -1,7 +1,6 @@ # pragma pylint: disable=missing-docstring, invalid-name, pointless-string-statement from datetime import datetime -from typing import Optional from pandas import DataFrame from strategy_test_v3 import StrategyTestV3 @@ -34,10 +33,10 @@ def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame def custom_entry_price( self, pair: str, - trade: Optional[Trade], + trade: Trade | None, current_time: datetime, proposed_rate: float, - entry_tag: Optional[str], + entry_tag: str | None, side: str, **kwargs, ) -> float: diff --git a/tests/strategy/test_interface.py b/tests/strategy/test_interface.py index 441eb5673ce..647484535a0 100644 --- a/tests/strategy/test_interface.py +++ b/tests/strategy/test_interface.py @@ -27,15 +27,8 @@ IntParameter, RealParameter, ) -from freqtrade.strategy.strategy_wrapper import strategy_safe_wrapper from freqtrade.util import dt_now -from tests.conftest import ( - CURRENT_TEST_STRATEGY, - TRADE_SIDES, - create_mock_trades, - log_has, - log_has_re, -) +from tests.conftest import CURRENT_TEST_STRATEGY, TRADE_SIDES, log_has, log_has_re from .strats.strategy_test_v3 import StrategyTestV3 @@ -900,68 +893,6 @@ def test_is_informative_pairs_callback(default_conf): assert [] == strategy.gather_informative_pairs() -@pytest.mark.parametrize( - "error", - [ - ValueError, - KeyError, - Exception, - ], -) -def test_strategy_safe_wrapper_error(caplog, error): - def failing_method(): - raise error("This is an error.") - - with pytest.raises(StrategyError, match=r"This is an error."): - strategy_safe_wrapper(failing_method, message="DeadBeef")() - - assert log_has_re(r"DeadBeef.*", caplog) - ret = strategy_safe_wrapper(failing_method, message="DeadBeef", default_retval=True)() - - assert isinstance(ret, bool) - assert ret - - caplog.clear() - # Test suppressing error - ret = strategy_safe_wrapper(failing_method, message="DeadBeef", supress_error=True)() - assert log_has_re(r"DeadBeef.*", caplog) - - -@pytest.mark.parametrize( - "value", [1, 22, 55, True, False, {"a": 1, "b": "112"}, [1, 2, 3, 4], (4, 2, 3, 6)] -) -def test_strategy_safe_wrapper(value): - def working_method(argumentpassedin): - return argumentpassedin - - ret = strategy_safe_wrapper(working_method, message="DeadBeef")(value) - - assert isinstance(ret, type(value)) - assert ret == value - - -@pytest.mark.usefixtures("init_persistence") -def test_strategy_safe_wrapper_trade_copy(fee): - create_mock_trades(fee) - - def working_method(trade): - assert len(trade.orders) > 0 - assert trade.orders - trade.orders = [] - assert len(trade.orders) == 0 - return trade - - trade = Trade.get_open_trades()[0] - # Don't assert anything before strategy_wrapper. - # This ensures that relationship loading works correctly. - ret = strategy_safe_wrapper(working_method, message="DeadBeef")(trade=trade) - assert isinstance(ret, Trade) - assert id(trade) != id(ret) - # Did not modify the original order - assert len(trade.orders) > 0 - assert len(ret.orders) == 0 - - def test_hyperopt_parameters(): HyperoptStateContainer.set_state(HyperoptState.INDICATORS) from skopt.space import Categorical, Integer, Real diff --git a/tests/strategy/test_strategy_safe_wrapper.py b/tests/strategy/test_strategy_safe_wrapper.py new file mode 100644 index 00000000000..214f3c9e4d8 --- /dev/null +++ b/tests/strategy/test_strategy_safe_wrapper.py @@ -0,0 +1,69 @@ +import pytest + +from freqtrade.exceptions import StrategyError +from freqtrade.persistence import Trade +from freqtrade.strategy.strategy_wrapper import strategy_safe_wrapper +from tests.conftest import create_mock_trades, log_has_re + + +@pytest.mark.parametrize( + "error", + [ + ValueError, + KeyError, + Exception, + ], +) +def test_strategy_safe_wrapper_error(caplog, error): + def failing_method(): + raise error("This is an error.") + + with pytest.raises(StrategyError, match=r"This is an error."): + strategy_safe_wrapper(failing_method, message="DeadBeef")() + + assert log_has_re(r"DeadBeef.*", caplog) + ret = strategy_safe_wrapper(failing_method, message="DeadBeef", default_retval=True)() + + assert isinstance(ret, bool) + assert ret + + caplog.clear() + # Test suppressing error + ret = strategy_safe_wrapper(failing_method, message="DeadBeef", supress_error=True)() + assert log_has_re(r"DeadBeef.*", caplog) + + +@pytest.mark.parametrize( + "value", [1, 22, 55, True, False, {"a": 1, "b": "112"}, [1, 2, 3, 4], (4, 2, 3, 6)] +) +def test_strategy_safe_wrapper(value): + def working_method(argumentpassedin): + return argumentpassedin + + ret = strategy_safe_wrapper(working_method, message="DeadBeef")(value) + + assert isinstance(ret, type(value)) + assert ret == value + + +@pytest.mark.usefixtures("init_persistence") +def test_strategy_safe_wrapper_trade_copy(fee): + create_mock_trades(fee) + trade_ = Trade.get_open_trades()[0] + + def working_method(trade): + assert len(trade.orders) > 0 + assert trade.orders + trade.orders = [] + assert len(trade.orders) == 0 + assert id(trade_) != id(trade) + return trade + + # Don't assert anything before strategy_wrapper. + # This ensures that relationship loading works correctly. + ret = strategy_safe_wrapper(working_method, message="DeadBeef")(trade=trade_) + assert isinstance(ret, Trade) + assert id(trade_) != id(ret) + # Did not modify the original order + assert len(trade_.orders) > 0 + assert len(ret.orders) == 0 diff --git a/tests/test_configuration.py b/tests/test_configuration.py index 829bf699abd..3e9df382ba0 100644 --- a/tests/test_configuration.py +++ b/tests/test_configuration.py @@ -489,7 +489,6 @@ def test_setup_configuration_with_arguments(mocker, default_conf, caplog, tmp_pa "--timeframe", "1m", "--enable-position-stacking", - "--disable-max-market-positions", "--timerange", ":100", "--export", @@ -518,10 +517,6 @@ def test_setup_configuration_with_arguments(mocker, default_conf, caplog, tmp_pa assert "position_stacking" in config assert log_has("Parameter --enable-position-stacking detected ...", caplog) - assert "use_max_market_positions" in config - assert log_has("Parameter --disable-max-market-positions detected ...", caplog) - assert log_has("max_open_trades set to unlimited ...", caplog) - assert "timerange" in config assert log_has("Parameter --timerange detected: {} ...".format(config["timerange"]), caplog) @@ -570,8 +565,6 @@ def test_setup_configuration_with_stratlist(mocker, default_conf, caplog) -> Non assert "position_stacking" not in config - assert "use_max_market_positions" not in config - assert "timerange" not in config assert "export" in config @@ -1488,6 +1481,12 @@ def test_flat_vars_to_nested_dict(caplog): "FREQTRADE__STAKE_AMOUNT": "200.05", "FREQTRADE__TELEGRAM__CHAT_ID": "2151", "NOT_RELEVANT": "200.0", # Will be ignored + "FREQTRADE__ARRAY": '[{"name":"default","host":"xxx"}]', + "FREQTRADE__EXCHANGE__PAIR_WHITELIST": '["BTC/USDT", "ETH/USDT"]', + # Fails due to trailing comma + "FREQTRADE__ARRAY_TRAIL_COMMA": '[{"name":"default","host":"xxx",}]', + # Object fails + "FREQTRADE__OBJECT": '{"name":"default","host":"xxx"}', } expected = { "stake_amount": 200.05, @@ -1501,8 +1500,12 @@ def test_flat_vars_to_nested_dict(caplog): }, "some_setting": True, "some_false_setting": False, + "pair_whitelist": ["BTC/USDT", "ETH/USDT"], }, "telegram": {"chat_id": "2151"}, + "array": [{"name": "default", "host": "xxx"}], + "object": '{"name":"default","host":"xxx"}', + "array_trail_comma": '[{"name":"default","host":"xxx",}]', } res = _flat_vars_to_nested_dict(test_args, ENV_VAR_PREFIX) assert res == expected diff --git a/tests/test_wallets.py b/tests/test_wallets.py index 545793151ad..002e27c1826 100644 --- a/tests/test_wallets.py +++ b/tests/test_wallets.py @@ -168,7 +168,7 @@ def test_get_trade_stake_amount_unlimited_amount( assert result == 0 freqtrade.config["dry_run_wallet"] = 200 - freqtrade.wallets.start_cap = 200 + freqtrade.wallets._start_cap["BTC"] = 200 result = freqtrade.wallets.get_trade_stake_amount("XRP/USDT", 3) assert round(result, 4) == round(result2, 4) @@ -244,7 +244,7 @@ def test_get_starting_balance( freqtrade = get_patched_freqtradebot(mocker, default_conf) - assert freqtrade.wallets.get_starting_balance() == expected + assert freqtrade.wallets.get_starting_balance() == expected * (1 if available_capital else 0.99) def test_sync_wallet_futures_live(mocker, default_conf): @@ -373,7 +373,10 @@ def test_sync_wallet_dry(mocker, default_conf_usdt, fee): # sum of used and free should be total. assert usdt_bal.total == usdt_bal.free + usdt_bal.used - assert freqtrade.wallets.get_starting_balance() == default_conf_usdt["dry_run_wallet"] + assert ( + freqtrade.wallets.get_starting_balance() + == default_conf_usdt["dry_run_wallet"] * default_conf_usdt["tradable_balance_ratio"] + ) total = freqtrade.wallets.get_total("LTC") free = freqtrade.wallets.get_free("LTC") used = freqtrade.wallets.get_used("LTC") @@ -401,7 +404,10 @@ def test_sync_wallet_futures_dry(mocker, default_conf, fee): assert positions["XRP/BTC"].side == "long" assert positions["LTC/BTC"].side == "short" - assert freqtrade.wallets.get_starting_balance() == default_conf["dry_run_wallet"] + assert ( + freqtrade.wallets.get_starting_balance() + == default_conf["dry_run_wallet"] * default_conf["tradable_balance_ratio"] + ) total = freqtrade.wallets.get_total("BTC") free = freqtrade.wallets.get_free("BTC") used = freqtrade.wallets.get_used("BTC") @@ -451,3 +457,151 @@ def test_check_exit_amount_futures(mocker, default_conf, fee): assert freqtrade.wallets.check_exit_amount(trade) is False assert total_mock.call_count == 0 assert update_mock.call_count == 1 + + +@pytest.mark.parametrize( + "config,wallets", + [ + ( + {"stake_currency": "USDT", "dry_run_wallet": 1000.0}, + {"USDT": {"currency": "USDT", "free": 1000.0, "used": 0.0, "total": 1000.0}}, + ), + ( + {"stake_currency": "USDT", "dry_run_wallet": {"USDT": 1000.0, "BTC": 0.1, "ETH": 2.0}}, + { + "USDT": {"currency": "USDT", "free": 1000.0, "used": 0.0, "total": 1000.0}, + "BTC": {"currency": "BTC", "free": 0.1, "used": 0.0, "total": 0.1}, + "ETH": {"currency": "ETH", "free": 2.0, "used": 0.0, "total": 2.0}, + }, + ), + ( + { + "stake_currency": "USDT", + "margin_mode": "cross", + "dry_run_wallet": {"USDC": 1000.0, "BTC": 0.1, "ETH": 2.0}, + }, + { + # USDT wallet should be created with 0 balance, but Free balance, since + # it's converted from the other currencies + "USDT": {"currency": "USDT", "free": 4200.0, "used": 0.0, "total": 0.0}, + "USDC": {"currency": "USDC", "free": 1000.0, "used": 0.0, "total": 1000.0}, + "BTC": {"currency": "BTC", "free": 0.1, "used": 0.0, "total": 0.1}, + "ETH": {"currency": "ETH", "free": 2.0, "used": 0.0, "total": 2.0}, + }, + ), + ( + { + "stake_currency": "USDT", + "margin_mode": "cross", + "dry_run_wallet": {"USDT": 500, "USDC": 1000.0, "BTC": 0.1, "ETH": 2.0}, + }, + { + # USDT wallet should be created with 500 balance, but Free balance, since + # it's converted from the other currencies + "USDT": {"currency": "USDT", "free": 4700.0, "used": 0.0, "total": 500.0}, + "USDC": {"currency": "USDC", "free": 1000.0, "used": 0.0, "total": 1000.0}, + "BTC": {"currency": "BTC", "free": 0.1, "used": 0.0, "total": 0.1}, + "ETH": {"currency": "ETH", "free": 2.0, "used": 0.0, "total": 2.0}, + }, + ), + ( + # Same as above, but without cross + { + "stake_currency": "USDT", + "dry_run_wallet": {"USDT": 500, "USDC": 1000.0, "BTC": 0.1, "ETH": 2.0}, + }, + { + # No "free" transfer for USDT wallet + "USDT": {"currency": "USDT", "free": 500.0, "used": 0.0, "total": 500.0}, + "USDC": {"currency": "USDC", "free": 1000.0, "used": 0.0, "total": 1000.0}, + "BTC": {"currency": "BTC", "free": 0.1, "used": 0.0, "total": 0.1}, + "ETH": {"currency": "ETH", "free": 2.0, "used": 0.0, "total": 2.0}, + }, + ), + ( + # Same as above, but with futures and cross + { + "stake_currency": "USDT", + "margin_mode": "cross", + "trading_mode": "futures", + "dry_run_wallet": {"USDT": 500, "USDC": 1000.0, "BTC": 0.1, "ETH": 2.0}, + }, + { + # USDT wallet should be created with 500 balance, but Free balance, since + # it's converted from the other currencies + "USDT": {"currency": "USDT", "free": 4700.0, "used": 0.0, "total": 500.0}, + "USDC": {"currency": "USDC", "free": 1000.0, "used": 0.0, "total": 1000.0}, + "BTC": {"currency": "BTC", "free": 0.1, "used": 0.0, "total": 0.1}, + "ETH": {"currency": "ETH", "free": 2.0, "used": 0.0, "total": 2.0}, + }, + ), + ], +) +def test_dry_run_wallet_initialization(mocker, default_conf_usdt, config, wallets): + default_conf_usdt.update(config) + mocker.patch( + f"{EXMS}.get_tickers", + return_value={ + "USDC/USDT": {"last": 1.0}, + "BTC/USDT": {"last": 20_000.0}, + "ETH/USDT": {"last": 1100.0}, + }, + ) + freqtrade = get_patched_freqtradebot(mocker, default_conf_usdt) + stake_currency = config["stake_currency"] + # Verify each wallet matches the expected values + for currency, expected_wallet in wallets.items(): + wallet = freqtrade.wallets._wallets[currency] + assert wallet.currency == expected_wallet["currency"] + assert wallet.free == expected_wallet["free"] + assert wallet.used == expected_wallet["used"] + assert wallet.total == expected_wallet["total"] + + # Verify no extra wallets were created + assert len(freqtrade.wallets._wallets) == len(wallets) + + # Create a trade and verify the new currency is added to the wallets + mocker.patch(f"{EXMS}.get_min_pair_stake_amount", return_value=0.0) + mocker.patch(f"{EXMS}.get_rate", return_value=2.22) + mocker.patch( + f"{EXMS}.fetch_ticker", + return_value={ + "bid": 0.20, + "ask": 0.22, + "last": 0.22, + }, + ) + # Without position, collateral will be the same as free + assert freqtrade.wallets.get_collateral() == freqtrade.wallets.get_free(stake_currency) + freqtrade.execute_entry("NEO/USDT", 100.0) + + # Update wallets and verify NEO is now included + freqtrade.wallets.update() + if default_conf_usdt["trading_mode"] != "futures": + assert "NEO" in freqtrade.wallets._wallets + + assert freqtrade.wallets._wallets["NEO"].total == 45.04504504 # 100 USDT / 0.22 + assert freqtrade.wallets._wallets["NEO"].used == 0.0 + assert freqtrade.wallets._wallets["NEO"].free == 45.04504504 + assert freqtrade.wallets.get_collateral() == freqtrade.wallets.get_free(stake_currency) + # Verify USDT wallet was reduced by trade amount + assert ( + pytest.approx(freqtrade.wallets._wallets[stake_currency].total) + == wallets[stake_currency]["total"] - 100.0 + ) + assert len(freqtrade.wallets._wallets) == len(wallets) + 1 # Original wallets + NEO + else: + # Futures mode + assert "NEO" not in freqtrade.wallets._wallets + assert freqtrade.wallets._positions["NEO/USDT"].position == 45.04504504 + assert pytest.approx(freqtrade.wallets._positions["NEO/USDT"].collateral) == 100 + + # Verify USDT wallet's free was reduced by trade amount + assert ( + pytest.approx(freqtrade.wallets.get_collateral()) + == freqtrade.wallets.get_free(stake_currency) + 100 + ) + assert ( + pytest.approx(freqtrade.wallets._wallets[stake_currency].free) + == wallets[stake_currency]["free"] - 100.0 + ) diff --git a/tests/testdata/binance/binance_public_data/futures-um-klines-BTCUSDT-1h-2024-10-28.zip b/tests/testdata/binance/binance_public_data/futures-um-klines-BTCUSDT-1h-2024-10-28.zip new file mode 100644 index 00000000000..5bda1b27101 Binary files /dev/null and b/tests/testdata/binance/binance_public_data/futures-um-klines-BTCUSDT-1h-2024-10-28.zip differ diff --git a/tests/testdata/binance/binance_public_data/spot-klines-BTCUSDT-1h-2024-10-28.zip b/tests/testdata/binance/binance_public_data/spot-klines-BTCUSDT-1h-2024-10-28.zip new file mode 100644 index 00000000000..b94090741ef Binary files /dev/null and b/tests/testdata/binance/binance_public_data/spot-klines-BTCUSDT-1h-2024-10-28.zip differ diff --git a/tests/util/test_formatters.py b/tests/util/test_formatters.py index ab86e224cce..ba77eb9a6ae 100644 --- a/tests/util/test_formatters.py +++ b/tests/util/test_formatters.py @@ -1,4 +1,5 @@ from freqtrade.util import decimals_per_coin, fmt_coin, round_value +from freqtrade.util.formatters import fmt_coin2 def test_decimals_per_coin(): @@ -25,6 +26,16 @@ def test_fmt_coin(): assert fmt_coin(222.2, "USDT", False, True) == "222.200" +def test_fmt_coin2(): + assert fmt_coin2(222.222222, "USDT") == "222.222222 USDT" + assert fmt_coin2(222.2, "XRP", 3, keep_trailing_zeros=True) == "222.200 XRP" + assert fmt_coin2(222.2, "USDT") == "222.2 USDT" + assert fmt_coin2(222.12745, "EUR") == "222.12745 EUR" + assert fmt_coin2(0.1274512123, "BTC") == "0.12745121 BTC" + assert fmt_coin2(0.1274512123, "ETH") == "0.12745121 ETH" + assert fmt_coin2(0.00001245, "PEPE") == "0.00001245 PEPE" + + def test_round_value(): assert round_value(222.222222, 3) == "222.222" assert round_value(222.2, 3) == "222.2"