diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 8637c0d68..0f64eaf5f 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -12,7 +12,7 @@ Have you searched for similar issues before posting it? If you have discovered a bug in the bot, please [search the issue tracker](https://github.com/freqtrade/freqtrade/issues?q=is%3Aissue). If it hasn't been reported, please create a new issue. -Please do not use bug reports to request new features. +Please do not use the bug report template to request new features. --> ## Describe your environment diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md index 9283f0e4f..52f799ed7 100644 --- a/.github/ISSUE_TEMPLATE/question.md +++ b/.github/ISSUE_TEMPLATE/question.md @@ -8,9 +8,12 @@ assignees: '' --- ## Describe your environment @@ -22,4 +25,4 @@ Please do not use the question template to report bugs or to request new feature ## Your question -*Ask the question you have not been able to find an answer in the [Documentation](https://www.freqtrade.io/en/latest/)* +*Ask the question you have not been able to find an answer in the [Documentation](https://www.freqtrade.io/)* diff --git a/.github/workflows/binance-lev-tier-update.yml b/.github/workflows/binance-lev-tier-update.yml index 844a6c8f5..278d85413 100644 --- a/.github/workflows/binance-lev-tier-update.yml +++ b/.github/workflows/binance-lev-tier-update.yml @@ -16,6 +16,8 @@ jobs: name: develop steps: - uses: actions/checkout@v4 + with: + persist-credentials: false - uses: actions/setup-python@v5 with: @@ -32,7 +34,7 @@ jobs: run: python build_helpers/binance_update_lev_tiers.py - - uses: peter-evans/create-pull-request@v7 + - uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8 with: token: ${{ secrets.REPO_SCOPED_TOKEN }} add-paths: freqtrade/exchange/binance_leverage_tiers.json @@ -42,6 +44,7 @@ jobs: branch: update/binance-leverage-tiers title: Update Binance Leverage Tiers commit-message: "chore: update pre-commit hooks" - committer: Freqtrade Bot + committer: Freqtrade Bot <154552126+freqtrade-bot@users.noreply.github.com> + author: Freqtrade Bot <154552126+freqtrade-bot@users.noreply.github.com> body: Update binance leverage tiers. delete-branch: true diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 94867b0a4..a3a8e79dc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,11 +24,13 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ "ubuntu-20.04", "ubuntu-22.04", "ubuntu-24.04" ] + os: [ "ubuntu-22.04", "ubuntu-24.04" ] python-version: ["3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v4 + with: + persist-credentials: false - name: Set up Python uses: actions/setup-python@v5 @@ -36,8 +38,9 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@c7f87aa956e4c323abf06d5dec078e358f6b4d04 # v6.0.0 with: + activate-environment: true enable-cache: true python-version: ${{ matrix.python-version }} cache-dependency-glob: "requirements**.txt" @@ -71,17 +74,17 @@ jobs: python build_helpers/freqtrade_client_version_align.py - name: Tests - if: (!(runner.os == 'Linux' && matrix.python-version == '3.12' && matrix.os == 'ubuntu-22.04')) + if: (!(runner.os == 'Linux' && matrix.python-version == '3.12' && matrix.os == 'ubuntu-24.04')) run: | pytest --random-order - name: Tests with Coveralls - if: (runner.os == 'Linux' && matrix.python-version == '3.12' && matrix.os == 'ubuntu-22.04') + if: (runner.os == 'Linux' && matrix.python-version == '3.12' && matrix.os == 'ubuntu-24.04') run: | pytest --random-order --cov=freqtrade --cov=freqtrade_client --cov-config=.coveragerc - name: Coveralls - if: (runner.os == 'Linux' && matrix.python-version == '3.12' && matrix.os == 'ubuntu-22.04') + if: (runner.os == 'Linux' && matrix.python-version == '3.12' && matrix.os == 'ubuntu-24.04') env: # Coveralls token. Not used as secret due to github not providing secrets to forked repositories COVERALLS_REPO_TOKEN: 6D1m0xupS3FgutfuGao8keFf9Hc0FpIXu @@ -137,11 +140,12 @@ jobs: ruff format --check - name: Mypy + if: matrix.os == 'ubuntu-24.04' run: | mypy freqtrade scripts tests - name: Discord notification - uses: rjstone/discord-webhook-notify@v1 + uses: rjstone/discord-webhook-notify@1399c1b2d57cc05894d506d2cfdc33c5f012b993 #v1.1.1 if: failure() && ( github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false) with: severity: error @@ -157,6 +161,8 @@ jobs: steps: - uses: actions/checkout@v4 + with: + persist-credentials: false - name: Set up Python uses: actions/setup-python@v5 @@ -165,8 +171,9 @@ jobs: check-latest: true - name: Install uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@c7f87aa956e4c323abf06d5dec078e358f6b4d04 # v6.0.0 with: + activate-environment: true enable-cache: true python-version: ${{ matrix.python-version }} cache-dependency-glob: "requirements**.txt" @@ -260,11 +267,12 @@ jobs: ruff format --check - name: Mypy + if: matrix.os == 'macos-15' run: | mypy freqtrade scripts - name: Discord notification - uses: rjstone/discord-webhook-notify@v1 + uses: rjstone/discord-webhook-notify@1399c1b2d57cc05894d506d2cfdc33c5f012b993 #v1.1.1 if: failure() && ( github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false) with: severity: info @@ -281,6 +289,8 @@ jobs: steps: - uses: actions/checkout@v4 + with: + persist-credentials: false - name: Set up Python uses: actions/setup-python@v5 @@ -288,8 +298,9 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@c7f87aa956e4c323abf06d5dec078e358f6b4d04 # v6.0.0 with: + activate-environment: true enable-cache: true python-version: ${{ matrix.python-version }} cache-dependency-glob: "requirements**.txt" @@ -355,7 +366,7 @@ jobs: shell: powershell - name: Discord notification - uses: rjstone/discord-webhook-notify@v1 + uses: rjstone/discord-webhook-notify@1399c1b2d57cc05894d506d2cfdc33c5f012b993 #v1.1.1 if: failure() && ( github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false) with: severity: error @@ -366,6 +377,8 @@ jobs: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 + with: + persist-credentials: false - name: Set up Python uses: actions/setup-python@v5 @@ -381,16 +394,20 @@ jobs: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 + with: + persist-credentials: false - uses: actions/setup-python@v5 with: python-version: "3.12" - - uses: pre-commit/action@v3.0.1 + - uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # v3.0.1 docs-check: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 + with: + persist-credentials: false - name: Documentation syntax run: | @@ -407,7 +424,7 @@ jobs: mkdocs build - name: Discord notification - uses: rjstone/discord-webhook-notify@v1 + uses: rjstone/discord-webhook-notify@1399c1b2d57cc05894d506d2cfdc33c5f012b993 #v1.1.1 if: failure() && ( github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false) with: severity: error @@ -417,9 +434,11 @@ jobs: build-linux-online: # Run pytest with "live" checks - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 + with: + persist-credentials: false - name: Set up Python uses: actions/setup-python@v5 @@ -427,8 +446,9 @@ jobs: python-version: "3.12" - name: Install uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@c7f87aa956e4c323abf06d5dec078e358f6b4d04 # v6.0.0 with: + activate-environment: true enable-cache: true python-version: "3.12" cache-dependency-glob: "requirements**.txt" @@ -485,14 +505,14 @@ jobs: - name: Check user permission id: check - uses: scherermichael-oss/action-has-permission@1.0.6 + uses: scherermichael-oss/action-has-permission@136e061bfe093832d87f090dd768e14e27a740d3 # 1.0.6 with: required-permission: write env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Discord notification - uses: rjstone/discord-webhook-notify@v1 + uses: rjstone/discord-webhook-notify@1399c1b2d57cc05894d506d2cfdc33c5f012b993 #v1.1.1 if: always() && steps.check.outputs.has-permission && ( github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false) with: severity: info @@ -506,6 +526,8 @@ jobs: steps: - uses: actions/checkout@v4 + with: + persist-credentials: false - name: Set up Python uses: actions/setup-python@v5 @@ -551,6 +573,8 @@ jobs: steps: - uses: actions/checkout@v4 + with: + persist-credentials: false - name: Download artifact 📦 uses: actions/download-artifact@v4 @@ -560,7 +584,7 @@ jobs: merge-multiple: true - name: Publish to PyPI (Test) - uses: pypa/gh-action-pypi-publish@v1.12.4 + uses: pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc # v1.12.4 with: repository-url: https://test.pypi.org/legacy/ @@ -578,6 +602,8 @@ jobs: steps: - uses: actions/checkout@v4 + with: + persist-credentials: false - name: Download artifact 📦 uses: actions/download-artifact@v4 @@ -587,7 +613,7 @@ jobs: merge-multiple: true - name: Publish to PyPI - uses: pypa/gh-action-pypi-publish@v1.12.4 + uses: pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc # v1.12.4 deploy-docker: @@ -598,6 +624,8 @@ jobs: steps: - uses: actions/checkout@v4 + with: + persist-credentials: false - name: Set up Python uses: actions/setup-python@v5 @@ -626,14 +654,16 @@ jobs: docker version -f '{{.Server.Experimental}}' - name: Set up QEMU - uses: docker/setup-qemu-action@v3 + uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0 - name: Set up Docker Buildx id: buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 #v3.10.0 - name: Available platforms - run: echo ${{ steps.buildx.outputs.platforms }} + run: echo ${PLATFORMS} + env: + PLATFORMS: ${{ steps.buildx.outputs.platforms }} - name: Build and test and push docker images env: @@ -652,6 +682,8 @@ jobs: steps: - uses: actions/checkout@v4 + with: + persist-credentials: false - name: Extract branch name id: extract-branch @@ -675,7 +707,7 @@ jobs: build_helpers/publish_docker_arm64.sh - name: Discord notification - uses: rjstone/discord-webhook-notify@v1 + uses: rjstone/discord-webhook-notify@1399c1b2d57cc05894d506d2cfdc33c5f012b993 #v1.1.1 if: always() && ( github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false) && (github.event_name != 'schedule') with: severity: info diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index c97934a51..6577bf38b 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -20,6 +20,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + with: + persist-credentials: true - name: Set up Python uses: actions/setup-python@v5 @@ -43,12 +45,16 @@ jobs: - name: Build and push Mike if: ${{ github.event_name == 'push' }} run: | - mike deploy ${{ github.ref_name }} latest --push --update-aliases + mike deploy ${REF_NAME} latest --push --update-aliases + env: + REF_NAME: ${{ github.ref_name }} - name: Build and push Mike - Release if: ${{ github.event_name == 'release' }} run: | - mike deploy ${{ github.ref_name }} stable --push --update-aliases + mike deploy ${REF_NAME} stable --push --update-aliases + env: + REF_NAME: ${{ github.ref_name }} - name: Show mike versions run: | diff --git a/.github/workflows/devcontainer-build.yml b/.github/workflows/devcontainer-build.yml index e3b510b03..9e49ffed3 100644 --- a/.github/workflows/devcontainer-build.yml +++ b/.github/workflows/devcontainer-build.yml @@ -17,29 +17,26 @@ concurrency: group: "${{ github.workflow }}" cancel-in-progress: true -permissions: - packages: write jobs: build-and-push: + permissions: + packages: write runs-on: ubuntu-latest steps: - - - name: Checkout - id: checkout - uses: actions/checkout@v4 - - - name: Login to GitHub Container Registry - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Pre-build dev container image - uses: devcontainers/ci@v0.3 - with: - subFolder: .github - imageName: ghcr.io/${{ github.repository }}-devcontainer - cacheFrom: ghcr.io/${{ github.repository }}-devcontainer - push: always + - uses: actions/checkout@v4 + with: + persist-credentials: false + - name: Login to GitHub Container Registry + uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Pre-build dev container image + uses: devcontainers/ci@8bf61b26e9c3a98f69cb6ce2f88d24ff59b785c6 # v0.3.19 + with: + subFolder: .github + imageName: ghcr.io/${{ github.repository }}-devcontainer + cacheFrom: ghcr.io/${{ github.repository }}-devcontainer + push: always diff --git a/.github/workflows/docker-update-readme.yml b/.github/workflows/docker-update-readme.yml index 95ab5b6ca..b34f8c38d 100644 --- a/.github/workflows/docker-update-readme.yml +++ b/.github/workflows/docker-update-readme.yml @@ -4,14 +4,19 @@ on: branches: - stable +# disable permissions for all of the available permissions +permissions: {} + jobs: dockerHubDescription: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + with: + persist-credentials: false - name: Docker Hub Description - uses: peter-evans/dockerhub-description@v4 + uses: peter-evans/dockerhub-description@432a30c9e07499fd01da9f8a49f0faf9e0ca5b77 # v4.0.2 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} diff --git a/.github/workflows/pre-commit-update.yml b/.github/workflows/pre-commit-update.yml index 5d71f513f..8fb8684a6 100644 --- a/.github/workflows/pre-commit-update.yml +++ b/.github/workflows/pre-commit-update.yml @@ -14,6 +14,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + with: + persist-credentials: false - uses: actions/setup-python@v5 with: @@ -26,7 +28,7 @@ jobs: - name: Run auto-update run: pre-commit autoupdate - - uses: peter-evans/create-pull-request@v7 + - uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8 with: token: ${{ secrets.REPO_SCOPED_TOKEN }} add-paths: .pre-commit-config.yaml @@ -36,6 +38,7 @@ jobs: branch: update/pre-commit-hooks title: Update pre-commit hooks commit-message: "chore: update pre-commit hooks" - committer: Freqtrade Bot + committer: Freqtrade Bot <154552126+freqtrade-bot@users.noreply.github.com> + author: Freqtrade Bot <154552126+freqtrade-bot@users.noreply.github.com> body: Update versions of pre-commit hooks to latest version. delete-branch: true diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ea35c6fd0..9dd8eeaa4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,29 +1,41 @@ # See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks repos: + + - repo: local + # Keep json schema in sync with the config schema + # This will write the files - and fail pre-commit if a file has been changed. + hooks: + - id: Extract config json schema + name: extract-config-json-schema + entry: "python build_helpers/extract_config_json_schema.py" + language: python + pass_filenames: false + additional_dependencies: ["python-rapidjson", "jsonschema"] + - repo: https://github.com/pycqa/flake8 - rev: "7.1.1" + rev: "7.2.0" hooks: - id: flake8 additional_dependencies: [Flake8-pyproject] # stages: [push] - repo: https://github.com/pre-commit/mirrors-mypy - rev: "v1.14.1" + rev: "v1.15.0" hooks: - id: mypy exclude: build_helpers additional_dependencies: - types-cachetools==5.5.0.20240820 - types-filelock==3.2.7 - - types-requests==2.32.0.20241016 + - types-requests==2.32.0.20250328 - types-tabulate==0.9.0.20241207 - types-python-dateutil==2.9.0.20241206 - - SQLAlchemy==2.0.37 + - SQLAlchemy==2.0.40 # stages: [push] - repo: https://github.com/pycqa/isort - rev: "6.0.0" + rev: "6.0.1" hooks: - id: isort name: isort (python) @@ -31,7 +43,7 @@ repos: - repo: https://github.com/charliermarsh/ruff-pre-commit # Ruff version. - rev: 'v0.9.4' + rev: 'v0.11.7' hooks: - id: ruff - id: ruff-format @@ -57,7 +69,7 @@ repos: )$ - repo: https://github.com/stefmolin/exif-stripper - rev: 0.6.1 + rev: 0.6.2 hooks: - id: strip-exif @@ -67,3 +79,9 @@ repos: - id: codespell additional_dependencies: - tomli + + # Ensure github actions remain safe + - repo: https://github.com/woodruffw/zizmor-pre-commit + rev: v1.6.0 + hooks: + - id: zizmor diff --git a/Dockerfile b/Dockerfile index 8398492ce..de20ef376 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.8-slim-bookworm as base +FROM python:3.12.10-slim-bookworm as base # Setup env ENV LANG C.UTF-8 diff --git a/README.md b/README.md index 4a0b8121b..e0eaf55a9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # ![freqtrade](https://raw.githubusercontent.com/freqtrade/freqtrade/develop/docs/assets/freqtrade_poweredby.svg) -[![Freqtrade CI](https://github.com/freqtrade/freqtrade/workflows/Freqtrade%20CI/badge.svg)](https://github.com/freqtrade/freqtrade/actions/) +[![Freqtrade CI](https://github.com/freqtrade/freqtrade/actions/workflows/ci.yml/badge.svg?branch=develop)](https://github.com/freqtrade/freqtrade/actions/) [![DOI](https://joss.theoj.org/papers/10.21105/joss.04864/status.svg)](https://doi.org/10.21105/joss.04864) [![Coverage Status](https://coveralls.io/repos/github/freqtrade/freqtrade/badge.svg?branch=develop&service=github)](https://coveralls.io/github/freqtrade/freqtrade?branch=develop) [![Documentation](https://readthedocs.org/projects/freqtrade/badge/)](https://www.freqtrade.io) diff --git a/build_helpers/binance_update_lev_tiers.py b/build_helpers/binance_update_lev_tiers.py index 6d5fa5c1d..64772abf7 100644 --- a/build_helpers/binance_update_lev_tiers.py +++ b/build_helpers/binance_update_lev_tiers.py @@ -12,7 +12,12 @@ secret = os.environ.get("FREQTRADE__EXCHANGE__SECRET") proxy = os.environ.get("CI_WEB_PROXY") exchange = ccxt.binance( - {"apiKey": key, "secret": secret, "httpsProxy": proxy, "options": {"defaultType": "swap"}} + { + "apiKey": key, + "secret": secret, + "httpsProxy": proxy, + "options": {"defaultType": "swap"}, + } ) _ = exchange.load_markets() diff --git a/build_helpers/create_command_partials.py b/build_helpers/create_command_partials.py index 7127950ed..97bec3a7d 100644 --- a/build_helpers/create_command_partials.py +++ b/build_helpers/create_command_partials.py @@ -1,4 +1,4 @@ -import subprocess +import subprocess # noqa: S404, RUF100 from pathlib import Path diff --git a/build_helpers/extract_config_json_schema.py b/build_helpers/extract_config_json_schema.py index 44ecc0f91..15bfd7720 100644 --- a/build_helpers/extract_config_json_schema.py +++ b/build_helpers/extract_config_json_schema.py @@ -4,10 +4,23 @@ from pathlib import Path import rapidjson -from freqtrade.configuration.config_schema import CONF_SCHEMA - def extract_config_json_schema(): + try: + # Try to import from the installed package + from freqtrade.config_schema import CONF_SCHEMA + except ImportError: + # If freqtrade is not installed, add the parent directory to sys.path + # to import directly from the source + import sys + + script_dir = Path(__file__).parent + freqtrade_dir = script_dir.parent + sys.path.insert(0, str(freqtrade_dir)) + + # Now try to import from the source + from freqtrade.config_schema import CONF_SCHEMA + schema_filename = Path(__file__).parent / "schema.json" with schema_filename.open("w") as f: rapidjson.dump(CONF_SCHEMA, f, indent=2) diff --git a/build_helpers/pyarrow-19.0.0-cp311-cp311-linux_armv7l.whl b/build_helpers/pyarrow-20.0.0-cp311-cp311-linux_armv7l.whl similarity index 63% rename from build_helpers/pyarrow-19.0.0-cp311-cp311-linux_armv7l.whl rename to build_helpers/pyarrow-20.0.0-cp311-cp311-linux_armv7l.whl index dbd6ba991..eadefdafb 100644 Binary files a/build_helpers/pyarrow-19.0.0-cp311-cp311-linux_armv7l.whl and b/build_helpers/pyarrow-20.0.0-cp311-cp311-linux_armv7l.whl differ diff --git a/build_helpers/schema.json b/build_helpers/schema.json index 15764df90..0aa2ea416 100644 --- a/build_helpers/schema.json +++ b/build_helpers/schema.json @@ -257,7 +257,8 @@ "enum": [ "day", "week", - "month" + "month", + "year" ] } }, @@ -541,6 +542,10 @@ "description": "Edge configuration.", "$ref": "#/definitions/edge" }, + "log_config": { + "description": "Logging configuration.", + "$ref": "#/definitions/logging" + }, "freqai": { "description": "FreqAI configuration.", "$ref": "#/definitions/freqai" @@ -612,6 +617,14 @@ "description": "Telegram topic ID - only applicable for group chats", "type": "string" }, + "authorized_users": { + "description": "Authorized users for the bot.", + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + }, "allow_custom_messages": { "description": "Allow sending custom messages from the Strategy.", "type": "boolean", @@ -1019,6 +1032,7 @@ "type": "string", "enum": [ "running", + "paused", "stopped" ] }, @@ -1272,6 +1286,30 @@ "allowed_risk" ] }, + "logging": { + "type": "object", + "properties": { + "version": { + "type": "number", + "const": 1 + }, + "formatters": { + "type": "object" + }, + "handlers": { + "type": "object" + }, + "root": { + "type": "object" + } + }, + "required": [ + "version", + "formatters", + "handlers", + "root" + ] + }, "external_message_consumer": { "description": "Configuration for external message consumer.", "type": "object", @@ -1366,10 +1404,10 @@ "type": "boolean", "default": false }, - "keras": { - "description": "Use Keras for model training.", - "type": "boolean", - "default": false + "identifier": { + "description": "A unique ID for the current model. Must be changed when modifying features.", + "type": "string", + "default": "example" }, "write_metrics_to_disk": { "description": "Write metrics to disk?", @@ -1399,16 +1437,49 @@ "type": "number", "default": 7 }, - "identifier": { - "description": "A unique ID for the current model. Must be changed when modifying features.", - "type": "string", - "default": "example" + "live_retrain_hours": { + "description": "Frequency of retraining during dry/live runs.", + "type": "number", + "default": 0 + }, + "expiration_hours": { + "description": "Avoid making predictions if a model is more than `expiration_hours` old. Defaults to 0 (no expiration).", + "type": "number", + "default": 0 + }, + "save_backtest_models": { + "description": "Save models to disk when running backtesting.", + "type": "boolean", + "default": false + }, + "fit_live_predictions_candles": { + "description": "Number of historical candles to use for computing target (label) statistics from prediction data, instead of from the training dataset.", + "type": "integer" + }, + "data_kitchen_thread_count": { + "description": "Designate the number of threads you want to use for data processing (outlier methods, normalization, etc.).", + "type": "integer" + }, + "activate_tensorboard": { + "description": "Indicate whether or not to activate tensorboard", + "type": "boolean", + "default": true }, "wait_for_training_iteration_on_reload": { "description": "Wait for the next training iteration to complete after /reload or ctrl+c.", "type": "boolean", "default": true }, + "continual_learning": { + "description": "Use the final state of the most recently trained model as starting point for the new model, allowing for incremental learning.", + "type": "boolean", + "default": false + }, + "keras": { + "description": "Use Keras for model training.", + "type": "boolean", + "default": false + }, "feature_parameters": { "description": "The parameters used to engineer the feature set", "type": "object", @@ -1445,6 +1516,14 @@ "type": "boolean", "default": false }, + "indicator_periods_candles": { + "description": "Time periods to calculate indicators for. The indicators are added to the base indicator dataset.", + "type": "array", + "items": { + "type": "number", + "minimum": 1 + } + }, "use_SVM_to_remove_outliers": { "description": "Use SVM to remove outliers from the features.", "type": "boolean", diff --git a/build_helpers/ta_lib-0.4.34-cp311-cp311-win_amd64.whl b/build_helpers/ta_lib-0.4.38-cp310-cp310-win_amd64.whl similarity index 67% rename from build_helpers/ta_lib-0.4.34-cp311-cp311-win_amd64.whl rename to build_helpers/ta_lib-0.4.38-cp310-cp310-win_amd64.whl index 3513df4ba..00610d687 100644 Binary files a/build_helpers/ta_lib-0.4.34-cp311-cp311-win_amd64.whl and b/build_helpers/ta_lib-0.4.38-cp310-cp310-win_amd64.whl differ diff --git a/build_helpers/ta_lib-0.4.34-cp311-cp311-linux_armv7l.whl b/build_helpers/ta_lib-0.4.38-cp311-cp311-linux_armv7l.whl similarity index 50% rename from build_helpers/ta_lib-0.4.34-cp311-cp311-linux_armv7l.whl rename to build_helpers/ta_lib-0.4.38-cp311-cp311-linux_armv7l.whl index 581361925..a255164d0 100644 Binary files a/build_helpers/ta_lib-0.4.34-cp311-cp311-linux_armv7l.whl and b/build_helpers/ta_lib-0.4.38-cp311-cp311-linux_armv7l.whl differ diff --git a/build_helpers/ta_lib-0.4.34-cp310-cp310-win_amd64.whl b/build_helpers/ta_lib-0.4.38-cp311-cp311-win_amd64.whl similarity index 67% rename from build_helpers/ta_lib-0.4.34-cp310-cp310-win_amd64.whl rename to build_helpers/ta_lib-0.4.38-cp311-cp311-win_amd64.whl index 32bb10e4f..7237604ba 100644 Binary files a/build_helpers/ta_lib-0.4.34-cp310-cp310-win_amd64.whl and b/build_helpers/ta_lib-0.4.38-cp311-cp311-win_amd64.whl differ diff --git a/build_helpers/ta_lib-0.4.34-cp312-cp312-win_amd64.whl b/build_helpers/ta_lib-0.4.38-cp312-cp312-win_amd64.whl similarity index 67% rename from build_helpers/ta_lib-0.4.34-cp312-cp312-win_amd64.whl rename to build_helpers/ta_lib-0.4.38-cp312-cp312-win_amd64.whl index 212668e58..fe37c8468 100644 Binary files a/build_helpers/ta_lib-0.4.34-cp312-cp312-win_amd64.whl and b/build_helpers/ta_lib-0.4.38-cp312-cp312-win_amd64.whl differ diff --git a/docker/Dockerfile.armhf b/docker/Dockerfile.armhf index ccc039a9d..9ae810a26 100644 --- a/docker/Dockerfile.armhf +++ b/docker/Dockerfile.armhf @@ -1,4 +1,4 @@ -FROM python:3.11.11-slim-bookworm as base +FROM python:3.11.12-slim-bookworm as base # Setup env ENV LANG C.UTF-8 @@ -34,7 +34,7 @@ COPY build_helpers/* /tmp/ # Install dependencies COPY --chown=ftuser:ftuser requirements.txt /freqtrade/ USER ftuser -RUN pip install --user --no-cache-dir numpy \ +RUN pip install --user --no-cache-dir "numpy<2" \ && pip install --user --no-index --find-links /tmp/ pyarrow TA-Lib \ && pip install --user --no-cache-dir -r requirements.txt diff --git a/docs/advanced-setup.md b/docs/advanced-setup.md index ae2304538..f20e91cb0 100644 --- a/docs/advanced-setup.md +++ b/docs/advanced-setup.md @@ -177,7 +177,7 @@ sudo loginctl enable-linger "$USER" If you run the bot as a service, you can use systemd service manager as a software watchdog monitoring freqtrade bot state and restarting it in the case of failures. If the `internals.sd_notify` parameter is set to true in the configuration or the `--sd-notify` command line option is used, the bot will send keep-alive ping messages to systemd -using the sd_notify (systemd notifications) protocol and will also tell systemd its current state (Running or Stopped) +using the sd_notify (systemd notifications) protocol and will also tell systemd its current state (Running, Paused or Stopped) when it changes. The `freqtrade.service.watchdog` file contains an example of the service unit configuration file which uses systemd @@ -188,30 +188,113 @@ as the watchdog. ## Advanced Logging +Freqtrade uses the default logging module provided by python. +Python allows for extensive [logging configuration](https://docs.python.org/3/library/logging.config.html#logging.config.dictConfig) in this regard - way more than what can be covered here. + +Default logging format (coloured terminal output) is set up by default if no `log_config` is provided in your freqtrade configuration. +Using `--logfile logfile.log` will enable the RotatingFileHandler. + +If you're not content with the log format, or with the default settings provided for the RotatingFileHandler, you can customize logging to your liking by adding the `log_config` configuration to your freqtrade configuration file(s). + +The default configuration looks roughly like the below, with the file handler being provided but not enabled as the `filename` is commented out. +Uncomment this line and supply a valid path/filename to enable it. + +``` json hl_lines="5-7 13-16 27" +{ + "log_config": { + "version": 1, + "formatters": { + "basic": { + "format": "%(message)s" + }, + "standard": { + "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s" + } + }, + "handlers": { + "console": { + "class": "freqtrade.loggers.ft_rich_handler.FtRichHandler", + "formatter": "basic" + }, + "file": { + "class": "logging.handlers.RotatingFileHandler", + "formatter": "standard", + // "filename": "someRandomLogFile.log", + "maxBytes": 10485760, + "backupCount": 10 + } + }, + "root": { + "handlers": [ + "console", + // "file" + ], + "level": "INFO", + } + } +} +``` + +!!! Note "highlighted lines" + Highlighted lines in the above code-block define the Rich handler and belong together. + The formatter "standard" and "file" will belong to the FileHandler. + +Each handler must use one of the defined formatters (by name), its class must be available, and must be a valid logging class. +To actually use a handler, it must be in the "handlers" section inside the "root" segment. +If this section is left out, freqtrade will provide no output (in the non-configured handler, anyway). + +!!! Tip "Explicit log configuration" + We recommend to extract the logging configuration from your main freqtrade configuration file, and provide it to your bot via [multiple configuration files](configuration.md#multiple-configuration-files) functionality. This will avoid unnecessary code duplication. + +--- + On many Linux systems the bot can be configured to send its log messages to `syslog` or `journald` system services. Logging to a remote `syslog` server is also available on Windows. The special values for the `--logfile` command line option can be used for this. ### Logging to syslog -To send Freqtrade log messages to a local or remote `syslog` service use the `--logfile` command line option with the value in the following format: +To send Freqtrade log messages to a local or remote `syslog` service use the `"log_config"` setup option to configure logging. -* `--logfile syslog:` -- send log messages to `syslog` service using the `` as the syslog address. +``` json +{ + // ... + "log_config": { + "version": 1, + "formatters": { + "syslog_fmt": { + "format": "%(name)s - %(levelname)s - %(message)s" + } + }, + "handlers": { + // Other handlers? + "syslog": { + "class": "logging.handlers.SysLogHandler", + "formatter": "syslog_fmt", + // Use one of the other options above as address instead? + "address": "/dev/log" + } + }, + "root": { + "handlers": [ + // other handlers + "syslog", + + ] + } -The syslog address can be either a Unix domain socket (socket filename) or a UDP socket specification, consisting of IP address and UDP port, separated by the `:` character. + } +} +``` -So, the following are the examples of possible usages: +[Additional log-handlers](#advanced-logging) may need to be configured to for example also have log output in the console. -* `--logfile syslog:/dev/log` -- log to syslog (rsyslog) using the `/dev/log` socket, suitable for most systems. -* `--logfile syslog` -- same as above, the shortcut for `/dev/log`. -* `--logfile syslog:/var/run/syslog` -- log to syslog (rsyslog) using the `/var/run/syslog` socket. Use this on MacOS. -* `--logfile syslog:localhost:514` -- log to local syslog using UDP socket, if it listens on port 514. -* `--logfile syslog::514` -- log to remote syslog at IP address and port 514. This may be used on Windows for remote logging to an external syslog server. +#### Syslog usage Log messages are send to `syslog` with the `user` facility. So you can see them with the following commands: -* `tail -f /var/log/user`, or +* `tail -f /var/log/user`, or * install a comprehensive graphical viewer (for instance, 'Log File Viewer' for Ubuntu). -On many systems `syslog` (`rsyslog`) fetches data from `journald` (and vice versa), so both `--logfile syslog` or `--logfile journald` can be used and the messages be viewed with both `journalctl` and a syslog viewer utility. You can combine this in any way which suites you better. +On many systems `syslog` (`rsyslog`) fetches data from `journald` (and vice versa), so both syslog or journald can be used and the messages be viewed with both `journalctl` and a syslog viewer utility. You can combine this in any way which suites you better. For `rsyslog` the messages from the bot can be redirected into a separate dedicated log file. To achieve this, add @@ -228,13 +311,69 @@ For `syslog` (`rsyslog`), the reduction mode can be switched on. This will reduc $RepeatedMsgReduction on ``` +#### Syslog addressing + +The syslog address can be either a Unix domain socket (socket filename) or a UDP socket specification, consisting of IP address and UDP port, separated by the `:` character. + + +So, the following are the examples of possible addresses: + +* `"address": "/dev/log"` -- log to syslog (rsyslog) using the `/dev/log` socket, suitable for most systems. +* `"address": "/var/run/syslog"` -- log to syslog (rsyslog) using the `/var/run/syslog` socket. Use this on MacOS. +* `"address": "localhost:514"` -- log to local syslog using UDP socket, if it listens on port 514. +* `"address": ":514"` -- log to remote syslog at IP address and port 514. This may be used on Windows for remote logging to an external syslog server. + + +??? Info "Deprecated - configure syslog via command line" + + `--logfile syslog:` -- send log messages to `syslog` service using the `` as the syslog address. + + The syslog address can be either a Unix domain socket (socket filename) or a UDP socket specification, consisting of IP address and UDP port, separated by the `:` character. + + So, the following are the examples of possible usages: + + * `--logfile syslog:/dev/log` -- log to syslog (rsyslog) using the `/dev/log` socket, suitable for most systems. + * `--logfile syslog` -- same as above, the shortcut for `/dev/log`. + * `--logfile syslog:/var/run/syslog` -- log to syslog (rsyslog) using the `/var/run/syslog` socket. Use this on MacOS. + * `--logfile syslog:localhost:514` -- log to local syslog using UDP socket, if it listens on port 514. + * `--logfile syslog::514` -- log to remote syslog at IP address and port 514. This may be used on Windows for remote logging to an external syslog server. + ### Logging to journald This needs the `cysystemd` python package installed as dependency (`pip install cysystemd`), which is not available on Windows. Hence, the whole journald logging functionality is not available for a bot running on Windows. -To send Freqtrade log messages to `journald` system service use the `--logfile` command line option with the value in the following format: +To send Freqtrade log messages to `journald` system service, add the following configuration snippet to your configuration. -* `--logfile journald` -- send log messages to `journald`. +``` json +{ + // ... + "log_config": { + "version": 1, + "formatters": { + "journald_fmt": { + "format": "%(name)s - %(levelname)s - %(message)s" + } + }, + "handlers": { + // Other handlers? + "journald": { + "class": "cysystemd.journal.JournaldLogHandler", + "formatter": "journald_fmt", + } + }, + "root": { + "handlers": [ + // .. + "journald", + + ] + } + + } +} +``` + +[Additional log-handlers](#advanced-logging) may need to be configured to for example also have log output in the console. Log messages are send to `journald` with the `user` facility. So you can see them with the following commands: @@ -244,3 +383,51 @@ Log messages are send to `journald` with the `user` facility. So you can see the There are many other options in the `journalctl` utility to filter the messages, see manual pages for this utility. On many systems `syslog` (`rsyslog`) fetches data from `journald` (and vice versa), so both `--logfile syslog` or `--logfile journald` can be used and the messages be viewed with both `journalctl` and a syslog viewer utility. You can combine this in any way which suites you better. + +??? Info "Deprecated - configure journald via command line" + To send Freqtrade log messages to `journald` system service use the `--logfile` command line option with the value in the following format: + + `--logfile journald` -- send log messages to `journald`. + +### Log format as JSON + +You can also configure the default output stream to use JSON format instead. +The "fmt_dict" attribute defines the keys for the json output - as well as the [python logging LogRecord attributes](https://docs.python.org/3/library/logging.html#logrecord-attributes). + +The below configuration will change the default output to JSON. The same formatter could however also be used in combination with the `RotatingFileHandler`. +We recommend to keep one format in human readable form. + +``` json +{ + // ... + "log_config": { + "version": 1, + "formatters": { + "json": { + "()": "freqtrade.loggers.json_formatter.JsonFormatter", + "fmt_dict": { + "timestamp": "asctime", + "level": "levelname", + "logger": "name", + "message": "message" + } + } + }, + "handlers": { + // Other handlers? + "jsonStream": { + "class": "logging.StreamHandler", + "formatter": "json" + } + }, + "root": { + "handlers": [ + // .. + "jsonStream", + + ] + } + + } +} +``` diff --git a/docs/backtesting.md b/docs/backtesting.md index 133f288f2..4d91b3ca6 100644 --- a/docs/backtesting.md +++ b/docs/backtesting.md @@ -209,6 +209,7 @@ A backtesting result will look like that: | Sortino | 1.88 | | Sharpe | 2.97 | | Calmar | 6.29 | +| SQN | 2.45 | | Profit factor | 1.11 | | Expectancy (Ratio) | -0.15 (-0.05) | | Avg. stake amount | 0.001 BTC | @@ -315,6 +316,7 @@ It contains some useful key metrics about performance of your strategy on backte | Sortino | 1.88 | | Sharpe | 2.97 | | Calmar | 6.29 | +| SQN | 2.45 | | Profit factor | 1.11 | | Expectancy (Ratio) | -0.15 (-0.05) | | Avg. stake amount | 0.001 BTC | @@ -368,6 +370,7 @@ It contains some useful key metrics about performance of your strategy on backte - `Sortino`: Annualized Sortino ratio. - `Sharpe`: Annualized Sharpe ratio. - `Calmar`: Annualized Calmar ratio. +- `SQN`: System Quality Number (SQN) - by Van Tharp. - `Profit factor`: profit / loss. - `Avg. stake amount`: Average stake amount, either `stake_amount` or the average when using dynamic stake amount. - `Total trade volume`: Volume generated on the exchange to reach the above profit. @@ -432,6 +435,20 @@ To save time, by default backtest will reuse a cached result from within the las To further analyze your backtest results, freqtrade will export the trades to file by default. You can then load the trades to perform further analysis as shown in the [data analysis](strategy_analysis_example.md#load-backtest-results-to-pandas-dataframe) backtesting section. +### Backtest output file + +The output file freqtrade produces is a zip file containing the following files: + +- The backtest report in json format +- the market change data in feather format +- a copy of the strategy file +- a copy of the strategy parameters (if a parameter file was used) +- a sanitized copy of the config file + +This will ensure results are reproducible - under the assumption that the same data is available. + +Only the strategy file and the config file are included in the zip file, eventual dependencies are not included. + ## Assumptions made by backtesting Since backtesting lacks some detailed information about what happens within a candle, it needs to take a few assumptions: diff --git a/docs/bot-basics.md b/docs/bot-basics.md index 1c88559c0..ff73aecde 100644 --- a/docs/bot-basics.md +++ b/docs/bot-basics.md @@ -54,11 +54,13 @@ By default, the bot loop runs every few seconds (`internals.process_throttle_sec * Check timeouts for open orders. * Calls `check_entry_timeout()` strategy callback for open entry orders. * Calls `check_exit_timeout()` strategy callback for open exit orders. - * Calls `adjust_entry_price()` strategy callback for open entry orders. + * Calls `adjust_order_price()` strategy callback for open orders. + * Calls `adjust_entry_price()` strategy callback for open entry orders. *only called when `adjust_order_price()` is not implemented* + * Calls `adjust_exit_price()` strategy callback for open exit orders. *only called when `adjust_order_price()` is not implemented* * Verifies existing positions and eventually places exit orders. * Considers stoploss, ROI and exit-signal, `custom_exit()` and `custom_stoploss()`. * Determine exit-price based on `exit_pricing` configuration setting or by using the `custom_exit_price()` callback. - * Before a exit order is placed, `confirm_trade_exit()` strategy callback is called. + * Before an exit order is placed, `confirm_trade_exit()` strategy callback is called. * Check position adjustments for open trades if enabled by calling `adjust_trade_position()` and place additional order if required. * Check if trade-slots are still available (if `max_open_trades` is reached). * Verifies entry signal trying to enter new positions. @@ -80,7 +82,9 @@ This loop will be repeated again and again until the bot is stopped. * Loops per candle simulating entry and exit points. * Calls `bot_loop_start()` strategy callback. * Check for Order timeouts, either via the `unfilledtimeout` configuration, or via `check_entry_timeout()` / `check_exit_timeout()` strategy callbacks. - * Calls `adjust_entry_price()` strategy callback for open entry orders. + * Calls `adjust_order_price()` strategy callback for open orders. + * Calls `adjust_entry_price()` strategy callback for open entry orders. *only called when `adjust_order_price()` is not implemented!* + * Calls `adjust_exit_price()` strategy callback for open exit orders. *only called when `adjust_order_price()` is not implemented!* * Check for trade entry signals (`enter_long` / `enter_short` columns). * Confirm trade entry / exits (calls `confirm_trade_entry()` and `confirm_trade_exit()` if implemented in the strategy). * Call `custom_entry_price()` (if implemented in the strategy) to determine entry price (Prices are moved to be within the opening candle). diff --git a/docs/commands/backtesting-analysis.md b/docs/commands/backtesting-analysis.md index 50707d03a..6aa18d670 100644 --- a/docs/commands/backtesting-analysis.md +++ b/docs/commands/backtesting-analysis.md @@ -59,7 +59,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/backtesting-show.md b/docs/commands/backtesting-show.md index 1c7889851..6a4565616 100644 --- a/docs/commands/backtesting-show.md +++ b/docs/commands/backtesting-show.md @@ -2,7 +2,7 @@ usage: freqtrade backtesting-show [-h] [-v] [--no-color] [--logfile FILE] [-V] [-c PATH] [-d PATH] [--userdir PATH] [--export-filename PATH] [--show-pair-list] - [--breakdown {day,week,month} [{day,week,month} ...]] + [--breakdown {day,week,month,year} [{day,week,month,year} ...]] options: -h, --help show this help message and exit @@ -11,8 +11,9 @@ options: `--export` to be set as well. Example: `--export-filen ame=user_data/backtest_results/backtest_today.json` --show-pair-list Show backtesting pairlist sorted by profit. - --breakdown {day,week,month} [{day,week,month} ...] - Show backtesting breakdown per [day, week, month]. + --breakdown {day,week,month,year} [{day,week,month,year} ...] + Show backtesting breakdown per [day, week, month, + year]. Common arguments: -v, --verbose Verbose mode (-vv for more, -vvv to get all messages). @@ -29,7 +30,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/backtesting.md b/docs/commands/backtesting.md index 160bda7cc..c54d9e40c 100644 --- a/docs/commands/backtesting.md +++ b/docs/commands/backtesting.md @@ -15,7 +15,7 @@ usage: freqtrade backtesting [-h] [-v] [--no-color] [--logfile FILE] [-V] [--strategy-list STRATEGY_LIST [STRATEGY_LIST ...]] [--export {none,trades,signals}] [--export-filename PATH] - [--breakdown {day,week,month} [{day,week,month} ...]] + [--breakdown {day,week,month,year} [{day,week,month,year} ...]] [--cache {none,day,week,month}] [--freqai-backtest-live-models] @@ -65,8 +65,9 @@ options: Use this filename for backtest results.Requires `--export` to be set as well. Example: `--export-filen ame=user_data/backtest_results/backtest_today.json` - --breakdown {day,week,month} [{day,week,month} ...] - Show backtesting breakdown per [day, week, month]. + --breakdown {day,week,month,year} [{day,week,month,year} ...] + Show backtesting breakdown per [day, week, month, + year]. --cache {none,day,week,month} Load a cached backtest result no older than specified age (default: day). @@ -88,7 +89,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/convert-data.md b/docs/commands/convert-data.md index 3bd0fa45b..32996eba3 100644 --- a/docs/commands/convert-data.md +++ b/docs/commands/convert-data.md @@ -45,7 +45,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/convert-trade-data.md b/docs/commands/convert-trade-data.md index 25843a8da..cf53e5329 100644 --- a/docs/commands/convert-trade-data.md +++ b/docs/commands/convert-trade-data.md @@ -34,7 +34,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/download-data.md b/docs/commands/download-data.md index e70ae9a23..ce80e704e 100644 --- a/docs/commands/download-data.md +++ b/docs/commands/download-data.md @@ -63,7 +63,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/edge.md b/docs/commands/edge.md index 06f883230..c69a63583 100644 --- a/docs/commands/edge.md +++ b/docs/commands/edge.md @@ -50,7 +50,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/hyperopt-list.md b/docs/commands/hyperopt-list.md index 5e8398f51..8457aba27 100644 --- a/docs/commands/hyperopt-list.md +++ b/docs/commands/hyperopt-list.md @@ -55,7 +55,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/hyperopt-show.md b/docs/commands/hyperopt-show.md index 9c7c378ab..5cd114c17 100644 --- a/docs/commands/hyperopt-show.md +++ b/docs/commands/hyperopt-show.md @@ -4,7 +4,7 @@ usage: freqtrade hyperopt-show [-h] [-v] [--no-color] [--logfile FILE] [-V] [--profitable] [-n INT] [--print-json] [--hyperopt-filename FILENAME] [--no-header] [--disable-param-export] - [--breakdown {day,week,month} [{day,week,month} ...]] + [--breakdown {day,week,month,year} [{day,week,month,year} ...]] options: -h, --help show this help message and exit @@ -18,8 +18,9 @@ options: --no-header Do not print epoch details header. --disable-param-export Disable automatic hyperopt parameter export. - --breakdown {day,week,month} [{day,week,month} ...] - Show backtesting breakdown per [day, week, month]. + --breakdown {day,week,month,year} [{day,week,month,year} ...] + Show backtesting breakdown per [day, week, month, + year]. Common arguments: -v, --verbose Verbose mode (-vv for more, -vvv to get all messages). @@ -36,7 +37,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/hyperopt.md b/docs/commands/hyperopt.md index 2fc522d0f..e7a05bedf 100644 --- a/docs/commands/hyperopt.md +++ b/docs/commands/hyperopt.md @@ -79,6 +79,7 @@ options: SortinoHyperOptLoss, SortinoHyperOptLossDaily, CalmarHyperOptLoss, MaxDrawDownHyperOptLoss, MaxDrawDownRelativeHyperOptLoss, + MaxDrawDownPerPairHyperOptLoss, ProfitDrawDownHyperOptLoss, MultiMetricHyperOptLoss --disable-param-export Disable automatic hyperopt parameter export. @@ -102,7 +103,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/install-ui.md b/docs/commands/install-ui.md index 57e8fbda2..b8430e36e 100644 --- a/docs/commands/install-ui.md +++ b/docs/commands/install-ui.md @@ -1,9 +1,12 @@ ``` -usage: freqtrade install-ui [-h] [--erase] [--ui-version UI_VERSION] +usage: freqtrade install-ui [-h] [--erase] [--prerelease] + [--ui-version UI_VERSION] options: -h, --help show this help message and exit --erase Clean UI folder, don't download new version. + --prerelease Install the latest pre-release version of FreqUI. This + is not recommended for production use. --ui-version UI_VERSION Specify a specific version of FreqUI to install. Not specifying this installs the latest version. diff --git a/docs/commands/list-data.md b/docs/commands/list-data.md index c6e8cc94e..515207178 100644 --- a/docs/commands/list-data.md +++ b/docs/commands/list-data.md @@ -41,7 +41,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/list-exchanges.md b/docs/commands/list-exchanges.md index c95ae3ebd..f551c8aa8 100644 --- a/docs/commands/list-exchanges.md +++ b/docs/commands/list-exchanges.md @@ -22,7 +22,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/list-freqaimodels.md b/docs/commands/list-freqaimodels.md index 3e66880ab..c4a588eba 100644 --- a/docs/commands/list-freqaimodels.md +++ b/docs/commands/list-freqaimodels.md @@ -24,7 +24,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/list-hyperoptloss.md b/docs/commands/list-hyperoptloss.md index 1a1604b0f..2762c3fe7 100644 --- a/docs/commands/list-hyperoptloss.md +++ b/docs/commands/list-hyperoptloss.md @@ -24,7 +24,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/list-markets.md b/docs/commands/list-markets.md index d33b9c5d1..d2233e1da 100644 --- a/docs/commands/list-markets.md +++ b/docs/commands/list-markets.md @@ -39,7 +39,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/list-pairs.md b/docs/commands/list-pairs.md index 3d8e677ee..3f991e414 100644 --- a/docs/commands/list-pairs.md +++ b/docs/commands/list-pairs.md @@ -39,7 +39,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/list-strategies.md b/docs/commands/list-strategies.md index af5771860..95f79e175 100644 --- a/docs/commands/list-strategies.md +++ b/docs/commands/list-strategies.md @@ -27,7 +27,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/list-timeframes.md b/docs/commands/list-timeframes.md index 8dc10a789..bcd45b151 100644 --- a/docs/commands/list-timeframes.md +++ b/docs/commands/list-timeframes.md @@ -23,7 +23,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/lookahead-analysis.md b/docs/commands/lookahead-analysis.md index bb7ef5d8e..7870d212e 100644 --- a/docs/commands/lookahead-analysis.md +++ b/docs/commands/lookahead-analysis.md @@ -89,7 +89,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/plot-dataframe.md b/docs/commands/plot-dataframe.md index 81ecc0da7..e101d0d5b 100644 --- a/docs/commands/plot-dataframe.md +++ b/docs/commands/plot-dataframe.md @@ -63,7 +63,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/plot-profit.md b/docs/commands/plot-profit.md index 207697a93..2c0b0e6b5 100644 --- a/docs/commands/plot-profit.md +++ b/docs/commands/plot-profit.md @@ -49,7 +49,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/recursive-analysis.md b/docs/commands/recursive-analysis.md index b39e8fb35..39b4fc3da 100644 --- a/docs/commands/recursive-analysis.md +++ b/docs/commands/recursive-analysis.md @@ -41,7 +41,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/show-trades.md b/docs/commands/show-trades.md index 316d47448..6ac64cae7 100644 --- a/docs/commands/show-trades.md +++ b/docs/commands/show-trades.md @@ -30,7 +30,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/strategy-updater.md b/docs/commands/strategy-updater.md index ba40322ec..c2804fee2 100644 --- a/docs/commands/strategy-updater.md +++ b/docs/commands/strategy-updater.md @@ -34,7 +34,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/trade.md b/docs/commands/trade.md index b689902c2..0189669c0 100644 --- a/docs/commands/trade.md +++ b/docs/commands/trade.md @@ -36,7 +36,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/trades-to-ohlcv.md b/docs/commands/trades-to-ohlcv.md index c2d42a5cc..748a8ace5 100644 --- a/docs/commands/trades-to-ohlcv.md +++ b/docs/commands/trades-to-ohlcv.md @@ -41,7 +41,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/commands/webserver.md b/docs/commands/webserver.md index a99b83e97..1ac7bd13b 100644 --- a/docs/commands/webserver.md +++ b/docs/commands/webserver.md @@ -20,7 +20,9 @@ Common arguments: exists). Multiple --config options may be used. Can be set to `-` to read config from stdin. -d PATH, --datadir PATH, --data-dir PATH - Path to directory with historical backtesting data. + Path to the base directory of the exchange with + historical backtesting data. To see futures data, use + trading-mode additionally. --userdir PATH, --user-data-dir PATH Path to userdata directory. diff --git a/docs/configuration.md b/docs/configuration.md index fdddf7cda..8c122b9b7 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -205,7 +205,7 @@ Mandatory parameters are marked as **Required**, which means that they are requi | `exit_pricing.use_order_book` | Enable exiting of open trades using [Order Book Exit](#exit-price-with-orderbook-enabled).
*Defaults to `true`.*
**Datatype:** Boolean | `exit_pricing.order_book_top` | Bot will use the top N rate in Order Book "price_side" to exit. I.e. a value of 2 will allow the bot to pick the 2nd ask rate in [Order Book Exit](#exit-price-with-orderbook-enabled)
*Defaults to `1`.*
**Datatype:** Positive Integer | `custom_price_max_distance_ratio` | Configure maximum distance ratio between current and custom entry or exit price.
*Defaults to `0.02` 2%).*
**Datatype:** Positive float -| | **TODO** +| | **Order/Signal handling** | `use_exit_signal` | Use exit signals produced by the strategy in addition to the `minimal_roi`.
Setting this to false disables the usage of `"exit_long"` and `"exit_short"` columns. Has no influence on other exit methods (Stoploss, ROI, callbacks). [Strategy Override](#parameters-in-the-strategy).
*Defaults to `true`.*
**Datatype:** Boolean | `exit_profit_only` | Wait until the bot reaches `exit_profit_offset` before taking an exit decision. [Strategy Override](#parameters-in-the-strategy).
*Defaults to `false`.*
**Datatype:** Boolean | `exit_profit_offset` | Exit-signal is only active above this value. Only active in combination with `exit_profit_only=True`. [Strategy Override](#parameters-in-the-strategy).
*Defaults to `0.0`.*
**Datatype:** Float (as ratio) @@ -266,7 +266,7 @@ Mandatory parameters are marked as **Required**, which means that they are requi | `bot_name` | Name of the bot. Passed via API to a client - can be shown to distinguish / name bots.
*Defaults to `freqtrade`*
**Datatype:** String | `external_message_consumer` | Enable [Producer/Consumer mode](producer-consumer.md) for more details.
**Datatype:** Dict | | **Other** -| `initial_state` | Defines the initial application state. If set to stopped, then the bot has to be explicitly started via `/start` RPC command.
*Defaults to `stopped`.*
**Datatype:** Enum, either `stopped` or `running` +| `initial_state` | Defines the initial application state. If set to stopped, then the bot has to be explicitly started via `/start` RPC command.
*Defaults to `stopped`.*
**Datatype:** Enum, either `running`, `paused` or `stopped` | `force_entry_enable` | Enables the RPC Commands to force a Trade entry. More information below.
**Datatype:** Boolean | `disable_dataframe_checks` | Disable checking the OHLCV dataframe returned from the strategy methods for correctness. Only use when intentionally changing the dataframe and understand what you are doing. [Strategy Override](#parameters-in-the-strategy).
*Defaults to `False`*.
**Datatype:** Boolean | `internals.process_throttle_secs` | Set the process throttle, or minimum loop duration for one bot iteration loop. Value in second.
*Defaults to `5` seconds.*
**Datatype:** Positive Integer @@ -281,7 +281,8 @@ Mandatory parameters are marked as **Required**, which means that they are requi | `add_config_files` | Additional config files. These files will be loaded and merged with the current config file. The files are resolved relative to the initial file.
*Defaults to `[]`*.
**Datatype:** List of strings | `dataformat_ohlcv` | Data format to use to store historical candle (OHLCV) data.
*Defaults to `feather`*.
**Datatype:** String | `dataformat_trades` | Data format to use to store historical trades data.
*Defaults to `feather`*.
**Datatype:** String -| `reduce_df_footprint` | Recast all numeric columns to float32/int32, with the objective of reducing ram/disk usage (and decreasing train/inference timing in FreqAI). (Currently only affects FreqAI use-cases)
**Datatype:** Boolean.
Default: `False`. +| `reduce_df_footprint` | Recast all numeric columns to float32/int32, with the objective of reducing ram/disk usage (and decreasing train/inference timing backtesting/hyperopt and in FreqAI).
**Datatype:** Boolean.
Default: `False`. +| `log_config` | Dictionary containing the log config for python logging. [more info](advanced-setup.md#advanced-logging)
**Datatype:** dict.
Default: `FtRichHandler` ### Parameters in the strategy diff --git a/docs/deprecated.md b/docs/deprecated.md index 729db4915..2e76f2413 100644 --- a/docs/deprecated.md +++ b/docs/deprecated.md @@ -88,3 +88,8 @@ Setting protections from the configuration via `"protections": [],` has been rem Using hdf5 as data storage has been deprecated in 2024.12 and was 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 before updating. + +## Configuring advanced logging via config + +Configuring syslog and journald via `--logfile systemd` and `--logfile journald` respectively has been deprecated in 2025.3. +Please use configuration based [log setup](advanced-setup.md#advanced-logging) instead. diff --git a/docs/exchanges.md b/docs/exchanges.md index 953fb5f8c..f058ed86e 100644 --- a/docs/exchanges.md +++ b/docs/exchanges.md @@ -363,6 +363,10 @@ Hyperliquid handles deposits and withdrawals on the Arbitrum One chain, a Layer * 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. +### Historic Hyperliquid data + +The Hyperliquid API does not provide historic data beyond the single call to fetch current data, so downloading data is not possible, as the downloaded data would not constitute proper historic data. + ## 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. diff --git a/docs/freqai-configuration.md b/docs/freqai-configuration.md index 7ae2535f6..5ab7b2602 100644 --- a/docs/freqai-configuration.md +++ b/docs/freqai-configuration.md @@ -258,6 +258,8 @@ freqtrade trade --config config_examples/config_freqai.example.json --strategy F We do provide an explicit docker-compose file for this in `docker/docker-compose-freqai.yml` - which can be used via `docker compose -f docker/docker-compose-freqai.yml run ...` - or can be copied to replace the original docker file. This docker-compose file also contains a (disabled) section to enable GPU resources within docker containers. This obviously assumes the system has GPU resources available. + PyTorch dropped support for macOS x64 (intel based Apple devices) in version 2.3. Subsequently, freqtrade also dropped support for PyTorch on this platform. + ### Structure #### Model diff --git a/docs/hyperopt.md b/docs/hyperopt.md index 51a6a5187..ecd32552e 100644 --- a/docs/hyperopt.md +++ b/docs/hyperopt.md @@ -471,6 +471,7 @@ Currently, the following loss functions are builtin: * `SortinoHyperOptLossDaily` - optimizes Sortino Ratio calculated on **daily** trade returns relative to **downside** standard deviation. * `MaxDrawDownHyperOptLoss` - Optimizes Maximum absolute drawdown. * `MaxDrawDownRelativeHyperOptLoss` - Optimizes both maximum absolute drawdown while also adjusting for maximum relative drawdown. +* `MaxDrawDownPerPairHyperOptLoss` - Calculates the profit/drawdown ratio per pair and returns the worst result as objective, forcing hyperopt to optimize the parameters for all pairs in the pairlist. This way, we prevent one or more pairs with good results from inflating the metrics, while the pairs with poor results are not represented and therefore not optimized. * `CalmarHyperOptLoss` - Optimizes Calmar Ratio calculated on trade returns relative to max drawdown. * `ProfitDrawDownHyperOptLoss` - Optimizes by max Profit & min Drawdown objective. `DRAWDOWN_MULT` variable within the hyperoptloss file can be adjusted to be stricter or more flexible on drawdown purposes. * `MultiMetricHyperOptLoss` - Optimizes by several key metrics to achieve balanced performance. The primary focus is on maximizing Profit and minimizing Drawdown, while also considering additional metrics such as Profit Factor, Expectancy Ratio and Winrate. Moreover, it applies a penalty for epochs with a low number of trades, encouraging strategies with adequate trade frequency. diff --git a/docs/includes/pairlists.md b/docs/includes/pairlists.md index 7e4659807..32b97605c 100644 --- a/docs/includes/pairlists.md +++ b/docs/includes/pairlists.md @@ -44,9 +44,24 @@ You may also use something like `.*DOWN/BTC` or `.*UP/BTC` to exclude leveraged By default, the `StaticPairList` method is used, which uses a statically defined pair whitelist from the configuration. The pairlist also supports wildcards (in regex-style) - so `.*/BTC` will include all pairs with BTC as a stake. -It uses configuration from `exchange.pair_whitelist` and `exchange.pair_blacklist`. +It uses configuration from `exchange.pair_whitelist` and `exchange.pair_blacklist`, which in the below example, will trade BTC/USDT and ETH/USDT - and will prevent BNB/USDT trading. + +Both `pair_*list` parameters support regex - so values like `.*/USDT` would enable trading all pairs that are not in the blacklist. ```json +"exchange": { + "name": "...", + // ... + "pair_whitelist": [ + "BTC/USDT", + "ETH/USDT", + // ... + ], + "pair_blacklist": [ + "BNB/USDT", + // ... + ] +}, "pairlists": [ {"method": "StaticPairList"} ], @@ -377,6 +392,9 @@ If an incorrect category string is chosen, the plugin will print the available c !!! Warning "Many categories" Each added category corresponds to one API call to CoinGecko. The more categories you add, the longer the pairlist generation will take, potentially causing rate limit issues. +!!! Danger "Duplicate symbols in coingecko" + Coingecko often has duplicate symbols, where the same symbol is used for different coins. Freqtrade will use the symbol as is and try to search for it on the exchange. If the symbol exists - it will be used. Freqtrade will however not check if the _intended_ symbol is the one coingecko meant. This can sometimes lead to unexpected results, especially on low volume coins or with meme coin categories. + #### AgeFilter Removes pairs that have been listed on the exchange for less than `min_days_listed` days (defaults to `10`) or more than `max_days_listed` days (defaults `None` mean infinity). diff --git a/docs/includes/showcase.md b/docs/includes/showcase.md index 766703b9f..6fb5f15cf 100644 --- a/docs/includes/showcase.md +++ b/docs/includes/showcase.md @@ -3,7 +3,7 @@ This section will highlight a few projects from members of the community. The projects below are for the most part not maintained by the freqtrade , therefore use your own caution before using them. - [Example freqtrade strategies](https://github.com/freqtrade/freqtrade-strategies/) -- [FrequentHippo - Grafana dashboard with dry/live runs and backtests](http://frequenthippo.ddns.net:3000/) (by hippocritical). +- [FrequentHippo - Statistics of dry/live runs and backtests](http://frequenthippo.ddns.net) (by hippocritical). - [Online pairlist generator](https://remotepairlist.com/) (by Blood4rc). - [Freqtrade Backtesting Project](https://strat.ninja/) (by Blood4rc). - [Freqtrade analysis notebook](https://github.com/froggleston/freqtrade_analysis_notebook) (by Froggleston). diff --git a/docs/index.md b/docs/index.md index 79c60072d..d05fcc2c1 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,6 @@ ![freqtrade](assets/freqtrade_poweredby.svg) -[![Freqtrade CI](https://github.com/freqtrade/freqtrade/workflows/Freqtrade%20CI/badge.svg)](https://github.com/freqtrade/freqtrade/actions/) +[![Freqtrade CI](https://github.com/freqtrade/freqtrade/actions/workflows/ci.yml/badge.svg?branch=develop)](https://github.com/freqtrade/freqtrade/actions/) [![DOI](https://joss.theoj.org/papers/10.21105/joss.04864/status.svg)](https://doi.org/10.21105/joss.04864) [![Coverage Status](https://coveralls.io/repos/github/freqtrade/freqtrade/badge.svg?branch=develop&service=github)](https://coveralls.io/github/freqtrade/freqtrade?branch=develop) [![Maintainability](https://api.codeclimate.com/v1/badges/5737e6d668200b7518ff/maintainability)](https://codeclimate.com/github/freqtrade/freqtrade/maintainability) diff --git a/docs/requirements-docs.txt b/docs/requirements-docs.txt index b71ff4682..d498cacdc 100644 --- a/docs/requirements-docs.txt +++ b/docs/requirements-docs.txt @@ -1,7 +1,7 @@ -markdown==3.7 +markdown==3.8 mkdocs==1.6.1 -mkdocs-material==9.6.3 +mkdocs-material==9.6.12 mdx_truly_sane_lists==1.3 -pymdown-extensions==10.14.3 -jinja2==3.1.5 +pymdown-extensions==10.15 +jinja2==3.1.6 mike==2.1.3 diff --git a/docs/rest-api.md b/docs/rest-api.md index b958c0927..cea4d2ee9 100644 --- a/docs/rest-api.md +++ b/docs/rest-api.md @@ -268,6 +268,9 @@ show_config start Start the bot if it's in the stopped state. +pause + Pause the bot if it's in the running state. If triggered on stopped state will handle open positions. + stats Return the stats report (durations, sell-reasons). @@ -302,6 +305,19 @@ trades :param limit: Limits trades to the X last trades. Max 500 trades. :param offset: Offset by this amount of trades. +list_open_trades_custom_data + Return a dict containing open trades custom-datas + + :param key: str, optional - Key of the custom-data + :param limit: Limits trades to X trades. + :param offset: Offset by this amount of trades. + +list_custom_data + Return a dict containing custom-datas of a specified trade + + :param trade_id: int - ID of the trade + :param key: str, optional - Key of the custom-data + version Return the version of the bot. @@ -320,6 +336,7 @@ All endpoints in the below table need to be prefixed with the base URL of the AP |-----------|--------|--------------------------| | `/ping` | GET | Simple command testing the API Readiness - requires no authentication. | `/start` | POST | Starts the trader. +| `/pause` | POST | Pause the trader. Gracefully handle open trades according to their rules. Do not enter new positions. | `/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. diff --git a/docs/stoploss.md b/docs/stoploss.md index 69c69626f..7fbe6dabc 100644 --- a/docs/stoploss.md +++ b/docs/stoploss.md @@ -154,10 +154,10 @@ For example, simplified math: In summary: The stoploss will be adjusted to be always be -10% of the highest observed price. -### Trailing stop loss, custom positive loss +### Trailing stop loss, different positive loss -You could also have a default stop loss when you are in the red with your buy (buy - fee), but once you hit a positive result (or an offset you define) the system will utilize a new stop loss, which can have a different value. -For example, your default stop loss is -10%, but once you have more than 0% profit (example 0.1%) a different trailing stoploss will be used. +You could also have a default stop loss when you are in the red with your buy (buy - fee), but once you hit a positive result (or an offset you define) the system will utilize a new stop loss, with a different value. +For example, your default stop loss is -10%, but once you have reached profitability (example 0.1%) a different trailing stoploss will be used. !!! Note If you want the stoploss to only be changed when you break even of making a profit (what most users want) please refer to next section with [offset enabled](#trailing-stop-loss-only-once-the-trade-has-reached-a-certain-offset). @@ -208,7 +208,9 @@ Before this, `stoploss` is used for the trailing stoploss. You can also keep a static stoploss until the offset is reached, and then trail the trade to take profits once the market turns. -If `trailing_only_offset_is_reached = True` then the trailing stoploss is only activated once the offset is reached. Until then, the stoploss remains at the configured `stoploss`. +If `trailing_only_offset_is_reached = True` then the trailing stoploss is only activated once the offset is reached. Until then, the stoploss remains at the configured `stoploss` and is not trailing. +Leaving this value as `trailing_only_offset_is_reached=False` will allow the trailing stoploss to start trailing as soon as the asset price increases above the initial entry price. + This option can be used with or without `trailing_stop_positive`, but uses `trailing_stop_positive_offset` as offset. Configuration (offset is buy-price + 3%): diff --git a/docs/strategy-101.md b/docs/strategy-101.md index e7618d90f..a5e100b8d 100644 --- a/docs/strategy-101.md +++ b/docs/strategy-101.md @@ -79,6 +79,8 @@ import talib.abstract as ta class MyStrategy(IStrategy): + timeframe = '15m' + # set the initial stoploss to -10% stoploss = -0.10 @@ -163,18 +165,23 @@ If there is any significant difference, verify that your entry and exit signals ## Controlling or monitoring a running bot -Once your bot is running in dry or live mode, Freqtrade has five mechanisms to control or monitor a running bot: +Once your bot is running in dry or live mode, Freqtrade has six mechanisms to control or monitor a running bot: - **[FreqUI](freq-ui.md)**: The easiest to get started with, FreqUI is a web interface to see and control current activity of your bot. - **[Telegram](telegram-usage.md)**: On mobile devices, Telegram integration is available to get alerts about your bot activity and to control certain aspects. - **[FTUI](https://github.com/freqtrade/ftui)**: FTUI is a terminal (command line) interface to Freqtrade, and allows monitoring of a running bot only. -- **[REST API](rest-api.md)**: The REST API allows programmers to develop their own tools to interact with a Freqtrade bot. +- **[freqtrade-client](rest-api.md#consuming-the-api)**: A python implementation of the REST API, making it easy to make requests and consume bot responses from your python apps or the command line. +- **[REST API endpoints](rest-api.md#available-endpoints)**: The REST API allows programmers to develop their own tools to interact with a Freqtrade bot. - **[Webhooks](webhook-config.md)**: Freqtrade can send information to other services, e.g. discord, by webhooks. ### Logs Freqtrade generates extensive debugging logs to help you understand what's happening. Please familiarise yourself with the information and error messages you might see in your bot logs. +Logging by default occurs on standard out (the command line). If you want to write out to a file instead, many freqtrade commands, including the `trade` command, accept the `--logfile` option to write to a file. + +Check the [FAQ](faq.md#how-do-i-search-the-bot-logs-for-something) for examples. + ## Final Thoughts Algo trading is difficult, and most public strategies are not good performers due to the time and effort to make a strategy work profitably in multiple scenarios. diff --git a/docs/strategy-callbacks.md b/docs/strategy-callbacks.md index ea71b642c..11f834417 100644 --- a/docs/strategy-callbacks.md +++ b/docs/strategy-callbacks.md @@ -758,7 +758,7 @@ For performance reasons, it's disabled by default and freqtrade will show a warn Additional orders also result in additional fees and those orders don't count towards `max_open_trades`. -This callback is also called when there is an open order (either buy or sell) waiting for execution - and will cancel the existing open order to place a new order if the amount, price or direction is different. +This callback is also called when there is an open order (either buy or sell) waiting for execution - and will cancel the existing open order to place a new order if the amount, price or direction is different. Also partially filled orders will be canceled, and will be replaced with the new amount as returned by the callback. `adjust_trade_position()` is called very frequently for the duration of a trade, so you must keep your implementation as performant as possible. @@ -770,9 +770,10 @@ Modifications to leverage are not possible, and the stake-amount returned is ass The combined stake currently allocated to the position is held in `trade.stake_amount`. Therefore `trade.stake_amount` will always be updated on every additional entry and partial exit made through `adjust_trade_position()`. !!! 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. + On dry and live run, this function will be called every `throttle_process_secs` (default to 5s). If you have a loose logic, (e.g. increase position if RSI of the last candle is below 30), your bot will do extra re-entry every 5 secs until you either it run out of money, 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. + Same thing also can happen with partial exit. + So be sure to have a strict logic and/or check for the last filled order and if an order is already open. !!! 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. @@ -876,6 +877,9 @@ class DigDeeperStrategy(IStrategy): Return None for no action. Optionally, return a tuple with a 2nd element with an order reason """ + if trade.has_open_orders: + # Only act if no orders are open + return if current_profit > 0.05 and trade.nr_of_successful_exits == 0: # Take half of the profit at +5% @@ -934,28 +938,25 @@ class DigDeeperStrategy(IStrategy): The total profit for this trade was 950$ on a 3350$ investment (`100@8$ + 100@9$ + 150@11$`). As such - the final relative profit is 28.35% (`950 / 3350`). -## Adjust Entry Price +## Adjust order Price -The `adjust_entry_price()` callback may be used by strategy developer to refresh/replace limit orders upon arrival of new candles. +The `adjust_order_price()` callback may be used by strategy developer to refresh/replace limit orders upon arrival of new candles. This callback is called once every iteration unless the order has been (re)placed within the current candle - limiting the maximum (re)placement of each order to once per candle. This also means that the first call will be at the start of the next candle after the initial order was placed. -Be aware that `custom_entry_price()` is still the one dictating initial entry limit order price target at the time of entry trigger. +Be aware that `custom_entry_price()`/`custom_exit_price()` is still the one dictating initial limit order price target at the time of the signal. Orders can be cancelled out of this callback by returning `None`. Returning `current_order_rate` will keep the order on the exchange "as is". Returning any other price will cancel the existing order, and replace it with a new order. -The trade open-date (`trade.open_date_utc`) will remain at the time of the very first order placed. -Please make sure to be aware of this - and eventually adjust your logic in other callbacks to account for this, and use the date of the first filled order instead. - If the cancellation of the original order fails, then the order will not be replaced - though the order will most likely have been canceled on exchange. Having this happen on initial entries will result in the deletion of the order, while on position adjustment orders, it'll result in the trade size remaining as is. -If the order has been partially filled, the order will not be replaced. You can however use [`adjust_trade_position()`](#adjust-trade-position) to adjust the trade size to the full, expected position size, should this be necessary / desired. +If the order has been partially filled, the order will not be replaced. You can however use [`adjust_trade_position()`](#adjust-trade-position) to adjust the trade size to the expected position size, should this be necessary / desired. !!! Warning "Regular timeout" - Entry `unfilledtimeout` mechanism (as well as `check_entry_timeout()`) takes precedence over this. - Entry Orders that are cancelled via the above methods will not have this callback called. Be sure to update timeout values to match your expectations. + Entry `unfilledtimeout` mechanism (as well as `check_entry_timeout()`/`check_exit_timeout()`) takes precedence over this callback. + Orders that are cancelled via the above methods will not have this callback called. Be sure to update timeout values to match your expectations. ```python # Default imports @@ -964,14 +965,26 @@ class AwesomeStrategy(IStrategy): # ... populate_* methods - 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: + def adjust_order_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, + is_entry: bool, + **kwargs, + ) -> float | None: """ - Entry price re-adjustment logic, returning the user desired limit price. + Exit and entry order 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) and not timed out on subsequent candles after entry trigger. + For full documentation please go to https://www.freqtrade.io/en/latest/strategy-callbacks/ + When not implemented by a strategy, returns current_order_rate as default. If current_order_rate is returned then the existing order is maintained. If None is returned then order gets canceled but not replaced by a new one. @@ -983,14 +996,16 @@ class AwesomeStrategy(IStrategy): :param proposed_rate: Rate, calculated based on pricing settings in entry_pricing. :param current_order_rate: Rate of the existing order in place. :param entry_tag: Optional entry_tag (buy_tag) if provided with the buy signal. - :param side: "long" or "short" - indicating the direction of the proposed trade + :param side: 'long' or 'short' - indicating the direction of the proposed trade + :param is_entry: True if the order is an entry order, False if it's an exit order. :param **kwargs: Ensure to keep this here so updates to this won't break your strategy. - :return float: New entry price value if provided - + :return float or None: New entry price value if provided """ - # Limit orders to use and follow SMA200 as price target for the first 10 minutes since entry trigger for BTC/USDT pair. + + # Limit entry 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" + is_entry + and pair == "BTC/USDT" and entry_tag == "long_sma200" and side == "long" and (current_time - timedelta(minutes=10)) <= trade.open_date_utc @@ -1007,6 +1022,26 @@ class AwesomeStrategy(IStrategy): return current_order_rate ``` +!!! danger "Incompatibility with `adjust_*_price()`" + If you have both `adjust_order_price()` and `adjust_entry_price()`/`adjust_exit_price()` implemented, only `adjust_order_price()` will be used. + If you need to adjust entry/exit prices, you can either implement the logic in `adjust_order_price()`, or use the split `adjust_entry_price()` / `adjust_exit_price()` callbacks, but not both. + Mixing these is not supported and will raise an error during bot startup. + +### Adjust Entry Price + +The `adjust_entry_price()` callback may be used by strategy developer to refresh/replace entry limit orders upon arrival. +It's a sub-set of `adjust_order_price()` and is called only for entry orders. +All remaining behavior is identical to `adjust_order_price()`. + +The trade open-date (`trade.open_date_utc`) will remain at the time of the very first order placed. +Please make sure to be aware of this - and eventually adjust your logic in other callbacks to account for this, and use the date of the first filled order instead. + +### Adjust Exit Price + +The `adjust_exit_price()` callback may be used by strategy developer to refresh/replace exit limit orders upon arrival. +It's a sub-set of `adjust_order_price()` and is called only for exit orders. +All remaining behavior is identical to `adjust_order_price()`. + ## Leverage Callback When trading in markets that allow leverage, this method must return the desired Leverage (Defaults to 1 -> No leverage). diff --git a/docs/strategy-customization.md b/docs/strategy-customization.md index 11b71caa9..1220db492 100644 --- a/docs/strategy-customization.md +++ b/docs/strategy-customization.md @@ -513,7 +513,7 @@ By default, freqtrade will attempt to load strategies from all `.py` files withi Assuming your strategy is called `AwesomeStrategy`, stored in the file `user_data/strategies/AwesomeStrategy.py`, then you can start freqtrade in dry (or live, depending on your configuration) mode with: ```bash - freqtrade trade --strategy AwesomeStrategy` +freqtrade trade --strategy AwesomeStrategy ``` Note that we're using the class name, not the file name. @@ -1122,6 +1122,7 @@ The following list contains some common patterns which should be avoided to prev - don't use `.iloc[-1]` or any other absolute position in the dataframe within `populate_` functions, as this will be different between dry-run and backtesting. Absolute `iloc` indexing is safe to use in callbacks however - see [Strategy Callbacks](strategy-callbacks.md). - don't use functions that use all dataframe or column values, e.g. `dataframe['mean_volume'] = dataframe['volume'].mean()`. As backtesting uses the full dataframe, at any point in the dataframe, the `'mean_volume'` series would include data from the future. Use rolling() calculations instead, e.g. `dataframe['volume'].rolling().mean()`. - don't use `.resample('1h')`. This uses the left border of the period interval, so moves data from an hour boundary to the start of the hour. Use `.resample('1h', label='right')` instead. +- don't use `.merge()` to combine longer timeframes onto shorter ones. Instead, use the [informative pair](#informative-pairs) helpers. (A plain merge can implicitly cause a lookahead bias as date refers to open date, not close date). !!! Tip "Identifying problems" You should always use the two helper commands [lookahead-analysis](lookahead-analysis.md) and [recursive-analysis](recursive-analysis.md), which can each help you figure out problems with your strategy in different ways. diff --git a/docs/telegram-usage.md b/docs/telegram-usage.md index 946686b1c..a7a27f150 100644 --- a/docs/telegram-usage.md +++ b/docs/telegram-usage.md @@ -81,6 +81,19 @@ Without this, the bot will always respond to the general channel in the group if Similar to the group-id - you can use `/tg_info` from the topic/thread to get the correct topic-id. +#### Authorized users + +For groups, it can be useful to limit who can send commands to the bot. + +If `"authorized_users": []` is present and empty, no user will be allowed to control the bot. +In the below example, only the user with the id "1234567" is allowed to control the bot - all other users will only be able to receive messages. + +```json + "chat_id": "-1001332619709", + "topic_id": "3", + "authorized_users": ["1234567"] +``` + ## Control telegram noise Freqtrade provides means to control the verbosity of your telegram bot. @@ -175,7 +188,7 @@ You can create your own keyboard in `config.json`: !!! Note "Supported Commands" Only the following commands are allowed. Command arguments are not supported! - `/start`, `/stop`, `/status`, `/status table`, `/trades`, `/profit`, `/performance`, `/daily`, `/stats`, `/count`, `/locks`, `/balance`, `/stopentry`, `/reload_config`, `/show_config`, `/logs`, `/whitelist`, `/blacklist`, `/edge`, `/help`, `/version`, `/marketdir` + `/start`, `/pause`, `/stop`, `/status`, `/status table`, `/trades`, `/profit`, `/performance`, `/daily`, `/stats`, `/count`, `/locks`, `/balance`, `/stopentry`, `/reload_config`, `/show_config`, `/logs`, `/whitelist`, `/blacklist`, `/edge`, `/help`, `/version`, `/marketdir` ## Telegram commands @@ -187,8 +200,8 @@ official commands. You can ask at any moment for help with `/help`. |----------|-------------| | **System commands** | `/start` | Starts the trader +| `/pause | /stopentry | /stopbuy` | Pause the trader. Gracefully handle open trades according to their rules. Do not enter new positions. | `/stop` | Stops the trader -| `/stopbuy | /stopentry` | Stops the trader from opening new trades. Gracefully closes open trades according to their rules. | `/reload_config` | Reloads the configuration file | `/show_config` | Shows part of the current configuration with relevant settings to operation | `/logs [limit]` | Show last log messages. @@ -237,25 +250,27 @@ Below, example of Telegram message you will receive for each command. > **Status:** `running` +### /pause | /stopentry | /stopbuy + +> **Status:** `paused, no more entries will occur from now. Run /start to enable entries.` + +Prevents the bot from opening new trades by changing the state to `paused`. +Open trades will continue to be managed according to their regular rules (ROI/exit signals, stop-loss, etc.). +Note that position adjustment remains active, but only on the exit side — meaning that when the bot is `paused`, it can only reduce the position size of open trades. + +After this, give the bot time to close off open trades (can be checked via `/status table`). +Once all positions are closed, run `/stop` to completely stop the bot. + +Use `/start` to resume the bot to the `running` state, allowing it to open new positions. + +!!! Warning + The pause/stopentry signal is ONLY active while the bot is running, and is not persisted anyway, so restarting the bot will cause this to reset. + ### /stop > `Stopping trader ...` > **Status:** `stopped` -### /stopbuy - -> **status:** `Setting max_open_trades to 0. Run /reload_config to reset.` - -Prevents the bot from opening new trades by temporarily setting "max_open_trades" to 0. Open trades will be handled via their regular rules (ROI / Sell-signal, stoploss, ...). - -After this, give the bot time to close off open trades (can be checked via `/status table`). -Once all positions are sold, run `/stop` to completely stop the bot. - -`/reload_config` resets "max_open_trades" to the value set in the configuration and resets this command. - -!!! Warning - The stop-buy signal is ONLY active while the bot is running, and is not persisted anyway, so restarting the bot will cause this to reset. - ### /status For each open trade, the bot will send you the following message. diff --git a/docs/trade-object.md b/docs/trade-object.md index 8a6e3b1a7..78b130fcc 100644 --- a/docs/trade-object.md +++ b/docs/trade-object.md @@ -25,6 +25,7 @@ The following attributes / properties are available for each individual trade - | `close_date_utc` | datetime | Timestamp when trade was closed - in UTC. | | `close_profit` | float | Relative profit at the time of trade closure. `0.01` == 1% | | `close_profit_abs` | float | Absolute profit (in stake currency) at the time of trade closure. | +| `realized_profit` | float | Absolute already realized profit (in stake currency) while the trade is still open. | | `leverage` | float | Leverage used for this trade - defaults to 1.0 in spot markets. | | `enter_tag` | string | Tag provided on entry via the `enter_tag` column in the dataframe. | | `is_short` | boolean | True for short trades, False otherwise. | @@ -35,6 +36,7 @@ The following attributes / properties are available for each individual trade - | `trade_direction` | "long" / "short" | Trade direction in text - long or short. | | `nr_of_successful_entries` | int | Number of successful (filled) entry orders. | | `nr_of_successful_exits` | int | Number of successful (filled) exit orders. | +| `has_open_orders` | boolean | Has the trade open orders (excluding stoploss orders). | ## Class methods diff --git a/freqtrade/__init__.py b/freqtrade/__init__.py index e93de1dbc..97e8aa355 100644 --- a/freqtrade/__init__.py +++ b/freqtrade/__init__.py @@ -1,12 +1,12 @@ """Freqtrade bot""" -__version__ = "2025.2-dev" +__version__ = "2025.5-dev" if "dev" in __version__: from pathlib import Path try: - import subprocess # noqa: S404 + import subprocess # noqa: S404, RUF100 freqtrade_basedir = Path(__file__).parent diff --git a/freqtrade/commands/arguments.py b/freqtrade/commands/arguments.py index d0bad4567..c42e46711 100755 --- a/freqtrade/commands/arguments.py +++ b/freqtrade/commands/arguments.py @@ -21,6 +21,8 @@ ARGS_COMMON = [ "user_data_dir", ] +ARGS_MAIN = ["version_main"] + ARGS_STRATEGY = [ "strategy", "strategy_path", @@ -43,7 +45,8 @@ ARGS_COMMON_OPTIMIZE = [ "pairs", ] -ARGS_BACKTEST = ARGS_COMMON_OPTIMIZE + [ +ARGS_BACKTEST = [ + *ARGS_COMMON_OPTIMIZE, "position_stacking", "enable_protections", "dry_run_wallet", @@ -56,7 +59,8 @@ ARGS_BACKTEST = ARGS_COMMON_OPTIMIZE + [ "freqai_backtest_live_models", ] -ARGS_HYPEROPT = ARGS_COMMON_OPTIMIZE + [ +ARGS_HYPEROPT = [ + *ARGS_COMMON_OPTIMIZE, "hyperopt", "hyperopt_path", "position_stacking", @@ -76,7 +80,7 @@ ARGS_HYPEROPT = ARGS_COMMON_OPTIMIZE + [ "analyze_per_epoch", ] -ARGS_EDGE = ARGS_COMMON_OPTIMIZE + ["stoploss_range"] +ARGS_EDGE = [*ARGS_COMMON_OPTIMIZE, "stoploss_range"] ARGS_LIST_STRATEGIES = [ "strategy_path", @@ -125,7 +129,7 @@ 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"] -ARGS_CONVERT_DATA_OHLCV = ARGS_CONVERT_DATA + ["timeframes", "trading_mode", "candle_types"] +ARGS_CONVERT_DATA_OHLCV = [*ARGS_CONVERT_DATA, "timeframes", "trading_mode", "candle_types"] ARGS_CONVERT_TRADES = [ "pairs", @@ -191,7 +195,7 @@ ARGS_PLOT_PROFIT = [ ARGS_CONVERT_DB = ["db_url", "db_url_from"] -ARGS_INSTALL_UI = ["erase_ui_only", "ui_version"] +ARGS_INSTALL_UI = ["erase_ui_only", "ui_prerelease", "ui_version"] ARGS_SHOW_TRADES = ["db_url", "trade_ids", "print_json"] @@ -347,7 +351,7 @@ class Arguments: self.parser = ArgumentParser( prog="freqtrade", description="Free, open source crypto trading bot" ) - self._build_args(optionlist=["version_main"], parser=self.parser) + self._build_args(optionlist=ARGS_MAIN, parser=self.parser) from freqtrade.commands import ( start_analysis_entries_exits, diff --git a/freqtrade/commands/cli_options.py b/freqtrade/commands/cli_options.py index 16f5d1c4d..f05907808 100755 --- a/freqtrade/commands/cli_options.py +++ b/freqtrade/commands/cli_options.py @@ -83,7 +83,8 @@ AVAILABLE_CLI_OPTIONS = { "-d", "--datadir", "--data-dir", - help="Path to directory with historical backtesting data.", + help="Path to the base directory of the exchange with historical backtesting data. " + "To see futures data, use trading-mode additionally.", metavar="PATH", ), "user_data_dir": Arg( @@ -224,7 +225,7 @@ AVAILABLE_CLI_OPTIONS = { ), "backtest_breakdown": Arg( "--breakdown", - help="Show backtesting breakdown per [day, week, month].", + help="Show backtesting breakdown per [day, week, month, year].", nargs="+", choices=constants.BACKTEST_BREAKDOWNS, ), @@ -463,7 +464,7 @@ AVAILABLE_CLI_OPTIONS = { "format_from_trades": Arg( "--format-from", help="Source format for data conversion.", - choices=constants.AVAILABLE_DATAHANDLERS + ["kraken_csv"], + choices=[*constants.AVAILABLE_DATAHANDLERS, "kraken_csv"], required=True, ), "format_from": Arg( @@ -527,6 +528,15 @@ AVAILABLE_CLI_OPTIONS = { ), type=str, ), + "ui_prerelease": Arg( + "--prerelease", + help=( + "Install the latest pre-release version of FreqUI. " + "This is not recommended for production use." + ), + action="store_true", + default=False, + ), # Templating options "template": Arg( "--template", diff --git a/freqtrade/commands/deploy_commands.py b/freqtrade/commands/deploy_commands.py index acd975b9b..c2a715971 100644 --- a/freqtrade/commands/deploy_commands.py +++ b/freqtrade/commands/deploy_commands.py @@ -23,8 +23,8 @@ def start_create_userdir(args: dict[str, Any]) -> None: """ from freqtrade.configuration.directory_operations import copy_sample_files, create_userdata_dir - if "user_data_dir" in args and args["user_data_dir"]: - userdir = create_userdata_dir(args["user_data_dir"], create_dir=True) + if user_data_dir := args.get("user_data_dir"): + userdir = create_userdata_dir(user_data_dir, create_dir=True) copy_sample_files(userdir, overwrite=args["reset"]) else: logger.warning("`create-userdir` requires --userdir to be set.") @@ -85,22 +85,22 @@ 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"]: - if "strategy_path" in args and args["strategy_path"]: - strategy_dir = Path(args["strategy_path"]) + if strategy := args.get("strategy"): + if strategy_path := args.get("strategy_path"): + strategy_dir = Path(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") + new_path = strategy_dir / (strategy + ".py") if new_path.exists(): raise OperationalException( f"`{new_path}` already exists. Please choose another Strategy Name." ) - deploy_new_strategy(args["strategy"], new_path, args["template"]) + deploy_new_strategy(strategy, new_path, args["template"]) else: raise ConfigurationError("`new-strategy` requires --strategy to be set.") @@ -116,7 +116,9 @@ def start_install_ui(args: dict[str, Any]) -> None: dest_folder = Path(__file__).parents[1] / "rpc/api_server/ui/installed/" # First make sure the assets are removed. - dl_url, latest_version = get_ui_download_url(args.get("ui_version")) + dl_url, latest_version = get_ui_download_url( + args.get("ui_version"), args.get("ui_prerelease", False) + ) curr_version = read_ui_version(dest_folder) if curr_version == latest_version and not args.get("erase_ui_only"): diff --git a/freqtrade/commands/deploy_ui.py b/freqtrade/commands/deploy_ui.py index a02315bfc..be96d6d11 100644 --- a/freqtrade/commands/deploy_ui.py +++ b/freqtrade/commands/deploy_ui.py @@ -51,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: str | None = None) -> tuple[str, str]: +def get_ui_download_url(version: str | None, prerelease: bool) -> tuple[str, str]: base_url = "https://api.github.com/repos/freqtrade/frequi/" # Get base UI Repo path @@ -61,14 +61,18 @@ def get_ui_download_url(version: str | None = None) -> tuple[str, str]: if version: tmp = [x for x in r if x["name"] == version] - if tmp: - latest_version = tmp[0]["name"] - assets = tmp[0].get("assets", []) - else: - raise ValueError("UI-Version not found.") else: - latest_version = r[0]["name"] - assets = r[0].get("assets", []) + tmp = [x for x in r if prerelease or not x.get("prerelease")] + + if tmp: + # Ensure we have the latest version + if version is None: + tmp.sort(key=lambda x: x["created_at"], reverse=True) + latest_version = tmp[0]["name"] + assets = tmp[0].get("assets", []) + else: + raise ValueError("UI-Version not found.") + dl_url = "" if assets and len(assets) > 0: dl_url = assets[0]["browser_download_url"] diff --git a/freqtrade/commands/list_commands.py b/freqtrade/commands/list_commands.py index c8d476717..6a1ca819d 100644 --- a/freqtrade/commands/list_commands.py +++ b/freqtrade/commands/list_commands.py @@ -5,7 +5,6 @@ from typing import Any from freqtrade.enums import RunMode from freqtrade.exceptions import ConfigurationError, OperationalException -from freqtrade.ft_types import ValidExchangesType logger = logging.getLogger(__name__) @@ -17,11 +16,12 @@ def start_list_exchanges(args: dict[str, Any]) -> None: :param args: Cli args from Arguments() :return: None """ - from rich.console import Console from rich.table import Table from rich.text import Text from freqtrade.exchange import list_available_exchanges + from freqtrade.ft_types import ValidExchangesType + from freqtrade.loggers.rich_console import get_rich_console available_exchanges: list[ValidExchangesType] = list_available_exchanges( args["list_exchanges_all"] @@ -77,15 +77,16 @@ def start_list_exchanges(args: dict[str, Any]) -> None: ) # table.add_row(*[exchange[header] for header in headers]) - console = Console() + console = get_rich_console() console.print(table) def _print_objs_tabular(objs: list, print_colorized: bool) -> None: - from rich.console import Console from rich.table import Table from rich.text import Text + from freqtrade.loggers.rich_console import get_rich_console + names = [s["name"] for s in objs] objs_to_print: list[dict[str, Text | str]] = [ { @@ -118,10 +119,7 @@ def _print_objs_tabular(objs: list, print_colorized: bool) -> None: for row in objs_to_print: table.add_row(*[row[header] for header in objs_to_print[0].keys()]) - console = Console( - color_system="auto" if print_colorized else None, - width=200 if "pytest" in sys.modules else None, - ) + console = get_rich_console(color_system="auto" if print_colorized else None) console.print(table) @@ -219,7 +217,7 @@ def start_list_markets(args: dict[str, Any], pairs_only: bool = False) -> None: """ from freqtrade.configuration import setup_utils_configuration from freqtrade.exchange import market_is_active - from freqtrade.misc import plural + from freqtrade.misc import plural, safe_value_fallback from freqtrade.resolvers import ExchangeResolver from freqtrade.util import print_rich_table @@ -246,88 +244,99 @@ def start_list_markets(args: dict[str, Any], pairs_only: bool = False) -> None: except Exception as e: raise OperationalException(f"Cannot get markets. Reason: {e}") from e - else: - summary_str = ( - (f"Exchange {exchange.name} has {len(pairs)} ") - + ("active " if active_only else "") - + (plural(len(pairs), "pair" if pairs_only else "market")) - + ( - f" with {', '.join(base_currencies)} as base " - f"{plural(len(base_currencies), 'currency', 'currencies')}" - if base_currencies - else "" - ) - + (" and" if base_currencies and quote_currencies else "") - + ( - f" with {', '.join(quote_currencies)} as quote " - f"{plural(len(quote_currencies), 'currency', 'currencies')}" - if quote_currencies - else "" - ) + tickers = exchange.get_tickers() + + summary_str = ( + (f"Exchange {exchange.name} has {len(pairs)} ") + + ("active " if active_only else "") + + (plural(len(pairs), "pair" if pairs_only else "market")) + + ( + f" with {', '.join(base_currencies)} as base " + f"{plural(len(base_currencies), 'currency', 'currencies')}" + if base_currencies + else "" ) + + (" and" if base_currencies and quote_currencies else "") + + ( + f" with {', '.join(quote_currencies)} as quote " + f"{plural(len(quote_currencies), 'currency', 'currencies')}" + if quote_currencies + else "" + ) + ) - headers = [ - "Id", - "Symbol", - "Base", - "Quote", - "Active", - "Spot", - "Margin", - "Future", - "Leverage", - ] + headers = [ + "Id", + "Symbol", + "Base", + "Quote", + "Active", + "Spot", + "Margin", + "Future", + "Leverage", + "Min Stake", + ] - tabular_data = [ - { - "Id": v["id"], - "Symbol": v["symbol"], - "Base": v["base"], - "Quote": v["quote"], - "Active": market_is_active(v), - "Spot": "Spot" if exchange.market_is_spot(v) else "", - "Margin": "Margin" if exchange.market_is_margin(v) else "", - "Future": "Future" if exchange.market_is_future(v) else "", - "Leverage": exchange.get_max_leverage(v["symbol"], 20), - } - for _, v in pairs.items() - ] + tabular_data = [ + { + "Id": v["id"], + "Symbol": v["symbol"], + "Base": v["base"], + "Quote": v["quote"], + "Active": market_is_active(v), + "Spot": "Spot" if exchange.market_is_spot(v) else "", + "Margin": "Margin" if exchange.market_is_margin(v) else "", + "Future": "Future" if exchange.market_is_future(v) else "", + "Leverage": exchange.get_max_leverage(v["symbol"], 20), + "Min Stake": round( + exchange.get_min_pair_stake_amount( + v["symbol"], + safe_value_fallback(tickers.get(v["symbol"], {}), "last", "ask", 0.0), + 0.0, + ) + or 0.0, + 8, + ), + } + for _, v in pairs.items() + ] - if ( - args.get("print_one_column", False) - or args.get("list_pairs_print_json", False) - or args.get("print_csv", False) - ): - # Print summary string in the log in case of machine-readable - # regular formats. - logger.info(f"{summary_str}.") + if ( + args.get("print_one_column", False) + or args.get("list_pairs_print_json", False) + or args.get("print_csv", False) + ): + # Print summary string in the log in case of machine-readable + # regular formats. + logger.info(f"{summary_str}.") + else: + # Print empty string separating leading logs and output in case of + # human-readable formats. + print() + + if pairs: + if args.get("print_list", False): + # print data as a list, with human-readable summary + print(f"{summary_str}: {', '.join(pairs.keys())}.") + elif args.get("print_one_column", False): + print("\n".join(pairs.keys())) + elif args.get("list_pairs_print_json", False): + import rapidjson + + print(rapidjson.dumps(list(pairs.keys()), default=str)) + elif args.get("print_csv", False): + writer = csv.DictWriter(sys.stdout, fieldnames=headers) + writer.writeheader() + writer.writerows(tabular_data) else: - # Print empty string separating leading logs and output in case of - # human-readable formats. - print() - - if pairs: - if args.get("print_list", False): - # print data as a list, with human-readable summary - print(f"{summary_str}: {', '.join(pairs.keys())}.") - elif args.get("print_one_column", False): - print("\n".join(pairs.keys())) - elif args.get("list_pairs_print_json", False): - import rapidjson - - print(rapidjson.dumps(list(pairs.keys()), default=str)) - elif args.get("print_csv", False): - writer = csv.DictWriter(sys.stdout, fieldnames=headers) - writer.writeheader() - writer.writerows(tabular_data) - else: - print_rich_table(tabular_data, headers, summary_str) - elif not ( - args.get("print_one_column", False) - or args.get("list_pairs_print_json", False) - or args.get("print_csv", False) - ): - print(f"{summary_str}.") + print_rich_table(tabular_data, headers, summary_str) + elif not ( + args.get("print_one_column", False) + or args.get("list_pairs_print_json", False) + or args.get("print_csv", False) + ): + print(f"{summary_str}.") def start_show_trades(args: dict[str, Any]) -> None: diff --git a/freqtrade/config_schema/__init__.py b/freqtrade/config_schema/__init__.py new file mode 100644 index 000000000..0a5c19c1f --- /dev/null +++ b/freqtrade/config_schema/__init__.py @@ -0,0 +1,4 @@ +from freqtrade.config_schema.config_schema import CONF_SCHEMA + + +__all__ = ["CONF_SCHEMA"] diff --git a/freqtrade/configuration/config_schema.py b/freqtrade/config_schema/config_schema.py similarity index 92% rename from freqtrade/configuration/config_schema.py rename to freqtrade/config_schema/config_schema.py index 91e5c2d1b..8b88e655a 100644 --- a/freqtrade/configuration/config_schema.py +++ b/freqtrade/config_schema/config_schema.py @@ -425,6 +425,10 @@ CONF_SCHEMA = { "description": "Edge configuration.", "$ref": "#/definitions/edge", }, + "log_config": { + "description": "Logging configuration.", + "$ref": "#/definitions/logging", + }, "freqai": { "description": "FreqAI configuration.", "$ref": "#/definitions/freqai", @@ -471,6 +475,12 @@ CONF_SCHEMA = { "description": "Telegram topic ID - only applicable for group chats", "type": "string", }, + "authorized_users": { + "description": "Authorized users for the bot.", + "type": "array", + "items": {"type": "string"}, + "uniqueItems": True, + }, "allow_custom_messages": { "description": "Allow sending custom messages from the Strategy.", "type": "boolean", @@ -679,7 +689,7 @@ CONF_SCHEMA = { "initial_state": { "description": "Initial state of the system.", "type": "string", - "enum": ["running", "stopped"], + "enum": ["running", "paused", "stopped"], }, "force_entry_enable": { "description": "Force enable entry.", @@ -877,6 +887,28 @@ CONF_SCHEMA = { }, "required": ["process_throttle_secs", "allowed_risk"], }, + "logging": { + "type": "object", + "properties": { + "version": {"type": "number", "const": 1}, + "formatters": { + "type": "object", + # In theory the below, but can be more flexible + # based on logging.config documentation + # "additionalProperties": { + # "type": "object", + # "properties": { + # "format": {"type": "string"}, + # "datefmt": {"type": "string"}, + # }, + # "required": ["format"], + # }, + }, + "handlers": {"type": "object"}, + "root": {"type": "object"}, + }, + "required": ["version", "formatters", "handlers", "root"], + }, "external_message_consumer": { "description": "Configuration for external message consumer.", "type": "object", @@ -965,10 +997,13 @@ CONF_SCHEMA = { "type": "boolean", "default": False, }, - "keras": { - "description": "Use Keras for model training.", - "type": "boolean", - "default": False, + "identifier": { + "description": ( + "A unique ID for the current model. " + "Must be changed when modifying features." + ), + "type": "string", + "default": "example", }, "write_metrics_to_disk": { "description": "Write metrics to disk?", @@ -1000,13 +1035,42 @@ CONF_SCHEMA = { "type": "number", "default": 7, }, - "identifier": { + "live_retrain_hours": { + "description": "Frequency of retraining during dry/live runs.", + "type": "number", + "default": 0, + }, + "expiration_hours": { "description": ( - "A unique ID for the current model. " - "Must be changed when modifying features." + "Avoid making predictions if a model is more than `expiration_hours` " + "old. Defaults to 0 (no expiration)." ), - "type": "string", - "default": "example", + "type": "number", + "default": 0, + }, + "save_backtest_models": { + "description": "Save models to disk when running backtesting.", + "type": "boolean", + "default": False, + }, + "fit_live_predictions_candles": { + "description": ( + "Number of historical candles to use for computing target (label) " + "statistics from prediction data, instead of from the training dataset." + ), + "type": "integer", + }, + "data_kitchen_thread_count": { + "description": ( + "Designate the number of threads you want to use for data processing " + "(outlier methods, normalization, etc.)." + ), + "type": "integer", + }, + "activate_tensorboard": { + "description": "Indicate whether or not to activate tensorboard", + "type": "boolean", + "default": True, }, "wait_for_training_iteration_on_reload": { "description": ( @@ -1015,6 +1079,20 @@ CONF_SCHEMA = { "type": "boolean", "default": True, }, + "continual_learning": { + "description": ( + "Use the final state of the most recently trained model " + "as starting point for the new model, allowing for " + "incremental learning." + ), + "type": "boolean", + "default": False, + }, + "keras": { + "description": "Use Keras for model training.", + "type": "boolean", + "default": False, + }, "feature_parameters": { "description": "The parameters used to engineer the feature set", "type": "object", @@ -1068,6 +1146,14 @@ CONF_SCHEMA = { "type": "boolean", "default": False, }, + "indicator_periods_candles": { + "description": ( + "Time periods to calculate indicators for. " + "The indicators are added to the base indicator dataset." + ), + "type": "array", + "items": {"type": "number", "minimum": 1}, + }, "use_SVM_to_remove_outliers": { "description": "Use SVM to remove outliers from the features.", "type": "boolean", @@ -1260,7 +1346,8 @@ SCHEMA_BACKTEST_REQUIRED = [ "dataformat_ohlcv", "dataformat_trades", ] -SCHEMA_BACKTEST_REQUIRED_FINAL = SCHEMA_BACKTEST_REQUIRED + [ +SCHEMA_BACKTEST_REQUIRED_FINAL = [ + *SCHEMA_BACKTEST_REQUIRED, "stoploss", "minimal_roi", "max_open_trades", @@ -1272,6 +1359,4 @@ SCHEMA_MINIMAL_REQUIRED = [ "dataformat_ohlcv", "dataformat_trades", ] -SCHEMA_MINIMAL_WEBSERVER = SCHEMA_MINIMAL_REQUIRED + [ - "api_server", -] +SCHEMA_MINIMAL_WEBSERVER = [*SCHEMA_MINIMAL_REQUIRED, "api_server"] diff --git a/freqtrade/configuration/config_validation.py b/freqtrade/configuration/config_validation.py index 8640542a1..07a109bd7 100644 --- a/freqtrade/configuration/config_validation.py +++ b/freqtrade/configuration/config_validation.py @@ -6,7 +6,7 @@ from typing import Any from jsonschema import Draft4Validator, validators from jsonschema.exceptions import ValidationError, best_match -from freqtrade.configuration.config_schema import ( +from freqtrade.config_schema.config_schema import ( CONF_SCHEMA, SCHEMA_BACKTEST_REQUIRED, SCHEMA_BACKTEST_REQUIRED_FINAL, @@ -361,7 +361,7 @@ def _validate_freqai_include_timeframes(conf: dict[str, Any], preliminary: bool) # Ensure that the base timeframe is included in the include_timeframes list if not preliminary and main_tf not in freqai_include_timeframes: feature_parameters = conf.get("freqai", {}).get("feature_parameters", {}) - include_timeframes = [main_tf] + freqai_include_timeframes + include_timeframes = [main_tf, *freqai_include_timeframes] conf.get("freqai", {}).get("feature_parameters", {}).update( {**feature_parameters, "include_timeframes": include_timeframes} ) diff --git a/freqtrade/configuration/configuration.py b/freqtrade/configuration/configuration.py index 3fc30c375..11aff879f 100644 --- a/freqtrade/configuration/configuration.py +++ b/freqtrade/configuration/configuration.py @@ -135,7 +135,7 @@ class Configuration: {"verbosity": safe_value_fallback(self.args, "verbosity", default_value=0)} ) - if "logfile" in self.args and self.args["logfile"]: + if self.args.get("logfile"): config.update({"logfile": self.args["logfile"]}) if "print_colorized" in self.args and not self.args["print_colorized"]: @@ -187,7 +187,7 @@ class Configuration: logger.warning("`force_entry_enable` RPC message enabled.") # Support for sd_notify - if "sd_notify" in self.args and self.args["sd_notify"]: + if self.args.get("sd_notify"): config["internals"].update({"sd_notify": True}) def _process_datadir_options(self, config: Config) -> None: @@ -196,14 +196,14 @@ class Configuration: --user-data, --datadir """ # Check exchange parameter here - otherwise `datadir` might be wrong. - if "exchange" in self.args and self.args["exchange"]: + if self.args.get("exchange"): config["exchange"]["name"] = self.args["exchange"] logger.info(f"Using exchange {config['exchange']['name']}") if "pair_whitelist" not in config["exchange"]: config["exchange"]["pair_whitelist"] = [] - if "user_data_dir" in self.args and self.args["user_data_dir"]: + if self.args.get("user_data_dir"): config.update({"user_data_dir": self.args["user_data_dir"]}) elif "user_data_dir" not in config: # Default to cwd/user_data (legacy option ...) @@ -251,7 +251,7 @@ class Configuration: logstring="Parameter --enable-protections detected, enabling Protections. ...", ) - if "max_open_trades" in self.args and self.args["max_open_trades"]: + if self.args.get("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 ...", @@ -314,7 +314,7 @@ class Configuration: self._args_to_config_loop(config, configurations) # Edge section: - if "stoploss_range" in self.args and self.args["stoploss_range"]: + if self.args.get("stoploss_range"): txt_range = ast.literal_eval(self.args["stoploss_range"]) config["edge"].update({"stoploss_range_min": txt_range[0]}) config["edge"].update({"stoploss_range_max": txt_range[1]}) @@ -493,7 +493,7 @@ class Configuration: config["exchange"]["pair_whitelist"] = config["pairs"] return - if "pairs_file" in self.args and self.args["pairs_file"]: + if self.args.get("pairs_file"): pairs_file = Path(self.args["pairs_file"]) logger.info(f'Reading pairs file "{pairs_file}".') # Download pairs from the pairs file if no config is specified @@ -505,7 +505,7 @@ class Configuration: config["pairs"].sort() return - if "config" in self.args and self.args["config"]: + if self.args.get("config"): logger.info("Using pairlist from configuration.") config["pairs"] = config.get("exchange", {}).get("pair_whitelist") else: diff --git a/freqtrade/configuration/directory_operations.py b/freqtrade/configuration/directory_operations.py index 4cbd444a3..1fa5c7947 100644 --- a/freqtrade/configuration/directory_operations.py +++ b/freqtrade/configuration/directory_operations.py @@ -37,7 +37,7 @@ def chown_user_directory(directory: Path) -> None: """ if running_in_docker(): try: - import subprocess # noqa: S404 + import subprocess # noqa: S404, RUF100 subprocess.check_output(["sudo", "chown", "-R", "ftuser:", str(directory.resolve())]) except Exception: diff --git a/freqtrade/constants.py b/freqtrade/constants.py index 2d3b4a5e8..807b0888b 100644 --- a/freqtrade/constants.py +++ b/freqtrade/constants.py @@ -37,6 +37,7 @@ HYPEROPT_LOSS_BUILTIN = [ "CalmarHyperOptLoss", "MaxDrawDownHyperOptLoss", "MaxDrawDownRelativeHyperOptLoss", + "MaxDrawDownPerPairHyperOptLoss", "ProfitDrawDownHyperOptLoss", "MultiMetricHyperOptLoss", ] @@ -59,7 +60,7 @@ AVAILABLE_PAIRLISTS = [ "VolatilityFilter", ] AVAILABLE_DATAHANDLERS = ["json", "jsongz", "feather", "parquet"] -BACKTEST_BREAKDOWNS = ["day", "week", "month"] +BACKTEST_BREAKDOWNS = ["day", "week", "month", "year"] BACKTEST_CACHE_AGE = ["none", "day", "week", "month"] BACKTEST_CACHE_DEFAULT = "day" DRY_RUN_WALLET = 1000 @@ -70,6 +71,19 @@ DEFAULT_DATAFRAME_COLUMNS = ["date", "open", "high", "low", "close", "volume"] # it has wide consequences for stored trades files DEFAULT_TRADES_COLUMNS = ["timestamp", "id", "type", "side", "price", "amount", "cost"] DEFAULT_ORDERFLOW_COLUMNS = ["level", "bid", "ask", "delta"] +ORDERFLOW_ADDED_COLUMNS = [ + "trades", + "orderflow", + "imbalances", + "stacked_imbalances_bid", + "stacked_imbalances_ask", + "max_delta", + "min_delta", + "bid", + "ask", + "delta", + "total_trades", +] TRADES_DTYPES = { "timestamp": "int64", "id": "str", @@ -99,7 +113,7 @@ DL_DATA_TIMEFRAMES = ["1m", "5m"] ENV_VAR_PREFIX = "FREQTRADE__" CANCELED_EXCHANGE_STATES = ("cancelled", "canceled", "expired", "rejected") -NON_OPEN_EXCHANGE_STATES = CANCELED_EXCHANGE_STATES + ("closed",) +NON_OPEN_EXCHANGE_STATES = (*CANCELED_EXCHANGE_STATES, "closed") # Define decimals per coin for outputs # Only used for outputs. diff --git a/freqtrade/data/btanalysis/__init__.py b/freqtrade/data/btanalysis/__init__.py new file mode 100644 index 000000000..48fdcd9b5 --- /dev/null +++ b/freqtrade/data/btanalysis/__init__.py @@ -0,0 +1,31 @@ +# flake8: noqa: F401 +from .bt_fileutils import ( + BT_DATA_COLUMNS, + delete_backtest_result, + extract_trades_of_period, + find_existing_backtest_stats, + get_backtest_market_change, + get_backtest_result, + get_backtest_resultlist, + get_latest_backtest_filename, + get_latest_hyperopt_file, + get_latest_hyperopt_filename, + get_latest_optimize_filename, + load_and_merge_backtest_result, + load_backtest_analysis_data, + load_backtest_data, + load_backtest_metadata, + load_backtest_stats, + load_exit_signal_candles, + load_file_from_zip, + load_rejected_signals, + load_signal_candles, + load_trades, + load_trades_from_db, + trade_list_to_dataframe, + update_backtest_metadata, +) +from .trade_parallelism import ( + analyze_trade_parallelism, + evaluate_result_multi, +) diff --git a/freqtrade/data/btanalysis.py b/freqtrade/data/btanalysis/bt_fileutils.py similarity index 90% rename from freqtrade/data/btanalysis.py rename to freqtrade/data/btanalysis/bt_fileutils.py index 7b0109fa9..3835e831a 100644 --- a/freqtrade/data/btanalysis.py +++ b/freqtrade/data/btanalysis/bt_fileutils.py @@ -13,7 +13,7 @@ from typing import Any, Literal import numpy as np import pandas as pd -from freqtrade.constants import LAST_BT_RESULT_FN, IntOrInf +from freqtrade.constants import LAST_BT_RESULT_FN from freqtrade.exceptions import ConfigurationError, OperationalException from freqtrade.ft_types import BacktestHistoryEntryType, BacktestResultType from freqtrade.misc import file_dump_json, json_load @@ -376,7 +376,7 @@ def load_backtest_data(filename: Path | str, strategy: str | None = None) -> pd. if not strategy: if len(data["strategy"]) == 1: - strategy = list(data["strategy"].keys())[0] + strategy = next(iter(data["strategy"].keys())) else: raise ValueError( "Detected backtest result with more than one strategy. " @@ -491,55 +491,6 @@ def load_exit_signal_candles(backtest_dir: Path) -> dict[str, dict[str, pd.DataF return load_backtest_analysis_data(backtest_dir, "exited") -def analyze_trade_parallelism(results: pd.DataFrame, timeframe: str) -> pd.DataFrame: - """ - Find overlapping trades by expanding each trade once per period it was open - and then counting overlaps. - :param results: Results Dataframe - can be loaded - :param timeframe: Timeframe used for backtest - :return: dataframe with open-counts per time-period in timeframe - """ - from freqtrade.exchange import timeframe_to_resample_freq - - timeframe_freq = timeframe_to_resample_freq(timeframe) - dates = [ - pd.Series( - pd.date_range( - row[1]["open_date"], - row[1]["close_date"], - freq=timeframe_freq, - # Exclude right boundary - the date is the candle open date. - inclusive="left", - ) - ) - for row in results[["open_date", "close_date"]].iterrows() - ] - deltas = [len(x) for x in dates] - dates = pd.Series(pd.concat(dates).values, name="date") - df2 = pd.DataFrame(np.repeat(results.values, deltas, axis=0), columns=results.columns) - - df2 = pd.concat([dates, df2], axis=1) - df2 = df2.set_index("date") - df_final = df2.resample(timeframe_freq)[["pair"]].count() - df_final = df_final.rename({"pair": "open_trades"}, axis=1) - return df_final - - -def evaluate_result_multi( - results: pd.DataFrame, timeframe: str, max_open_trades: IntOrInf -) -> pd.DataFrame: - """ - Find overlapping trades by expanding each trade once per period it was open - and then counting overlaps - :param results: Results Dataframe - can be loaded - :param timeframe: Frequency used for the backtest - :param max_open_trades: parameter max_open_trades used during backtest run - :return: dataframe with open-counts per time-period in freq - """ - df_final = analyze_trade_parallelism(results, timeframe) - return df_final[df_final["open_trades"] > max_open_trades] - - def trade_list_to_dataframe(trades: list[Trade] | list[LocalTrade]) -> pd.DataFrame: """ Convert list of Trade objects to pandas Dataframe diff --git a/freqtrade/data/btanalysis/trade_parallelism.py b/freqtrade/data/btanalysis/trade_parallelism.py new file mode 100644 index 000000000..eabdcf08a --- /dev/null +++ b/freqtrade/data/btanalysis/trade_parallelism.py @@ -0,0 +1,60 @@ +import logging + +import numpy as np +import pandas as pd + +from freqtrade.constants import IntOrInf + + +logger = logging.getLogger(__name__) + + +def analyze_trade_parallelism(trades: pd.DataFrame, timeframe: str) -> pd.DataFrame: + """ + Find overlapping trades by expanding each trade once per period it was open + and then counting overlaps. + :param trades: Trades Dataframe - can be loaded from backtest, or created + via trade_list_to_dataframe + :param timeframe: Timeframe used for backtest + :return: dataframe with open-counts per time-period in timeframe + """ + from freqtrade.exchange import timeframe_to_resample_freq + + timeframe_freq = timeframe_to_resample_freq(timeframe) + dates = [ + pd.Series( + pd.date_range( + row[1]["open_date"], + row[1]["close_date"], + freq=timeframe_freq, + # Exclude right boundary - the date is the candle open date. + inclusive="left", + ) + ) + for row in trades[["open_date", "close_date"]].iterrows() + ] + deltas = [len(x) for x in dates] + dates = pd.Series(pd.concat(dates).values, name="date") + df2 = pd.DataFrame(np.repeat(trades.values, deltas, axis=0), columns=trades.columns) + + df2 = pd.concat([dates, df2], axis=1) + df2 = df2.set_index("date") + df_final = df2.resample(timeframe_freq)[["pair"]].count() + df_final = df_final.rename({"pair": "open_trades"}, axis=1) + return df_final + + +def evaluate_result_multi( + trades: pd.DataFrame, timeframe: str, max_open_trades: IntOrInf +) -> pd.DataFrame: + """ + Find overlapping trades by expanding each trade once per period it was open + and then counting overlaps + :param trades: Trades Dataframe - can be loaded from backtest, or created + via trade_list_to_dataframe + :param timeframe: Frequency used for the backtest + :param max_open_trades: parameter max_open_trades used during backtest run + :return: dataframe with open-counts per time-period in freq + """ + df_final = analyze_trade_parallelism(trades, timeframe) + return df_final[df_final["open_trades"] > max_open_trades] diff --git a/freqtrade/data/converter/orderflow.py b/freqtrade/data/converter/orderflow.py index 4b4923cfb..2b4a1fc61 100644 --- a/freqtrade/data/converter/orderflow.py +++ b/freqtrade/data/converter/orderflow.py @@ -9,26 +9,12 @@ from datetime import datetime import numpy as np import pandas as pd -from freqtrade.constants import DEFAULT_ORDERFLOW_COLUMNS, Config +from freqtrade.constants import DEFAULT_ORDERFLOW_COLUMNS, ORDERFLOW_ADDED_COLUMNS, Config 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): """ diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index b979faff6..1f2bcd82d 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -49,7 +49,7 @@ class DataProvider: self._pairlists = pairlists self.__rpc = rpc self.__cached_pairs: dict[PairWithTimeframe, tuple[DataFrame, datetime]] = {} - self.__slice_index: int | None = None + self.__slice_index: dict[str, int] = {} self.__slice_date: datetime | None = None self.__cached_pairs_backtesting: dict[PairWithTimeframe, DataFrame] = {} @@ -69,13 +69,13 @@ class DataProvider: self.producers = self._config.get("external_message_consumer", {}).get("producers", []) self.external_data_enabled = len(self.producers) > 0 - def _set_dataframe_max_index(self, limit_index: int): + def _set_dataframe_max_index(self, pair: str, limit_index: int): """ Limit analyzed dataframe to max specified index. Only relevant in backtesting. :param limit_index: dataframe index. """ - self.__slice_index = limit_index + self.__slice_index[pair] = limit_index def _set_dataframe_max_date(self, limit_date: datetime): """ @@ -393,9 +393,10 @@ class DataProvider: df, date = self.__cached_pairs[pair_key] else: df, date = self.__cached_pairs[pair_key] - if self.__slice_index is not None: - max_index = self.__slice_index + if (max_index := self.__slice_index.get(pair)) is not None: df = df.iloc[max(0, max_index - MAX_DATAFRAME_CANDLES) : max_index] + else: + return (DataFrame(), datetime.fromtimestamp(0, tz=timezone.utc)) return df, date else: return (DataFrame(), datetime.fromtimestamp(0, tz=timezone.utc)) @@ -430,7 +431,7 @@ class DataProvider: # Don't reset backtesting pairs - # otherwise they're reloaded each time during hyperopt due to with analyze_per_epoch # self.__cached_pairs_backtesting = {} - self.__slice_index = 0 + self.__slice_index = {} # Exchange functions diff --git a/freqtrade/data/entryexitanalysis.py b/freqtrade/data/entryexitanalysis.py index 0c49b775c..2bea8a5db 100644 --- a/freqtrade/data/entryexitanalysis.py +++ b/freqtrade/data/entryexitanalysis.py @@ -281,7 +281,7 @@ def _merge_dfs( ): merge_on = ["pair", "open_date"] signal_wide_indicators = list(set(available_inds) - set(BT_DATA_COLUMNS)) - columns_to_keep = merge_on + ["enter_reason", "exit_reason"] + columns_to_keep = [*merge_on, "enter_reason", "exit_reason"] if exit_df is None or exit_df.empty or entry_only is True: return entry_df[columns_to_keep + available_inds] diff --git a/freqtrade/data/history/history_utils.py b/freqtrade/data/history/history_utils.py index 806fd49da..9fd254057 100644 --- a/freqtrade/data/history/history_utils.py +++ b/freqtrade/data/history/history_utils.py @@ -116,7 +116,7 @@ def load_data( result[pair] = hist else: if candle_type is CandleType.FUNDING_RATE and user_futures_funding_rate is not None: - logger.warn(f"{pair} using user specified [{user_futures_funding_rate}]") + logger.warning(f"{pair} using user specified [{user_futures_funding_rate}]") elif candle_type not in (CandleType.SPOT, CandleType.FUTURES): result[pair] = DataFrame(columns=["date", "open", "close", "high", "low", "volume"]) diff --git a/freqtrade/data/metrics.py b/freqtrade/data/metrics.py index de8ebac4a..6a1ad2766 100644 --- a/freqtrade/data/metrics.py +++ b/freqtrade/data/metrics.py @@ -10,7 +10,9 @@ import pandas as pd logger = logging.getLogger(__name__) -def calculate_market_change(data: dict[str, pd.DataFrame], column: str = "close") -> float: +def calculate_market_change( + data: dict[str, pd.DataFrame], column: str = "close", min_date: datetime | None = None +) -> float: """ Calculate market change based on "column". Calculation is done by taking the first non-null and the last non-null element of each column @@ -19,14 +21,24 @@ def calculate_market_change(data: dict[str, pd.DataFrame], column: str = "close" :param data: Dict of Dataframes, dict key should be pair. :param column: Column in the original dataframes to use + :param min_date: Minimum date to consider for calculations. Market change should only be + calculated for data actually backtested, excluding startup periods. :return: """ tmp_means = [] for pair, df in data.items(): - start = df[column].dropna().iloc[0] - end = df[column].dropna().iloc[-1] + df1 = df + if min_date is not None: + df1 = df1[df1["date"] >= min_date] + if df1.empty: + logger.warning(f"Pair {pair} has no data after {min_date}.") + continue + start = df1[column].dropna().iloc[0] + end = df1[column].dropna().iloc[-1] tmp_means.append((end - start) / start) + if not tmp_means: + return 0.0 return float(np.mean(tmp_means)) @@ -118,7 +130,7 @@ def _calc_drawdown_series( ) -> pd.DataFrame: max_drawdown_df = pd.DataFrame() max_drawdown_df["cumulative"] = profit_results[value_col].cumsum() - max_drawdown_df["high_value"] = max_drawdown_df["cumulative"].cummax() + max_drawdown_df["high_value"] = np.maximum(0, max_drawdown_df["cumulative"].cummax()) max_drawdown_df["drawdown"] = max_drawdown_df["cumulative"] - max_drawdown_df["high_value"] max_drawdown_df["date"] = profit_results.loc[:, date_col] if starting_balance: @@ -201,13 +213,11 @@ def calculate_max_drawdown( if relative else max_drawdown_df["drawdown"].idxmin() ) - if idxmin == 0: - raise ValueError("No losing trade, therefore no drawdown.") - high_date = profit_results.loc[max_drawdown_df.iloc[:idxmin]["high_value"].idxmax(), date_col] + + high_idx = max_drawdown_df.iloc[: idxmin + 1]["high_value"].idxmax() + high_date = profit_results.loc[high_idx, date_col] low_date = profit_results.loc[idxmin, date_col] - high_val = max_drawdown_df.loc[ - max_drawdown_df.iloc[:idxmin]["high_value"].idxmax(), "cumulative" - ] + high_val = max_drawdown_df.loc[high_idx, "cumulative"] low_val = max_drawdown_df.loc[idxmin, "cumulative"] max_drawdown_rel = max_drawdown_df.loc[idxmin, "drawdown_relative"] @@ -375,3 +385,32 @@ def calculate_calmar( # print(expected_returns_mean, max_drawdown, calmar_ratio) return calmar_ratio + + +def calculate_sqn(trades: pd.DataFrame, starting_balance: float) -> float: + """ + Calculate System Quality Number (SQN) - Van K. Tharp. + SQN measures systematic trading quality and takes into account both + the number of trades and their standard deviation. + + :param trades: DataFrame containing trades (requires column profit_abs) + :param starting_balance: Starting balance of the trading system + :return: SQN value + """ + if len(trades) == 0: + return 0.0 + + total_profit = trades["profit_abs"] / starting_balance + number_of_trades = len(trades) + + # Calculate average trade and standard deviation + average_profits = total_profit.mean() + profits_std = total_profit.std() + + if profits_std != 0 and not np.isnan(profits_std): + sqn = math.sqrt(number_of_trades) * (average_profits / profits_std) + else: + # Define negative SQN to indicate this is NOT optimal + sqn = -100.0 + + return round(sqn, 4) diff --git a/freqtrade/enums/state.py b/freqtrade/enums/state.py index 1ce486920..20b3766b9 100644 --- a/freqtrade/enums/state.py +++ b/freqtrade/enums/state.py @@ -7,8 +7,9 @@ class State(Enum): """ RUNNING = 1 - STOPPED = 2 - RELOAD_CONFIG = 3 + PAUSED = 2 + STOPPED = 3 + RELOAD_CONFIG = 4 def __str__(self): return f"{self.name.lower()}" diff --git a/freqtrade/exchange/binance.py b/freqtrade/exchange/binance.py index e9c44a41e..57b7da2e0 100644 --- a/freqtrade/exchange/binance.py +++ b/freqtrade/exchange/binance.py @@ -11,7 +11,11 @@ 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.binance_public_data import ( + concat_safe, + download_archive_ohlcv, + download_archive_trades, +) from freqtrade.exchange.common import retrier from freqtrade.exchange.exchange_types import FtHas, Tickers from freqtrade.exchange.exchange_utils_timeframe import timeframe_to_msecs @@ -139,7 +143,7 @@ class Binance(Exchange): 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: + if is_new_pair and candle_type in (CandleType.SPOT, CandleType.FUTURES, CandleType.MARK): with self._loop_lock: x = self.loop.run_until_complete( self._async_get_candle_history(pair, timeframe, candle_type, 0) @@ -270,12 +274,12 @@ class Binance(Exchange): def dry_run_liquidation_price( self, pair: str, - open_rate: float, # Entry price of position + open_rate: float, is_short: bool, amount: float, stake_amount: float, leverage: float, - wallet_balance: float, # Or margin balance + wallet_balance: float, open_trades: list, ) -> float | None: """ @@ -289,8 +293,6 @@ class Binance(Exchange): :param amount: Absolute value of position size incl. leverage (in base currency) :param stake_amount: Stake amount - Collateral in settle currency. :param leverage: Leverage used for this position. - :param trading_mode: SPOT, MARGIN, FUTURES, etc. - :param margin_mode: Either ISOLATED or CROSS :param wallet_balance: Amount of margin_mode in the wallet being used to trade Cross-Margin Mode: crossWalletBalance Isolated-Margin Mode: isolatedWalletBalance @@ -379,3 +381,48 @@ class Binance(Exchange): if not t: return [], "0" return t, from_id + + async def _async_get_trade_history_id( + self, pair: str, until: int, since: int, from_id: str | None = None + ) -> tuple[str, list[list]]: + logger.info(f"Fetching trades from Binance, {from_id=}, {since=}, {until=}") + + if not self._config["exchange"].get("only_from_ccxt", False): + if from_id is None or not since: + trades = await self._api_async.fetch_trades( + pair, + params={ + self._trades_pagination_arg: "0", + }, + limit=5, + ) + listing_date: int = trades[0]["timestamp"] + since = max(since, listing_date) + + _, res = await download_archive_trades( + CandleType.SPOT, + pair, + since_ms=since, + until_ms=until, + markets=self.markets, + ) + + if not res: + end_time = since + end_id = from_id + else: + end_time = res[-1][0] + end_id = res[-1][1] + + if end_time and end_time >= until: + return pair, res + else: + _, res2 = await super()._async_get_trade_history_id( + pair, until=until, since=end_time, from_id=end_id + ) + res.extend(res2) + return pair, res + + return await super()._async_get_trade_history_id( + pair, until=until, since=since, from_id=from_id + ) diff --git a/freqtrade/exchange/binance_leverage_tiers.json b/freqtrade/exchange/binance_leverage_tiers.json index 0181243f9..663bd15b9 100644 --- a/freqtrade/exchange/binance_leverage_tiers.json +++ b/freqtrade/exchange/binance_leverage_tiers.json @@ -298,13 +298,13 @@ "symbol": "1000BONK/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" @@ -314,136 +314,153 @@ "tier": 2.0, "symbol": "1000BONK/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 100000.0, + "minNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "100000", - "notionalFloor": "10000", + "notionalCap": "10000", + "notionalFloor": "5000", "maintMarginRatio": "0.015", - "cum": "50.0" + "cum": "25.0" } }, { "tier": 3.0, "symbol": "1000BONK/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 500000.0, + "minNotional": 10000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "500000", - "notionalFloor": "100000", + "notionalCap": "25000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "550.0" + "cum": "75.0" } }, { "tier": 4.0, "symbol": "1000BONK/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "50000", + "notionalFloor": "25000", "maintMarginRatio": "0.025", - "cum": "3050.0" + "cum": "200.0" } }, { "tier": 5.0, "symbol": "1000BONK/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 5000000.0, + "minNotional": 50000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "5000000", - "notionalFloor": "1000000", + "notionalCap": "250000", + "notionalFloor": "50000", "maintMarginRatio": "0.05", - "cum": "28050.0" + "cum": "1450.0" } }, { "tier": 6.0, "symbol": "1000BONK/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "500000", + "notionalFloor": "250000", "maintMarginRatio": "0.1", - "cum": "278050.0" + "cum": "13950.0" } }, { "tier": 7.0, "symbol": "1000BONK/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 12500000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "12500000", - "notionalFloor": "10000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "528050.0" + "cum": "26450.0" } }, { "tier": 8.0, "symbol": "1000BONK/USDT:USDT", "currency": "USDT", - "minNotional": 12500000.0, - "maxNotional": 25000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "25000000", - "notionalFloor": "12500000", - "maintMarginRatio": "0.25", - "cum": "2090550.0" + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1667", + "cum": "68150.0" } }, { "tier": 9.0, "symbol": "1000BONK/USDT:USDT", "currency": "USDT", - "minNotional": 25000000.0, - "maxNotional": 50000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.25", + "cum": "318050.0" + } + }, + { + "tier": 10.0, + "symbol": "1000BONK/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "25000000", + "notionalCap": "8000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "8340550.0" + "cum": "1568050.0" } } ], @@ -455,10 +472,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -472,10 +489,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -489,10 +506,10 @@ "minNotional": 20000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "8", "notionalCap": "100000", "notionalFloor": "20000", "maintMarginRatio": "0.02", @@ -506,10 +523,10 @@ "minNotional": 100000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "7", "notionalCap": "200000", "notionalFloor": "100000", "maintMarginRatio": "0.025", @@ -523,10 +540,10 @@ "minNotional": 200000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "1000000", "notionalFloor": "200000", "maintMarginRatio": "0.05", @@ -572,33 +589,50 @@ "symbol": "1000CAT/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maxNotional": 3750000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "5000000", + "initialLeverage": "3", + "notionalCap": "3750000", "notionalFloor": "2500000", - "maintMarginRatio": "0.25", - "cum": "418150.0" + "maintMarginRatio": "0.1667", + "cum": "209900.0" } }, { "tier": 9.0, "symbol": "1000CAT/USDT:USDT", "currency": "USDT", + "minNotional": 3750000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3750000", + "maintMarginRatio": "0.25", + "cum": "522275.0" + } + }, + { + "tier": 10.0, + "symbol": "1000CAT/USDT:USDT", + "currency": "USDT", "minNotional": 5000000.0, "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", "notionalCap": "10000000", "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1668150.0" + "cum": "1772275.0" } } ], @@ -610,10 +644,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -627,10 +661,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -644,10 +678,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 15.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "15", + "initialLeverage": "8", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -661,10 +695,10 @@ "minNotional": 30000.0, "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "10", + "initialLeverage": "7", "notionalCap": "60000", "notionalFloor": "30000", "maintMarginRatio": "0.025", @@ -678,10 +712,10 @@ "minNotional": 60000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "8", + "initialLeverage": "6", "notionalCap": "300000", "notionalFloor": "60000", "maintMarginRatio": "0.05", @@ -763,13 +797,13 @@ "symbol": "1000FLOKI/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" @@ -779,136 +813,153 @@ "tier": 2.0, "symbol": "1000FLOKI/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": "1000FLOKI/USDT:USDT", "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 300000.0, + "minNotional": 10000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "300000", - "notionalFloor": "60000", + "notionalCap": "25000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "350.0" + "cum": "75.0" } }, { "tier": 4.0, "symbol": "1000FLOKI/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "300000", + "notionalCap": "50000", + "notionalFloor": "25000", "maintMarginRatio": "0.025", - "cum": "1850.0" + "cum": "200.0" } }, { "tier": 5.0, "symbol": "1000FLOKI/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 3000000.0, + "minNotional": 50000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "3000000", - "notionalFloor": "600000", + "notionalCap": "250000", + "notionalFloor": "50000", "maintMarginRatio": "0.05", - "cum": "16850.0" + "cum": "1450.0" } }, { "tier": 6.0, "symbol": "1000FLOKI/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "500000", + "notionalFloor": "250000", "maintMarginRatio": "0.1", - "cum": "166850.0" + "cum": "13950.0" } }, { "tier": 7.0, "symbol": "1000FLOKI/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "7500000", - "notionalFloor": "6000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "316850.0" + "cum": "26450.0" } }, { "tier": 8.0, "symbol": "1000FLOKI/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "15000000", - "notionalFloor": "7500000", - "maintMarginRatio": "0.25", - "cum": "1254350.0" + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1667", + "cum": "68150.0" } }, { "tier": 9.0, "symbol": "1000FLOKI/USDT:USDT", "currency": "USDT", - "minNotional": 15000000.0, - "maxNotional": 30000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.25", + "cum": "318050.0" + } + }, + { + "tier": 10.0, + "symbol": "1000FLOKI/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "15000000", + "notionalCap": "8000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "5004350.0" + "cum": "1568050.0" } } ], @@ -1279,13 +1330,13 @@ "symbol": "1000PEPE/USDT:USDT", "currency": "USDT", "minNotional": 15000000.0, - "maxNotional": 30000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "7", "initialLeverage": "5", - "notionalCap": "30000000", + "notionalCap": "20000000", "notionalFloor": "15000000", "maintMarginRatio": "0.1", "cum": "835070.0" @@ -1295,51 +1346,51 @@ "tier": 8.0, "symbol": "1000PEPE/USDT:USDT", "currency": "USDT", - "minNotional": 30000000.0, - "maxNotional": 37500000.0, + "minNotional": 20000000.0, + "maxNotional": 25000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "8", "initialLeverage": "4", - "notionalCap": "37500000", - "notionalFloor": "30000000", + "notionalCap": "25000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.125", - "cum": "1585070.0" + "cum": "1335070.0" } }, { "tier": 9.0, "symbol": "1000PEPE/USDT:USDT", "currency": "USDT", - "minNotional": 37500000.0, - "maxNotional": 75000000.0, + "minNotional": 25000000.0, + "maxNotional": 30000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "75000000", - "notionalFloor": "37500000", + "notionalCap": "30000000", + "notionalFloor": "25000000", "maintMarginRatio": "0.25", - "cum": "6272570.0" + "cum": "4460070.0" } }, { "tier": 10.0, "symbol": "1000PEPE/USDT:USDT", "currency": "USDT", - "minNotional": 75000000.0, - "maxNotional": 150000000.0, + "minNotional": 30000000.0, + "maxNotional": 35000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "150000000", - "notionalFloor": "75000000", + "notionalCap": "35000000", + "notionalFloor": "30000000", "maintMarginRatio": "0.5", - "cum": "25022570.0" + "cum": "11960070.0" } } ], @@ -1351,10 +1402,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -1368,10 +1419,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -1385,10 +1436,10 @@ "minNotional": 20000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 15.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "15", + "initialLeverage": "8", "notionalCap": "100000", "notionalFloor": "20000", "maintMarginRatio": "0.02", @@ -1402,10 +1453,10 @@ "minNotional": 100000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "10", + "initialLeverage": "7", "notionalCap": "200000", "notionalFloor": "100000", "maintMarginRatio": "0.025", @@ -1419,10 +1470,10 @@ "minNotional": 200000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "8", + "initialLeverage": "6", "notionalCap": "1000000", "notionalFloor": "200000", "maintMarginRatio": "0.05", @@ -1468,33 +1519,50 @@ "symbol": "1000RATS/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, - "maxNotional": 3000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maxNotional": 2750000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "3000000", + "initialLeverage": "3", + "notionalCap": "2750000", "notionalFloor": "2500000", - "maintMarginRatio": "0.25", - "cum": "418150.0" + "maintMarginRatio": "0.1667", + "cum": "209900.0" } }, { "tier": 9.0, "symbol": "1000RATS/USDT:USDT", "currency": "USDT", + "minNotional": 2750000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "3000000", + "notionalFloor": "2750000", + "maintMarginRatio": "0.25", + "cum": "438975.0" + } + }, + { + "tier": 10.0, + "symbol": "1000RATS/USDT:USDT", + "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 3500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", "notionalCap": "3500000", "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "1168150.0" + "cum": "1188975.0" } } ], @@ -1506,10 +1574,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "10", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -1521,13 +1589,13 @@ "symbol": "1000SATS/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 60000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "50", - "notionalCap": "60000", + "initialLeverage": "8", + "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.015", "cum": "50.0" @@ -1537,119 +1605,119 @@ "tier": 3.0, "symbol": "1000SATS/USDT:USDT", "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 300000.0, + "minNotional": 50000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 7.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "300000", - "notionalFloor": "60000", + "initialLeverage": "7", + "notionalCap": "200000", + "notionalFloor": "50000", "maintMarginRatio": "0.02", - "cum": "350.0" + "cum": "300.0" } }, { "tier": 4.0, "symbol": "1000SATS/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 200000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "300000", + "initialLeverage": "6", + "notionalCap": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.025", - "cum": "1850.0" + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "1000SATS/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 3000000.0, + "minNotional": 400000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "3000000", - "notionalFloor": "600000", + "initialLeverage": "5", + "notionalCap": "800000", + "notionalFloor": "400000", "maintMarginRatio": "0.05", - "cum": "16850.0" + "cum": "11300.0" } }, { "tier": 6.0, "symbol": "1000SATS/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "minNotional": 800000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "800000", "maintMarginRatio": "0.1", - "cum": "166850.0" + "cum": "51300.0" } }, { "tier": 7.0, "symbol": "1000SATS/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "7000000", - "notionalFloor": "6000000", + "initialLeverage": "3", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "316850.0" + "cum": "76300.0" } }, { "tier": 8.0, "symbol": "1000SATS/USDT:USDT", "currency": "USDT", - "minNotional": 7000000.0, - "maxNotional": 8000000.0, + "minNotional": 2000000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "8000000", - "notionalFloor": "7000000", + "notionalCap": "3000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.25", - "cum": "1191850.0" + "cum": "326300.0" } }, { "tier": 9.0, "symbol": "1000SATS/USDT:USDT", "currency": "USDT", - "minNotional": 8000000.0, - "maxNotional": 9000000.0, + "minNotional": 3000000.0, + "maxNotional": 3500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "9000000", - "notionalFloor": "8000000", + "notionalCap": "3500000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "3191850.0" + "cum": "1076300.0" } } ], @@ -1899,13 +1967,13 @@ "symbol": "1000SHIB/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, - "maxNotional": 8000000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "6", "initialLeverage": "10", - "notionalCap": "8000000", + "notionalCap": "3000000", "notionalFloor": "1600000", "maintMarginRatio": "0.05", "cum": "45837.5" @@ -1915,68 +1983,68 @@ "tier": 7.0, "symbol": "1000SHIB/USDT:USDT", "currency": "USDT", - "minNotional": 8000000.0, - "maxNotional": 16000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "7", "initialLeverage": "5", - "notionalCap": "16000000", - "notionalFloor": "8000000", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.1", - "cum": "445837.5" + "cum": "195837.5" } }, { "tier": 8.0, "symbol": "1000SHIB/USDT:USDT", "currency": "USDT", - "minNotional": 16000000.0, - "maxNotional": 20000000.0, + "minNotional": 5000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "8", "initialLeverage": "4", - "notionalCap": "20000000", - "notionalFloor": "16000000", + "notionalCap": "6000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.125", - "cum": "845837.5" + "cum": "320837.5" } }, { "tier": 9.0, "symbol": "1000SHIB/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 40000000.0, + "minNotional": 6000000.0, + "maxNotional": 7000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "40000000", - "notionalFloor": "20000000", + "notionalCap": "7000000", + "notionalFloor": "6000000", "maintMarginRatio": "0.25", - "cum": "3345837.5" + "cum": "1070837.5" } }, { "tier": 10.0, "symbol": "1000SHIB/USDT:USDT", "currency": "USDT", - "minNotional": 40000000.0, - "maxNotional": 80000000.0, + "minNotional": 7000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "80000000", - "notionalFloor": "40000000", + "notionalCap": "8000000", + "notionalFloor": "7000000", "maintMarginRatio": "0.5", - "cum": "13345837.5" + "cum": "2820837.5" } } ], @@ -2260,13 +2328,13 @@ "symbol": "1000X/USDT:USDT", "currency": "USDT", "minNotional": 700000.0, - "maxNotional": 800000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "800000", + "notionalCap": "1500000", "notionalFloor": "700000", "maintMarginRatio": "0.25", "cum": "119225.0" @@ -2276,17 +2344,17 @@ "tier": 9.0, "symbol": "1000X/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 900000.0, + "minNotional": 1500000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "900000", - "notionalFloor": "800000", + "notionalCap": "2500000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "319225.0" + "cum": "494225.0" } } ], @@ -2453,10 +2521,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -2470,10 +2538,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -2487,10 +2555,10 @@ "minNotional": 20000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "8", "notionalCap": "100000", "notionalFloor": "20000", "maintMarginRatio": "0.02", @@ -2504,10 +2572,10 @@ "minNotional": 100000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "7", "notionalCap": "200000", "notionalFloor": "100000", "maintMarginRatio": "0.025", @@ -2521,10 +2589,10 @@ "minNotional": 200000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "1000000", "notionalFloor": "200000", "maintMarginRatio": "0.05", @@ -2570,33 +2638,50 @@ "symbol": "1INCH/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maxNotional": 3750000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "5000000", + "initialLeverage": "3", + "notionalCap": "3750000", "notionalFloor": "2500000", - "maintMarginRatio": "0.25", - "cum": "418150.0" + "maintMarginRatio": "0.1667", + "cum": "209900.0" } }, { "tier": 9.0, "symbol": "1INCH/USDT:USDT", "currency": "USDT", + "minNotional": 3750000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3750000", + "maintMarginRatio": "0.25", + "cum": "522275.0" + } + }, + { + "tier": 10.0, + "symbol": "1INCH/USDT:USDT", + "currency": "USDT", "minNotional": 5000000.0, "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", "notionalCap": "10000000", "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1668150.0" + "cum": "1772275.0" } } ], @@ -2608,10 +2693,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -2623,13 +2708,13 @@ "symbol": "1MBABYDOGE/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 30000.0, + "maxNotional": 40000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", - "notionalCap": "30000", + "initialLeverage": "10", + "notionalCap": "40000", "notionalFloor": "10000", "maintMarginRatio": "0.015", "cum": "50.0" @@ -2639,51 +2724,51 @@ "tier": 3.0, "symbol": "1MBABYDOGE/USDT:USDT", "currency": "USDT", - "minNotional": 30000.0, - "maxNotional": 150000.0, + "minNotional": 40000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 7.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "150000", - "notionalFloor": "30000", + "initialLeverage": "7", + "notionalCap": "200000", + "notionalFloor": "40000", "maintMarginRatio": "0.02", - "cum": "200.0" + "cum": "250.0" } }, { "tier": 4.0, "symbol": "1MBABYDOGE/USDT:USDT", "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 300000.0, + "minNotional": 200000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "300000", - "notionalFloor": "150000", + "initialLeverage": "6", + "notionalCap": "400000", + "notionalFloor": "200000", "maintMarginRatio": "0.025", - "cum": "950.0" + "cum": "1250.0" } }, { "tier": 5.0, "symbol": "1MBABYDOGE/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, + "minNotional": 400000.0, "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "1500000", - "notionalFloor": "300000", + "notionalFloor": "400000", "maintMarginRatio": "0.05", - "cum": "8450.0" + "cum": "11250.0" } }, { @@ -2691,67 +2776,67 @@ "symbol": "1MBABYDOGE/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", - "notionalCap": "3000000", + "initialLeverage": "4", + "notionalCap": "2000000", "notionalFloor": "1500000", "maintMarginRatio": "0.1", - "cum": "83450.0" + "cum": "86250.0" } }, { "tier": 7.0, "symbol": "1MBABYDOGE/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3750000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "3750000", - "notionalFloor": "3000000", + "initialLeverage": "3", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "158450.0" + "cum": "136250.0" } }, { "tier": 8.0, "symbol": "1MBABYDOGE/USDT:USDT", "currency": "USDT", - "minNotional": 3750000.0, - "maxNotional": 7500000.0, + "minNotional": 2500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "3750000", + "notionalCap": "3000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.25", - "cum": "627200.0" + "cum": "448750.0" } }, { "tier": 9.0, "symbol": "1MBABYDOGE/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 3000000.0, + "maxNotional": 3500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "3500000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "2502200.0" + "cum": "1198750.0" } } ], @@ -2916,15 +3001,15 @@ "symbol": "ACE/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 4000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "25", + "notionalCap": "4000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, @@ -2932,72 +3017,89 @@ "tier": 2.0, "symbol": "ACE/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 4000.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "initialLeverage": "20", + "notionalCap": "5000", + "notionalFloor": "4000", + "maintMarginRatio": "0.015", + "cum": "20.0" } }, { "tier": 3.0, "symbol": "ACE/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "25000", - "maintMarginRatio": "0.025", - "cum": "150.0" + "initialLeverage": "10", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "45.0" } }, { "tier": 4.0, "symbol": "ACE/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "500000", - "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1400.0" + "initialLeverage": "7", + "notionalCap": "50000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "170.0" } }, { "tier": 5.0, "symbol": "ACE/USDT:USDT", "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, + "info": { + "bracket": "5", + "initialLeverage": "6", + "notionalCap": "500000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1420.0" + } + }, + { + "tier": 6.0, + "symbol": "ACE/USDT:USDT", + "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "26400.0" + "cum": "26420.0" } }, { - "tier": 6.0, + "tier": 7.0, "symbol": "ACE/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, @@ -3005,46 +3107,63 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", "notionalCap": "1250000", "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "51400.0" - } - }, - { - "tier": 7.0, - "symbol": "ACE/USDT:USDT", - "currency": "USDT", - "minNotional": 1250000.0, - "maxNotional": 2500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "2500000", - "notionalFloor": "1250000", - "maintMarginRatio": "0.25", - "cum": "207650.0" + "cum": "51420.0" } }, { "tier": 8.0, "symbol": "ACE/USDT:USDT", "currency": "USDT", + "minNotional": 1250000.0, + "maxNotional": 1875000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "1875000", + "notionalFloor": "1250000", + "maintMarginRatio": "0.1667", + "cum": "103545.0" + } + }, + { + "tier": 9.0, + "symbol": "ACE/USDT:USDT", + "currency": "USDT", + "minNotional": 1875000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "1875000", + "maintMarginRatio": "0.25", + "cum": "259732.5" + } + }, + { + "tier": 10.0, + "symbol": "ACE/USDT:USDT", + "currency": "USDT", "minNotional": 2500000.0, "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "10", "initialLeverage": "1", "notionalCap": "5000000", "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "832650.0" + "cum": "884732.5" } } ], @@ -3194,10 +3313,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "10", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -3209,13 +3328,13 @@ "symbol": "ACT/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 80000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "50", - "notionalCap": "80000", + "initialLeverage": "8", + "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.015", "cum": "50.0" @@ -3225,119 +3344,119 @@ "tier": 3.0, "symbol": "ACT/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 400000.0, + "minNotional": 50000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 7.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "400000", - "notionalFloor": "80000", + "initialLeverage": "7", + "notionalCap": "300000", + "notionalFloor": "50000", "maintMarginRatio": "0.02", - "cum": "450.0" + "cum": "300.0" } }, { "tier": 4.0, "symbol": "ACT/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 800000.0, + "minNotional": 300000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "800000", - "notionalFloor": "400000", + "initialLeverage": "6", + "notionalCap": "500000", + "notionalFloor": "300000", "maintMarginRatio": "0.025", - "cum": "2450.0" + "cum": "1800.0" } }, { "tier": 5.0, "symbol": "ACT/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 4000000.0, + "minNotional": 500000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "4000000", - "notionalFloor": "800000", + "initialLeverage": "5", + "notionalCap": "800000", + "notionalFloor": "500000", "maintMarginRatio": "0.05", - "cum": "22450.0" + "cum": "14300.0" } }, { "tier": 6.0, "symbol": "ACT/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "minNotional": 800000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", - "notionalCap": "8000000", - "notionalFloor": "4000000", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "800000", "maintMarginRatio": "0.1", - "cum": "222450.0" + "cum": "54300.0" } }, { "tier": 7.0, "symbol": "ACT/USDT:USDT", "currency": "USDT", - "minNotional": 8000000.0, - "maxNotional": 10000000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "10000000", - "notionalFloor": "8000000", + "initialLeverage": "3", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "422450.0" + "cum": "79300.0" } }, { "tier": 8.0, "symbol": "ACT/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 12000000.0, + "minNotional": 2000000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "12000000", - "notionalFloor": "10000000", + "notionalCap": "3000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.25", - "cum": "1672450.0" + "cum": "329300.0" } }, { "tier": 9.0, "symbol": "ACT/USDT:USDT", "currency": "USDT", - "minNotional": 12000000.0, - "maxNotional": 14000000.0, + "minNotional": 3000000.0, + "maxNotional": 3500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "14000000", - "notionalFloor": "12000000", + "notionalCap": "3500000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "4672450.0" + "cum": "1079300.0" } } ], @@ -3349,10 +3468,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -3366,10 +3485,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -3383,10 +3502,10 @@ "minNotional": 20000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "8", "notionalCap": "100000", "notionalFloor": "20000", "maintMarginRatio": "0.02", @@ -3400,10 +3519,10 @@ "minNotional": 100000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "7", "notionalCap": "200000", "notionalFloor": "100000", "maintMarginRatio": "0.025", @@ -3417,10 +3536,10 @@ "minNotional": 200000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "1000000", "notionalFloor": "200000", "maintMarginRatio": "0.05", @@ -3466,33 +3585,205 @@ "symbol": "ACX/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maxNotional": 3750000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "5000000", + "initialLeverage": "3", + "notionalCap": "3750000", "notionalFloor": "2500000", - "maintMarginRatio": "0.25", - "cum": "418150.0" + "maintMarginRatio": "0.1667", + "cum": "209900.0" } }, { "tier": 9.0, "symbol": "ACX/USDT:USDT", "currency": "USDT", + "minNotional": 3750000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3750000", + "maintMarginRatio": "0.25", + "cum": "522275.0" + } + }, + { + "tier": 10.0, + "symbol": "ACX/USDT:USDT", + "currency": "USDT", "minNotional": 5000000.0, "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", "notionalCap": "10000000", "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1668150.0" + "cum": "1772275.0" + } + } + ], + "ADA/USDC:USDC": [ + { + "tier": 1.0, + "symbol": "ADA/USDC:USDC", + "currency": "USDC", + "minNotional": 0.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 25.0, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "ADA/USDC:USDC", + "currency": "USDC", + "minNotional": 10000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "20000", + "notionalFloor": "10000", + "maintMarginRatio": "0.015", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "ADA/USDC:USDC", + "currency": "USDC", + "minNotional": 20000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 15.0, + "info": { + "bracket": "3", + "initialLeverage": "15", + "notionalCap": "60000", + "notionalFloor": "20000", + "maintMarginRatio": "0.02", + "cum": "150.0" + } + }, + { + "tier": 4.0, + "symbol": "ADA/USDC:USDC", + "currency": "USDC", + "minNotional": 60000.0, + "maxNotional": 120000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "120000", + "notionalFloor": "60000", + "maintMarginRatio": "0.025", + "cum": "450.0" + } + }, + { + "tier": 5.0, + "symbol": "ADA/USDC:USDC", + "currency": "USDC", + "minNotional": 120000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 8.0, + "info": { + "bracket": "5", + "initialLeverage": "8", + "notionalCap": "600000", + "notionalFloor": "120000", + "maintMarginRatio": "0.05", + "cum": "3450.0" + } + }, + { + "tier": 6.0, + "symbol": "ADA/USDC:USDC", + "currency": "USDC", + "minNotional": 600000.0, + "maxNotional": 1200000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "1200000", + "notionalFloor": "600000", + "maintMarginRatio": "0.1", + "cum": "33450.0" + } + }, + { + "tier": 7.0, + "symbol": "ADA/USDC:USDC", + "currency": "USDC", + "minNotional": 1200000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "1500000", + "notionalFloor": "1200000", + "maintMarginRatio": "0.125", + "cum": "63450.0" + } + }, + { + "tier": 8.0, + "symbol": "ADA/USDC:USDC", + "currency": "USDC", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.25", + "cum": "250950.0" + } + }, + { + "tier": 9.0, + "symbol": "ADA/USDC:USDC", + "currency": "USDC", + "minNotional": 3000000.0, + "maxNotional": 6000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "6000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.5", + "cum": "1000950.0" } } ], @@ -3675,14 +3966,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.015", "cum": "0.0" } }, @@ -3691,15 +3982,15 @@ "symbol": "AERGO/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "2", - "initialLeverage": "50", - "notionalCap": "10000", + "initialLeverage": "25", + "notionalCap": "25000", "notionalFloor": "5000", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "25.0" } }, @@ -3707,119 +3998,119 @@ "tier": 3.0, "symbol": "AERGO/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.02", - "cum": "75.0" + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "150.0" } }, { "tier": 4.0, "symbol": "AERGO/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 40000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 50000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "40000", - "notionalFloor": "20000", - "maintMarginRatio": "0.025", - "cum": "175.0" + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1400.0" } }, { "tier": 5.0, "symbol": "AERGO/USDT:USDT", "currency": "USDT", - "minNotional": 40000.0, - "maxNotional": 200000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "40000", - "maintMarginRatio": "0.05", - "cum": "1175.0" + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "13900.0" } }, { "tier": 6.0, "symbol": "AERGO/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", - "maintMarginRatio": "0.1", - "cum": "11175.0" + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "26400.0" } }, { "tier": 7.0, "symbol": "AERGO/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", - "maintMarginRatio": "0.125", - "cum": "21175.0" + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1667", + "cum": "68100.0" } }, { "tier": 8.0, "symbol": "AERGO/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.25", - "cum": "83675.0" + "cum": "318000.0" } }, { "tier": 9.0, "symbol": "AERGO/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 5000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "8000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "333675.0" + "cum": "1568000.0" } } ], @@ -3985,14 +4276,14 @@ "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" } }, @@ -4001,15 +4292,15 @@ "symbol": "AEVO/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.02, - "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.02", + "maintMarginRatio": "0.015", "cum": "25.0" } }, @@ -4017,102 +4308,136 @@ "tier": 3.0, "symbol": "AEVO/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "100000", - "notionalFloor": "50000", - "maintMarginRatio": "0.025", - "cum": "275.0" + "initialLeverage": "25", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" } }, { "tier": 4.0, "symbol": "AEVO/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "1000000", - "notionalFloor": "100000", - "maintMarginRatio": "0.05", - "cum": "2775.0" + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "200.0" } }, { "tier": 5.0, "symbol": "AEVO/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 50000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "5", - "initialLeverage": "5", - "notionalCap": "2000000", - "notionalFloor": "1000000", - "maintMarginRatio": "0.1", - "cum": "52775.0" + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1450.0" } }, { "tier": 6.0, "symbol": "AEVO/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 2500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "6", - "initialLeverage": "4", - "notionalCap": "2500000", - "notionalFloor": "2000000", - "maintMarginRatio": "0.125", - "cum": "102775.0" + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "13950.0" } }, { "tier": 7.0, "symbol": "AEVO/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "7", - "initialLeverage": "2", - "notionalCap": "5000000", - "notionalFloor": "2500000", - "maintMarginRatio": "0.25", - "cum": "415275.0" + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "26450.0" } }, { "tier": 8.0, "symbol": "AEVO/USDT:USDT", "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1667", + "cum": "68150.0" + } + }, + { + "tier": 9.0, + "symbol": "AEVO/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.25", + "cum": "318050.0" + } + }, + { + "tier": 10.0, + "symbol": "AEVO/USDT:USDT", + "currency": "USDT", "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "10000000", + "notionalCap": "8000000", "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1665275.0" + "cum": "1568050.0" } } ], @@ -4398,15 +4723,15 @@ "symbol": "AI/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 4000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "25", + "notionalCap": "4000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, @@ -4414,72 +4739,89 @@ "tier": 2.0, "symbol": "AI/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 4000.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "initialLeverage": "20", + "notionalCap": "5000", + "notionalFloor": "4000", + "maintMarginRatio": "0.015", + "cum": "20.0" } }, { "tier": 3.0, "symbol": "AI/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 80000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "80000", - "notionalFloor": "25000", - "maintMarginRatio": "0.025", - "cum": "150.0" + "initialLeverage": "10", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "45.0" } }, { "tier": 4.0, "symbol": "AI/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 800000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 25000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "800000", - "notionalFloor": "80000", - "maintMarginRatio": "0.05", - "cum": "2150.0" + "initialLeverage": "7", + "notionalCap": "80000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "170.0" } }, { "tier": 5.0, "symbol": "AI/USDT:USDT", "currency": "USDT", + "minNotional": 80000.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, + "info": { + "bracket": "5", + "initialLeverage": "6", + "notionalCap": "800000", + "notionalFloor": "80000", + "maintMarginRatio": "0.05", + "cum": "2170.0" + } + }, + { + "tier": 6.0, + "symbol": "AI/USDT:USDT", + "currency": "USDT", "minNotional": 800000.0, "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", "notionalCap": "1600000", "notionalFloor": "800000", "maintMarginRatio": "0.1", - "cum": "42150.0" + "cum": "42170.0" } }, { - "tier": 6.0, + "tier": 7.0, "symbol": "AI/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, @@ -4487,46 +4829,63 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", "notionalCap": "2000000", "notionalFloor": "1600000", "maintMarginRatio": "0.125", - "cum": "82150.0" - } - }, - { - "tier": 7.0, - "symbol": "AI/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" + "cum": "82170.0" } }, { "tier": 8.0, "symbol": "AI/USDT:USDT", "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.1667", + "cum": "165570.0" + } + }, + { + "tier": 9.0, + "symbol": "AI/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "4000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.25", + "cum": "415470.0" + } + }, + { + "tier": 10.0, + "symbol": "AI/USDT:USDT", + "currency": "USDT", "minNotional": 4000000.0, "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "10", "initialLeverage": "1", "notionalCap": "8000000", "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "1332150.0" + "cum": "1415470.0" } } ], @@ -4538,10 +4897,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -4555,10 +4914,10 @@ "minNotional": 5000.0, "maxNotional": 16000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "16000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -4572,10 +4931,10 @@ "minNotional": 16000.0, "maxNotional": 80000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 15.0, + "maxLeverage": 7.0, "info": { "bracket": "3", - "initialLeverage": "15", + "initialLeverage": "7", "notionalCap": "80000", "notionalFloor": "16000", "maintMarginRatio": "0.02", @@ -4589,10 +4948,10 @@ "minNotional": 80000.0, "maxNotional": 160000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "160000", "notionalFloor": "80000", "maintMarginRatio": "0.025", @@ -4606,10 +4965,10 @@ "minNotional": 160000.0, "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "8", + "initialLeverage": "5", "notionalCap": "800000", "notionalFloor": "160000", "maintMarginRatio": "0.05", @@ -4623,10 +4982,10 @@ "minNotional": 800000.0, "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1600000", "notionalFloor": "800000", "maintMarginRatio": "0.1", @@ -4640,10 +4999,10 @@ "minNotional": 1600000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "2000000", "notionalFloor": "1600000", "maintMarginRatio": "0.125", @@ -4685,6 +5044,161 @@ } } ], + "AIOT/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "AIOT/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": "AIOT/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "AIOT/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "AIOT/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "125000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1325.0" + } + }, + { + "tier": 5.0, + "symbol": "AIOT/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.1", + "cum": "7575.0" + } + }, + { + "tier": 6.0, + "symbol": "AIOT/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "13825.0" + } + }, + { + "tier": 7.0, + "symbol": "AIOT/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "1500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34675.0" + } + }, + { + "tier": 8.0, + "symbol": "AIOT/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.25", + "cum": "159625.0" + } + }, + { + "tier": 9.0, + "symbol": "AIOT/USDT:USDT", + "currency": "USDT", + "minNotional": 2500000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "4000000", + "notionalFloor": "2500000", + "maintMarginRatio": "0.5", + "cum": "784625.0" + } + } + ], "AIXBT/USDT:USDT": [ { "tier": 1.0, @@ -5003,10 +5517,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -5020,10 +5534,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "8", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -5037,10 +5551,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 15.0, + "maxLeverage": 7.0, "info": { "bracket": "3", - "initialLeverage": "15", + "initialLeverage": "7", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -5054,10 +5568,10 @@ "minNotional": 30000.0, "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "60000", "notionalFloor": "30000", "maintMarginRatio": "0.025", @@ -5071,10 +5585,10 @@ "minNotional": 60000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "8", + "initialLeverage": "5", "notionalCap": "300000", "notionalFloor": "60000", "maintMarginRatio": "0.05", @@ -5088,10 +5602,10 @@ "minNotional": 300000.0, "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "600000", "notionalFloor": "300000", "maintMarginRatio": "0.1", @@ -5105,10 +5619,10 @@ "minNotional": 600000.0, "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "750000", "notionalFloor": "600000", "maintMarginRatio": "0.125", @@ -5449,15 +5963,15 @@ "symbol": "ALPACA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 20.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.08, + "maxLeverage": 5.0, "info": { "bracket": "1", - "initialLeverage": "20", - "notionalCap": "5000", + "initialLeverage": "5", + "notionalCap": "100000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.08", "cum": "0.0" } }, @@ -5465,123 +5979,55 @@ "tier": 2.0, "symbol": "ALPACA/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 15.0, + "minNotional": 100000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 4.0, "info": { "bracket": "2", - "initialLeverage": "15", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.015", - "cum": "25.0" + "initialLeverage": "4", + "notionalCap": "200000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1", + "cum": "2000.0" } }, { "tier": 3.0, "symbol": "ALPACA/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 10.0, + "minNotional": 200000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 3.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.02", - "cum": "75.0" + "initialLeverage": "3", + "notionalCap": "400000", + "notionalFloor": "200000", + "maintMarginRatio": "0.125", + "cum": "7000.0" } }, { "tier": 4.0, "symbol": "ALPACA/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 40000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, - "info": { - "bracket": "4", - "initialLeverage": "8", - "notionalCap": "40000", - "notionalFloor": "20000", - "maintMarginRatio": "0.025", - "cum": "175.0" - } - }, - { - "tier": 5.0, - "symbol": "ALPACA/USDT:USDT", - "currency": "USDT", - "minNotional": 40000.0, - "maxNotional": 200000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, - "info": { - "bracket": "5", - "initialLeverage": "6", - "notionalCap": "200000", - "notionalFloor": "40000", - "maintMarginRatio": "0.05", - "cum": "1175.0" - } - }, - { - "tier": 6.0, - "symbol": "ALPACA/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": "ALPACA/USDT:USDT", - "currency": "USDT", "minNotional": 400000.0, - "maxNotional": 450000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "7", - "initialLeverage": "4", - "notionalCap": "450000", - "notionalFloor": "400000", - "maintMarginRatio": "0.125", - "cum": "21175.0" - } - }, - { - "tier": 8.0, - "symbol": "ALPACA/USDT:USDT", - "currency": "USDT", - "minNotional": 450000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "4", "initialLeverage": "2", "notionalCap": "500000", - "notionalFloor": "450000", + "notionalFloor": "400000", "maintMarginRatio": "0.25", - "cum": "77425.0" + "cum": "57000.0" } }, { - "tier": 9.0, + "tier": 5.0, "symbol": "ALPACA/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, @@ -5589,12 +6035,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "5", "initialLeverage": "1", "notionalCap": "550000", "notionalFloor": "500000", "maintMarginRatio": "0.5", - "cum": "202425.0" + "cum": "182000.0" } } ], @@ -5744,10 +6190,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -5761,10 +6207,10 @@ "minNotional": 5000.0, "maxNotional": 16000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "16000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -5778,10 +6224,10 @@ "minNotional": 16000.0, "maxNotional": 80000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 7.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "7", "notionalCap": "80000", "notionalFloor": "16000", "maintMarginRatio": "0.02", @@ -5795,10 +6241,10 @@ "minNotional": 80000.0, "maxNotional": 160000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "160000", "notionalFloor": "80000", "maintMarginRatio": "0.025", @@ -5812,10 +6258,10 @@ "minNotional": 160000.0, "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "800000", "notionalFloor": "160000", "maintMarginRatio": "0.05", @@ -5829,10 +6275,10 @@ "minNotional": 800000.0, "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1600000", "notionalFloor": "800000", "maintMarginRatio": "0.1", @@ -5846,10 +6292,10 @@ "minNotional": 1600000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "2000000", "notionalFloor": "1600000", "maintMarginRatio": "0.125", @@ -5897,15 +6343,15 @@ "symbol": "AMB/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 10.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 8.0, "info": { "bracket": "1", - "initialLeverage": "10", - "notionalCap": "5000", + "initialLeverage": "8", + "notionalCap": "25000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.025", "cum": "0.0" } }, @@ -5913,38 +6359,21 @@ "tier": 2.0, "symbol": "AMB/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": "AMB/USDT:USDT", - "currency": "USDT", "minNotional": 25000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 6.0, "info": { - "bracket": "3", + "bracket": "2", "initialLeverage": "6", "notionalCap": "200000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "625.0" } }, { - "tier": 4.0, + "tier": 3.0, "symbol": "AMB/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, @@ -5952,63 +6381,63 @@ "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "5", "notionalCap": "500000", "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "10650.0" + "cum": "10625.0" + } + }, + { + "tier": 4.0, + "symbol": "AMB/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "4", + "initialLeverage": "4", + "notionalCap": "600000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "23125.0" } }, { "tier": 5.0, "symbol": "AMB/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 600000.0, + "maxNotional": 700000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "1000000", - "notionalFloor": "500000", - "maintMarginRatio": "0.125", - "cum": "23150.0" + "initialLeverage": "2", + "notionalCap": "700000", + "notionalFloor": "600000", + "maintMarginRatio": "0.25", + "cum": "98125.0" } }, { "tier": 6.0, "symbol": "AMB/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": "AMB/USDT:USDT", - "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3500000.0, + "minNotional": 700000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "3500000", - "notionalFloor": "3000000", + "notionalCap": "1000000", + "notionalFloor": "700000", "maintMarginRatio": "0.5", - "cum": "898150.0" + "cum": "273125.0" } } ], @@ -6296,10 +6725,10 @@ "minNotional": 0.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.0065, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "25000", "notionalFloor": "0", "maintMarginRatio": "0.0065", @@ -6313,10 +6742,10 @@ "minNotional": 25000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "50000", "notionalFloor": "25000", "maintMarginRatio": "0.01", @@ -6330,10 +6759,10 @@ "minNotional": 50000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 40.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "40", + "initialLeverage": "8", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.015", @@ -6347,10 +6776,10 @@ "minNotional": 100000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "25", + "initialLeverage": "7", "notionalCap": "500000", "notionalFloor": "100000", "maintMarginRatio": "0.02", @@ -6364,10 +6793,10 @@ "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.025", @@ -6381,10 +6810,10 @@ "minNotional": 1000000.0, "maxNotional": 3000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "6", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "3000000", "notionalFloor": "1000000", "maintMarginRatio": "0.05", @@ -6398,10 +6827,10 @@ "minNotional": 3000000.0, "maxNotional": 4000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "7", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "4000000", "notionalFloor": "3000000", "maintMarginRatio": "0.1", @@ -6415,10 +6844,10 @@ "minNotional": 4000000.0, "maxNotional": 5000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "5000000", "notionalFloor": "4000000", "maintMarginRatio": "0.125", @@ -6468,10 +6897,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.015", @@ -6485,10 +6914,10 @@ "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", @@ -6502,10 +6931,10 @@ "minNotional": 25000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "100000", "notionalFloor": "25000", "maintMarginRatio": "0.05", @@ -6519,10 +6948,10 @@ "minNotional": 100000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.06, - "maxLeverage": 8.0, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "8", + "initialLeverage": "5", "notionalCap": "500000", "notionalFloor": "100000", "maintMarginRatio": "0.06", @@ -6536,10 +6965,10 @@ "minNotional": 500000.0, "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1600000", "notionalFloor": "500000", "maintMarginRatio": "0.1", @@ -6553,10 +6982,10 @@ "minNotional": 1600000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "6", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "2000000", "notionalFloor": "1600000", "maintMarginRatio": "0.125", @@ -6689,13 +7118,13 @@ "symbol": "APT/USDT:USDT", "currency": "USDT", "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "maxNotional": 7000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "10000000", + "notionalCap": "7000000", "notionalFloor": "5000000", "maintMarginRatio": "0.1", "cum": "282550.0" @@ -6705,51 +7134,51 @@ "tier": 7.0, "symbol": "APT/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 12500000.0, + "minNotional": 7000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "12500000", - "notionalFloor": "10000000", + "notionalCap": "8000000", + "notionalFloor": "7000000", "maintMarginRatio": "0.125", - "cum": "532550.0" + "cum": "457550.0" } }, { "tier": 8.0, "symbol": "APT/USDT:USDT", "currency": "USDT", - "minNotional": 12500000.0, - "maxNotional": 25000000.0, + "minNotional": 8000000.0, + "maxNotional": 9000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "25000000", - "notionalFloor": "12500000", + "notionalCap": "9000000", + "notionalFloor": "8000000", "maintMarginRatio": "0.25", - "cum": "2095050.0" + "cum": "1457550.0" } }, { "tier": 9.0, "symbol": "APT/USDT:USDT", "currency": "USDT", - "minNotional": 25000000.0, - "maxNotional": 50000000.0, + "minNotional": 9000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "25000000", + "notionalCap": "10000000", + "notionalFloor": "9000000", "maintMarginRatio": "0.5", - "cum": "8345050.0" + "cum": "3707550.0" } } ], @@ -6761,10 +7190,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -6778,10 +7207,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -6795,10 +7224,10 @@ "minNotional": 20000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "8", "notionalCap": "100000", "notionalFloor": "20000", "maintMarginRatio": "0.02", @@ -6812,10 +7241,10 @@ "minNotional": 100000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "7", "notionalCap": "200000", "notionalFloor": "100000", "maintMarginRatio": "0.025", @@ -6829,10 +7258,10 @@ "minNotional": 200000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "1000000", "notionalFloor": "200000", "maintMarginRatio": "0.05", @@ -6878,33 +7307,50 @@ "symbol": "AR/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maxNotional": 3750000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "5000000", + "initialLeverage": "3", + "notionalCap": "3750000", "notionalFloor": "2500000", - "maintMarginRatio": "0.25", - "cum": "418150.0" + "maintMarginRatio": "0.1667", + "cum": "209900.0" } }, { "tier": 9.0, "symbol": "AR/USDT:USDT", "currency": "USDT", + "minNotional": 3750000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3750000", + "maintMarginRatio": "0.25", + "cum": "522275.0" + } + }, + { + "tier": 10.0, + "symbol": "AR/USDT:USDT", + "currency": "USDT", "minNotional": 5000000.0, "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", "notionalCap": "10000000", "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1668150.0" + "cum": "1772275.0" } } ], @@ -7345,12 +7791,150 @@ "symbol": "ARK/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 10.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 8.0, "info": { "bracket": "1", - "initialLeverage": "10", + "initialLeverage": "8", + "notionalCap": "20000", + "notionalFloor": "0", + "maintMarginRatio": "0.02", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "ARK/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 40000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 7.0, + "info": { + "bracket": "2", + "initialLeverage": "7", + "notionalCap": "40000", + "notionalFloor": "20000", + "maintMarginRatio": "0.025", + "cum": "100.0" + } + }, + { + "tier": 3.0, + "symbol": "ARK/USDT:USDT", + "currency": "USDT", + "minNotional": 40000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, + "info": { + "bracket": "3", + "initialLeverage": "6", + "notionalCap": "200000", + "notionalFloor": "40000", + "maintMarginRatio": "0.05", + "cum": "1100.0" + } + }, + { + "tier": 4.0, + "symbol": "ARK/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": "11100.0" + } + }, + { + "tier": 5.0, + "symbol": "ARK/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": "23600.0" + } + }, + { + "tier": 6.0, + "symbol": "ARK/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "6", + "initialLeverage": "3", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1667", + "cum": "65300.0" + } + }, + { + "tier": 7.0, + "symbol": "ARK/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "3000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.25", + "cum": "231900.0" + } + }, + { + "tier": 8.0, + "symbol": "ARK/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 3500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "3500000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.5", + "cum": "981900.0" + } + } + ], + "ARKM/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "ARKM/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", @@ -7359,15 +7943,15 @@ }, { "tier": 2.0, - "symbol": "ARK/USDT:USDT", + "symbol": "ARKM/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 9.0, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "9", + "initialLeverage": "50", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -7376,16 +7960,16 @@ }, { "tier": 3.0, - "symbol": "ARK/USDT:USDT", + "symbol": "ARKM/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 8.0, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "8", - "notionalCap": "20000", + "initialLeverage": "25", + "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -7393,43 +7977,43 @@ }, { "tier": 4.0, - "symbol": "ARK/USDT:USDT", + "symbol": "ARKM/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 40000.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 7.0, + "maxLeverage": 20.0, "info": { "bracket": "4", - "initialLeverage": "7", - "notionalCap": "40000", - "notionalFloor": "20000", + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "25000", "maintMarginRatio": "0.025", - "cum": "175.0" + "cum": "200.0" } }, { "tier": 5.0, - "symbol": "ARK/USDT:USDT", + "symbol": "ARKM/USDT:USDT", "currency": "USDT", - "minNotional": 40000.0, - "maxNotional": 200000.0, + "minNotional": 50000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, + "maxLeverage": 10.0, "info": { "bracket": "5", - "initialLeverage": "6", - "notionalCap": "200000", - "notionalFloor": "40000", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "50000", "maintMarginRatio": "0.05", - "cum": "1175.0" + "cum": "1450.0" } }, { "tier": 6.0, - "symbol": "ARK/USDT:USDT", + "symbol": "ARKM/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, + "minNotional": 250000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, @@ -7437,14 +8021,14 @@ "bracket": "6", "initialLeverage": "5", "notionalCap": "500000", - "notionalFloor": "200000", + "notionalFloor": "250000", "maintMarginRatio": "0.1", - "cum": "11175.0" + "cum": "13950.0" } }, { "tier": 7.0, - "symbol": "ARK/USDT:USDT", + "symbol": "ARKM/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, @@ -7456,196 +8040,58 @@ "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "23675.0" + "cum": "26450.0" } }, { "tier": 8.0, - "symbol": "ARK/USDT:USDT", + "symbol": "ARKM/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, "maxNotional": 3000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", + "initialLeverage": "3", "notionalCap": "3000000", "notionalFloor": "1000000", - "maintMarginRatio": "0.25", - "cum": "148675.0" + "maintMarginRatio": "0.1667", + "cum": "68150.0" } }, { "tier": 9.0, - "symbol": "ARK/USDT:USDT", - "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3500000.0, - "maintenanceMarginRate": 0.5, - "maxLeverage": 1.0, - "info": { - "bracket": "9", - "initialLeverage": "1", - "notionalCap": "3500000", - "notionalFloor": "3000000", - "maintMarginRatio": "0.5", - "cum": "898675.0" - } - } - ], - "ARKM/USDT:USDT": [ - { - "tier": 1.0, - "symbol": "ARKM/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": "ARKM/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": "ARKM/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": "ARKM/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": "ARKM/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": "ARKM/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": "ARKM/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": "ARKM/USDT:USDT", - "currency": "USDT", - "minNotional": 3750000.0, - "maxNotional": 7500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "3750000", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.25", - "cum": "627200.0" + "cum": "318050.0" } }, { - "tier": 9.0, + "tier": 10.0, "symbol": "ARKM/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 5000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "8000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "2502200.0" + "cum": "1568050.0" } } ], @@ -7674,10 +8120,10 @@ "minNotional": 5000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "15", + "initialLeverage": "10", "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", @@ -7691,10 +8137,10 @@ "minNotional": 25000.0, "maxNotional": 600000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "600000", "notionalFloor": "25000", "maintMarginRatio": "0.05", @@ -7708,10 +8154,10 @@ "minNotional": 600000.0, "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "4", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1600000", "notionalFloor": "600000", "maintMarginRatio": "0.1", @@ -7725,10 +8171,10 @@ "minNotional": 1600000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "5", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "2000000", "notionalFloor": "1600000", "maintMarginRatio": "0.125", @@ -8012,6 +8458,144 @@ } } ], + "ATH/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "ATH/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": "ATH/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": "ATH/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": "ATH/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": "ATH/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": "ATH/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": "ATH/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": "ATH/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" + } + } + ], "ATOM/USDT:USDT": [ { "tier": 1.0, @@ -8192,10 +8776,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.015", @@ -8209,10 +8793,10 @@ "minNotional": 5000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "8", "notionalCap": "20000", "notionalFloor": "5000", "maintMarginRatio": "0.02", @@ -8226,10 +8810,10 @@ "minNotional": 20000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "30000", "notionalFloor": "20000", "maintMarginRatio": "0.025", @@ -8243,10 +8827,10 @@ "minNotional": 30000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "300000", "notionalFloor": "30000", "maintMarginRatio": "0.05", @@ -8260,10 +8844,10 @@ "minNotional": 300000.0, "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "600000", "notionalFloor": "300000", "maintMarginRatio": "0.1", @@ -8277,10 +8861,10 @@ "minNotional": 600000.0, "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "6", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "750000", "notionalFloor": "600000", "maintMarginRatio": "0.125", @@ -8309,13 +8893,13 @@ "symbol": "AUCTION/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "3000000", + "notionalCap": "2000000", "notionalFloor": "1500000", "maintMarginRatio": "0.5", "cum": "499625.0" @@ -9103,15 +9687,15 @@ "symbol": "AXS/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.006, - "maxLeverage": 50.0, + "maxNotional": 8600.0, + "maintenanceMarginRate": 0.0067, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "20", + "notionalCap": "8600", "notionalFloor": "0", - "maintMarginRatio": "0.006", + "maintMarginRatio": "0.0067", "cum": "0.0" } }, @@ -9119,160 +9703,332 @@ "tier": 2.0, "symbol": "AXS/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.007, - "maxLeverage": 30.0, + "minNotional": 8600.0, + "maxNotional": 163000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "30", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.007", - "cum": "5.0" + "initialLeverage": "10", + "notionalCap": "163000", + "notionalFloor": "8600", + "maintMarginRatio": "0.01", + "cum": "28.38" } }, { "tier": 3.0, "symbol": "AXS/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 400000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "minNotional": 163000.0, + "maxNotional": 206000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 9.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "400000", - "notionalFloor": "25000", - "maintMarginRatio": "0.01", - "cum": "80.0" + "initialLeverage": "9", + "notionalCap": "206000", + "notionalFloor": "163000", + "maintMarginRatio": "0.015", + "cum": "843.38" } }, { "tier": 4.0, "symbol": "AXS/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 600000.0, + "minNotional": 206000.0, + "maxNotional": 255000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maxLeverage": 8.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "400000", + "initialLeverage": "8", + "notionalCap": "255000", + "notionalFloor": "206000", "maintMarginRatio": "0.02", - "cum": "4080.0" + "cum": "1873.38" } }, { "tier": 5.0, "symbol": "AXS/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 1200000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 255000.0, + "maxNotional": 390000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 7.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "1200000", - "notionalFloor": "600000", - "maintMarginRatio": "0.05", - "cum": "22080.0" + "initialLeverage": "7", + "notionalCap": "390000", + "notionalFloor": "255000", + "maintMarginRatio": "0.025", + "cum": "3148.38" } }, { "tier": 6.0, "symbol": "AXS/USDT:USDT", "currency": "USDT", - "minNotional": 1200000.0, - "maxNotional": 3200000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 390000.0, + "maxNotional": 630000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, "info": { "bracket": "6", - "initialLeverage": "5", - "notionalCap": "3200000", - "notionalFloor": "1200000", - "maintMarginRatio": "0.1", - "cum": "82080.0" + "initialLeverage": "6", + "notionalCap": "630000", + "notionalFloor": "390000", + "maintMarginRatio": "0.05", + "cum": "12898.38" } }, { "tier": 7.0, "symbol": "AXS/USDT:USDT", "currency": "USDT", - "minNotional": 3200000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 630000.0, + "maxNotional": 1100000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "5000000", - "notionalFloor": "3200000", - "maintMarginRatio": "0.125", - "cum": "162080.0" + "initialLeverage": "5", + "notionalCap": "1100000", + "notionalFloor": "630000", + "maintMarginRatio": "0.1", + "cum": "44398.38" } }, { "tier": 8.0, "symbol": "AXS/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, - "maintenanceMarginRate": 0.15, - "maxLeverage": 3.0, + "minNotional": 1100000.0, + "maxNotional": 1600000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "8", - "initialLeverage": "3", - "notionalCap": "10000000", - "notionalFloor": "5000000", - "maintMarginRatio": "0.15", - "cum": "287080.0" + "initialLeverage": "4", + "notionalCap": "1600000", + "notionalFloor": "1100000", + "maintMarginRatio": "0.125", + "cum": "71898.38" } }, { "tier": 9.0, "symbol": "AXS/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 15000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 1600000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "9", - "initialLeverage": "2", - "notionalCap": "15000000", - "notionalFloor": "10000000", - "maintMarginRatio": "0.25", - "cum": "1287080.0" + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "1600000", + "maintMarginRatio": "0.1667", + "cum": "138618.38" } }, { "tier": 10.0, "symbol": "AXS/USDT:USDT", "currency": "USDT", - "minNotional": 15000000.0, - "maxNotional": 20000000.0, + "minNotional": 3000000.0, + "maxNotional": 4400000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "10", + "initialLeverage": "2", + "notionalCap": "4400000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.25", + "cum": "388518.38" + } + }, + { + "tier": 11.0, + "symbol": "AXS/USDT:USDT", + "currency": "USDT", + "minNotional": 4400000.0, + "maxNotional": 6400000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "11", "initialLeverage": "1", - "notionalCap": "20000000", - "notionalFloor": "15000000", + "notionalCap": "6400000", + "notionalFloor": "4400000", "maintMarginRatio": "0.5", - "cum": "5037080.0" + "cum": "1488518.38" } } ], - "BADGER/USDT:USDT": [ + "B3/USDT:USDT": [ { "tier": 1.0, - "symbol": "BADGER/USDT:USDT", + "symbol": "B3/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 25.0, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "B3/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "B3/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 15.0, + "info": { + "bracket": "3", + "initialLeverage": "15", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "B3/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "B3/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 8.0, + "info": { + "bracket": "5", + "initialLeverage": "8", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "B3/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": "B3/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": "B3/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": "B3/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" + } + } + ], + "BABY/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "BABY/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -9287,6 +10043,144 @@ "cum": "0.0" } }, + { + "tier": 2.0, + "symbol": "BABY/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "125000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "BABY/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 150000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "150000", + "notionalFloor": "125000", + "maintMarginRatio": "0.025", + "cum": "650.0" + } + }, + { + "tier": 4.0, + "symbol": "BABY/USDT:USDT", + "currency": "USDT", + "minNotional": 150000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "4400.0" + } + }, + { + "tier": 5.0, + "symbol": "BABY/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 1250000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "1250000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "19400.0" + } + }, + { + "tier": 6.0, + "symbol": "BABY/USDT:USDT", + "currency": "USDT", + "minNotional": 1250000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "1500000", + "notionalFloor": "1250000", + "maintMarginRatio": "0.125", + "cum": "50650.0" + } + }, + { + "tier": 7.0, + "symbol": "BABY/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "2000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.25", + "cum": "238150.0" + } + }, + { + "tier": 8.0, + "symbol": "BABY/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "2500000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.5", + "cum": "738150.0" + } + } + ], + "BADGER/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "BADGER/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 10.0, + "info": { + "bracket": "1", + "initialLeverage": "10", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.015", + "cum": "0.0" + } + }, { "tier": 2.0, "symbol": "BADGER/USDT:USDT", @@ -9294,10 +10188,10 @@ "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", @@ -9311,10 +10205,10 @@ "minNotional": 25000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "100000", "notionalFloor": "25000", "maintMarginRatio": "0.05", @@ -9621,15 +10515,15 @@ "symbol": "BAN/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 10.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 8.0, "info": { "bracket": "1", - "initialLeverage": "10", - "notionalCap": "10000", + "initialLeverage": "8", + "notionalCap": "30000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.015", "cum": "0.0" } }, @@ -9637,136 +10531,119 @@ "tier": 2.0, "symbol": "BAN/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 30000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 9.0, + "minNotional": 30000.0, + "maxNotional": 150000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 7.0, "info": { "bracket": "2", - "initialLeverage": "9", - "notionalCap": "30000", - "notionalFloor": "10000", - "maintMarginRatio": "0.015", - "cum": "50.0" + "initialLeverage": "7", + "notionalCap": "150000", + "notionalFloor": "30000", + "maintMarginRatio": "0.02", + "cum": "150.0" } }, { "tier": 3.0, "symbol": "BAN/USDT:USDT", "currency": "USDT", - "minNotional": 30000.0, - "maxNotional": 150000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 8.0, + "minNotional": 150000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "8", - "notionalCap": "150000", - "notionalFloor": "30000", - "maintMarginRatio": "0.02", - "cum": "200.0" + "initialLeverage": "6", + "notionalCap": "300000", + "notionalFloor": "150000", + "maintMarginRatio": "0.025", + "cum": "900.0" } }, { "tier": 4.0, "symbol": "BAN/USDT:USDT", "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 300000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 7.0, + "minNotional": 300000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "7", - "notionalCap": "300000", - "notionalFloor": "150000", - "maintMarginRatio": "0.025", - "cum": "950.0" + "initialLeverage": "5", + "notionalCap": "1500000", + "notionalFloor": "300000", + "maintMarginRatio": "0.05", + "cum": "8400.0" } }, { "tier": 5.0, "symbol": "BAN/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 1500000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, + "minNotional": 1500000.0, + "maxNotional": 1700000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "6", - "notionalCap": "1500000", - "notionalFloor": "300000", - "maintMarginRatio": "0.05", - "cum": "8450.0" + "initialLeverage": "4", + "notionalCap": "1700000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.1", + "cum": "83400.0" } }, { "tier": 6.0, "symbol": "BAN/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 1700000.0, + "maxNotional": 1800000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 3.0, "info": { "bracket": "6", - "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "1500000", - "maintMarginRatio": "0.1", - "cum": "83450.0" + "initialLeverage": "3", + "notionalCap": "1800000", + "notionalFloor": "1700000", + "maintMarginRatio": "0.125", + "cum": "125900.0" } }, { "tier": 7.0, "symbol": "BAN/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 1800000.0, + "maxNotional": 1900000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "3500000", - "notionalFloor": "3000000", - "maintMarginRatio": "0.125", - "cum": "158450.0" + "initialLeverage": "2", + "notionalCap": "1900000", + "notionalFloor": "1800000", + "maintMarginRatio": "0.25", + "cum": "350900.0" } }, { "tier": 8.0, "symbol": "BAN/USDT:USDT", "currency": "USDT", - "minNotional": 3500000.0, - "maxNotional": 4000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "8", - "initialLeverage": "2", - "notionalCap": "4000000", - "notionalFloor": "3500000", - "maintMarginRatio": "0.25", - "cum": "595950.0" - } - }, - { - "tier": 9.0, - "symbol": "BAN/USDT:USDT", - "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 4100000.0, + "minNotional": 1900000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", - "notionalCap": "4100000", - "notionalFloor": "4000000", + "notionalCap": "2000000", + "notionalFloor": "1900000", "maintMarginRatio": "0.5", - "cum": "1595950.0" + "cum": "825900.0" } } ], @@ -9778,10 +10655,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -9795,10 +10672,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -9812,10 +10689,10 @@ "minNotional": 10000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -9829,10 +10706,10 @@ "minNotional": 50000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.025", @@ -9846,10 +10723,10 @@ "minNotional": 100000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "500000", "notionalFloor": "100000", "maintMarginRatio": "0.05", @@ -9863,10 +10740,10 @@ "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.1", @@ -9880,10 +10757,10 @@ "minNotional": 1000000.0, "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "1250000", "notionalFloor": "1000000", "maintMarginRatio": "0.125", @@ -9925,6 +10802,127 @@ } } ], + "BANANAS31/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "BANANAS31/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": "BANANAS31/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": "BANANAS31/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": "BANANAS31/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": "BANANAS31/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "23150.0" + } + }, + { + "tier": 6.0, + "symbol": "BANANAS31/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "116900.0" + } + }, + { + "tier": 7.0, + "symbol": "BANANAS31/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "491900.0" + } + } + ], "BAND/USDT:USDT": [ { "tier": 1.0, @@ -10063,6 +11061,161 @@ } } ], + "BANK/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "BANK/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": "BANK/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "BANK/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "BANK/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "125000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1325.0" + } + }, + { + "tier": 5.0, + "symbol": "BANK/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.1", + "cum": "7575.0" + } + }, + { + "tier": 6.0, + "symbol": "BANK/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "13825.0" + } + }, + { + "tier": 7.0, + "symbol": "BANK/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "1500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34675.0" + } + }, + { + "tier": 8.0, + "symbol": "BANK/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.25", + "cum": "159625.0" + } + }, + { + "tier": 9.0, + "symbol": "BANK/USDT:USDT", + "currency": "USDT", + "minNotional": 2500000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "4000000", + "notionalFloor": "2500000", + "maintMarginRatio": "0.5", + "cum": "784625.0" + } + } + ], "BAT/USDT:USDT": [ { "tier": 1.0, @@ -10207,15 +11360,15 @@ "symbol": "BB/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 4000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "25", + "notionalCap": "4000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, @@ -10223,72 +11376,89 @@ "tier": 2.0, "symbol": "BB/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 4000.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "initialLeverage": "20", + "notionalCap": "5000", + "notionalFloor": "4000", + "maintMarginRatio": "0.015", + "cum": "20.0" } }, { "tier": 3.0, "symbol": "BB/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 80000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "80000", - "notionalFloor": "25000", - "maintMarginRatio": "0.025", - "cum": "150.0" + "initialLeverage": "10", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "45.0" } }, { "tier": 4.0, "symbol": "BB/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 800000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 25000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "800000", - "notionalFloor": "80000", - "maintMarginRatio": "0.05", - "cum": "2150.0" + "initialLeverage": "7", + "notionalCap": "80000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "170.0" } }, { "tier": 5.0, "symbol": "BB/USDT:USDT", "currency": "USDT", + "minNotional": 80000.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, + "info": { + "bracket": "5", + "initialLeverage": "6", + "notionalCap": "800000", + "notionalFloor": "80000", + "maintMarginRatio": "0.05", + "cum": "2170.0" + } + }, + { + "tier": 6.0, + "symbol": "BB/USDT:USDT", + "currency": "USDT", "minNotional": 800000.0, "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", "notionalCap": "1600000", "notionalFloor": "800000", "maintMarginRatio": "0.1", - "cum": "42150.0" + "cum": "42170.0" } }, { - "tier": 6.0, + "tier": 7.0, "symbol": "BB/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, @@ -10296,46 +11466,63 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", "notionalCap": "2000000", "notionalFloor": "1600000", "maintMarginRatio": "0.125", - "cum": "82150.0" - } - }, - { - "tier": 7.0, - "symbol": "BB/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" + "cum": "82170.0" } }, { "tier": 8.0, "symbol": "BB/USDT:USDT", "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.1667", + "cum": "165570.0" + } + }, + { + "tier": 9.0, + "symbol": "BB/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "4000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.25", + "cum": "415470.0" + } + }, + { + "tier": 10.0, + "symbol": "BB/USDT:USDT", + "currency": "USDT", "minNotional": 4000000.0, "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "10", "initialLeverage": "1", "notionalCap": "8000000", "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "1332150.0" + "cum": "1415470.0" } } ], @@ -10959,10 +12146,10 @@ } } ], - "BICO/USDT:USDT": [ + "BERA/USDT:USDT": [ { "tier": 1.0, - "symbol": "BICO/USDT:USDT", + "symbol": "BERA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, @@ -10979,7 +12166,7 @@ }, { "tier": 2.0, - "symbol": "BICO/USDT:USDT", + "symbol": "BERA/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -10996,15 +12183,170 @@ }, { "tier": 3.0, - "symbol": "BICO/USDT:USDT", + "symbol": "BERA/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 50000.0, + "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "BERA/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "BERA/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "BERA/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "16725.0" + } + }, + { + "tier": 7.0, + "symbol": "BERA/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "BERA/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "125475.0" + } + }, + { + "tier": 9.0, + "symbol": "BERA/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "500475.0" + } + } + ], + "BICO/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "BICO/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, + "symbol": "BICO/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 15.0, + "info": { + "bracket": "2", + "initialLeverage": "15", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "BICO/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -11018,10 +12360,10 @@ "minNotional": 50000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.025", @@ -11035,10 +12377,10 @@ "minNotional": 100000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "500000", "notionalFloor": "100000", "maintMarginRatio": "0.05", @@ -11052,10 +12394,10 @@ "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.1", @@ -11069,10 +12411,10 @@ "minNotional": 1000000.0, "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "1250000", "notionalFloor": "1000000", "maintMarginRatio": "0.125", @@ -11114,6 +12456,127 @@ } } ], + "BID/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "BID/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": "BID/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 10.0, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "BID/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 5.0, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "200000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "650.0" + } + }, + { + "tier": 4.0, + "symbol": "BID/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 4.0, + "info": { + "bracket": "4", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "200000", + "maintMarginRatio": "0.1", + "cum": "10650.0" + } + }, + { + "tier": 5.0, + "symbol": "BID/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 3.0, + "info": { + "bracket": "5", + "initialLeverage": "3", + "notionalCap": "750000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "23150.0" + } + }, + { + "tier": 6.0, + "symbol": "BID/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "116900.0" + } + }, + { + "tier": 7.0, + "symbol": "BID/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "491900.0" + } + } + ], "BIGTIME/USDT:USDT": [ { "tier": 1.0, @@ -11122,10 +12585,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -11139,10 +12602,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -11156,10 +12619,10 @@ "minNotional": 30000.0, "maxNotional": 150000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 7.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "7", "notionalCap": "150000", "notionalFloor": "30000", "maintMarginRatio": "0.02", @@ -11173,10 +12636,10 @@ "minNotional": 150000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "300000", "notionalFloor": "150000", "maintMarginRatio": "0.025", @@ -11190,10 +12653,10 @@ "minNotional": 300000.0, "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "1500000", "notionalFloor": "300000", "maintMarginRatio": "0.05", @@ -11207,10 +12670,10 @@ "minNotional": 1500000.0, "maxNotional": 3000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "3000000", "notionalFloor": "1500000", "maintMarginRatio": "0.1", @@ -11222,13 +12685,13 @@ "symbol": "BIGTIME/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, - "maxNotional": 3750000.0, + "maxNotional": 3500000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "3750000", + "initialLeverage": "3", + "notionalCap": "3500000", "notionalFloor": "3000000", "maintMarginRatio": "0.125", "cum": "158450.0" @@ -11238,34 +12701,34 @@ "tier": 8.0, "symbol": "BIGTIME/USDT:USDT", "currency": "USDT", - "minNotional": 3750000.0, - "maxNotional": 7500000.0, + "minNotional": 3500000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "3750000", + "notionalCap": "4000000", + "notionalFloor": "3500000", "maintMarginRatio": "0.25", - "cum": "627200.0" + "cum": "595950.0" } }, { "tier": 9.0, "symbol": "BIGTIME/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 4000000.0, + "maxNotional": 4500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "4500000", + "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "2502200.0" + "cum": "1595950.0" } } ], @@ -11430,15 +12893,15 @@ "symbol": "BLUR/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 4000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "25", + "notionalCap": "4000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, @@ -11446,72 +12909,89 @@ "tier": 2.0, "symbol": "BLUR/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 4000.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "initialLeverage": "20", + "notionalCap": "5000", + "notionalFloor": "4000", + "maintMarginRatio": "0.015", + "cum": "20.0" } }, { "tier": 3.0, "symbol": "BLUR/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "100000", - "notionalFloor": "25000", - "maintMarginRatio": "0.025", - "cum": "150.0" + "initialLeverage": "10", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "45.0" } }, { "tier": 4.0, "symbol": "BLUR/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 600000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 25000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "600000", - "notionalFloor": "100000", - "maintMarginRatio": "0.05", - "cum": "2650.0" + "initialLeverage": "7", + "notionalCap": "100000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "170.0" } }, { "tier": 5.0, "symbol": "BLUR/USDT:USDT", "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, + "info": { + "bracket": "5", + "initialLeverage": "6", + "notionalCap": "600000", + "notionalFloor": "100000", + "maintMarginRatio": "0.05", + "cum": "2670.0" + } + }, + { + "tier": 6.0, + "symbol": "BLUR/USDT:USDT", + "currency": "USDT", "minNotional": 600000.0, "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", "notionalCap": "1600000", "notionalFloor": "600000", "maintMarginRatio": "0.1", - "cum": "32650.0" + "cum": "32670.0" } }, { - "tier": 6.0, + "tier": 7.0, "symbol": "BLUR/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, @@ -11519,46 +12999,63 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", "notionalCap": "2000000", "notionalFloor": "1600000", "maintMarginRatio": "0.125", - "cum": "72650.0" - } - }, - { - "tier": 7.0, - "symbol": "BLUR/USDT:USDT", - "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 6000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "6000000", - "notionalFloor": "2000000", - "maintMarginRatio": "0.25", - "cum": "322650.0" + "cum": "72670.0" } }, { "tier": 8.0, "symbol": "BLUR/USDT:USDT", "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "4000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.1667", + "cum": "156070.0" + } + }, + { + "tier": 9.0, + "symbol": "BLUR/USDT:USDT", + "currency": "USDT", + "minNotional": 4000000.0, + "maxNotional": 6000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "6000000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.25", + "cum": "489270.0" + } + }, + { + "tier": 10.0, + "symbol": "BLUR/USDT:USDT", + "currency": "USDT", "minNotional": 6000000.0, "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "10", "initialLeverage": "1", "notionalCap": "10000000", "notionalFloor": "6000000", "maintMarginRatio": "0.5", - "cum": "1822650.0" + "cum": "1989270.0" } } ], @@ -11666,19 +13163,140 @@ } } ], + "BMT/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "BMT/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": "BMT/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": "BMT/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": "BMT/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": "BMT/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "23150.0" + } + }, + { + "tier": 6.0, + "symbol": "BMT/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "116900.0" + } + }, + { + "tier": 7.0, + "symbol": "BMT/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "491900.0" + } + } + ], "BNB/USDC:USDC": [ { "tier": 1.0, "symbol": "BNB/USDC:USDC", "currency": "USDC", "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" @@ -11688,153 +13306,153 @@ "tier": 2.0, "symbol": "BNB/USDC:USDC", "currency": "USDC", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.006, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.01, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.006", - "cum": "5.0" + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "50.0" } }, { "tier": 3.0, "symbol": "BNB/USDC:USDC", "currency": "USDC", - "minNotional": 10000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.01, + "minNotional": 50000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.015, "maxLeverage": 40.0, "info": { "bracket": "3", "initialLeverage": "40", - "notionalCap": "50000", - "notionalFloor": "10000", - "maintMarginRatio": "0.01", - "cum": "45.0" + "notionalCap": "200000", + "notionalFloor": "50000", + "maintMarginRatio": "0.015", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "BNB/USDC:USDC", "currency": "USDC", - "minNotional": 50000.0, - "maxNotional": 250000.0, + "minNotional": 200000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "4", "initialLeverage": "25", - "notionalCap": "250000", - "notionalFloor": "50000", + "notionalCap": "1000000", + "notionalFloor": "200000", "maintMarginRatio": "0.02", - "cum": "545.0" + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "BNB/USDC:USDC", "currency": "USDC", - "minNotional": 250000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "1000000", - "notionalFloor": "250000", - "maintMarginRatio": "0.05", - "cum": "8045.0" + "initialLeverage": "20", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.025", + "cum": "6300.0" } }, { "tier": 6.0, "symbol": "BNB/USDC:USDC", "currency": "USDC", - "minNotional": 1000000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 2000000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "6", - "initialLeverage": "5", - "notionalCap": "5000000", - "notionalFloor": "1000000", - "maintMarginRatio": "0.1", - "cum": "58045.0" + "initialLeverage": "10", + "notionalCap": "10000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.05", + "cum": "56300.0" } }, { "tier": 7.0, "symbol": "BNB/USDC:USDC", "currency": "USDC", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 10000000.0, + "maxNotional": 20000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "10000000", - "notionalFloor": "5000000", - "maintMarginRatio": "0.125", - "cum": "183045.0" + "initialLeverage": "5", + "notionalCap": "20000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.1", + "cum": "556300.0" } }, { "tier": 8.0, "symbol": "BNB/USDC:USDC", "currency": "USDC", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, - "maintenanceMarginRate": 0.15, - "maxLeverage": 3.0, + "minNotional": 20000000.0, + "maxNotional": 25000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "8", - "initialLeverage": "3", - "notionalCap": "20000000", - "notionalFloor": "10000000", - "maintMarginRatio": "0.15", - "cum": "433045.0" + "initialLeverage": "4", + "notionalCap": "25000000", + "notionalFloor": "20000000", + "maintMarginRatio": "0.125", + "cum": "1056300.0" } }, { "tier": 9.0, "symbol": "BNB/USDC:USDC", "currency": "USDC", - "minNotional": 20000000.0, - "maxNotional": 30000000.0, + "minNotional": 25000000.0, + "maxNotional": 50000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "30000000", - "notionalFloor": "20000000", + "notionalCap": "50000000", + "notionalFloor": "25000000", "maintMarginRatio": "0.25", - "cum": "2433045.0" + "cum": "4181300.0" } }, { "tier": 10.0, "symbol": "BNB/USDC:USDC", "currency": "USDC", - "minNotional": 30000000.0, - "maxNotional": 50000000.0, + "minNotional": 50000000.0, + "maxNotional": 100000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "30000000", + "notionalCap": "100000000", + "notionalFloor": "50000000", "maintMarginRatio": "0.5", - "cum": "9933045.0" + "cum": "16681300.0" } } ], @@ -12137,15 +13755,15 @@ "symbol": "BNX/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 26.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 5.0, "info": { "bracket": "1", - "initialLeverage": "26", - "notionalCap": "10000", + "initialLeverage": "5", + "notionalCap": "1000000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -12153,136 +13771,68 @@ "tier": 2.0, "symbol": "BNX/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 25.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 4.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.015", - "cum": "50.0" + "initialLeverage": "4", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1", + "cum": "50000.0" } }, { "tier": 3.0, "symbol": "BNX/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "minNotional": 2000000.0, + "maxNotional": 2200000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 3.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "100000", - "notionalFloor": "20000", - "maintMarginRatio": "0.02", - "cum": "150.0" + "initialLeverage": "3", + "notionalCap": "2200000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "100000.0" } }, { "tier": 4.0, "symbol": "BNX/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 200000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "minNotional": 2200000.0, + "maxNotional": 2300000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "4", - "initialLeverage": "15", - "notionalCap": "200000", - "notionalFloor": "100000", - "maintMarginRatio": "0.025", - "cum": "650.0" + "initialLeverage": "2", + "notionalCap": "2300000", + "notionalFloor": "2200000", + "maintMarginRatio": "0.25", + "cum": "375000.0" } }, { "tier": 5.0, "symbol": "BNX/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": "BNX/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": "BNX/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": "BNX/USDT:USDT", - "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 3000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "8", - "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "2500000", - "maintMarginRatio": "0.25", - "cum": "418150.0" - } - }, - { - "tier": 9.0, - "symbol": "BNX/USDT:USDT", - "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3500000.0, + "minNotional": 2300000.0, + "maxNotional": 2400000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "5", "initialLeverage": "1", - "notionalCap": "3500000", - "notionalFloor": "3000000", + "notionalCap": "2400000", + "notionalFloor": "2300000", "maintMarginRatio": "0.5", - "cum": "1168150.0" + "cum": "950000.0" } } ], @@ -12294,10 +13844,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -12311,10 +13861,10 @@ "minNotional": 5000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "50000", "notionalFloor": "5000", "maintMarginRatio": "0.02", @@ -12328,10 +13878,10 @@ "minNotional": 50000.0, "maxNotional": 600000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "600000", "notionalFloor": "50000", "maintMarginRatio": "0.025", @@ -12345,10 +13895,10 @@ "minNotional": 600000.0, "maxNotional": 1200000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "1200000", "notionalFloor": "600000", "maintMarginRatio": "0.05", @@ -12362,10 +13912,10 @@ "minNotional": 1200000.0, "maxNotional": 3000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "3000000", "notionalFloor": "1200000", "maintMarginRatio": "0.1", @@ -12379,10 +13929,10 @@ "minNotional": 3000000.0, "maxNotional": 4000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "6", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "4000000", "notionalFloor": "3000000", "maintMarginRatio": "0.125", @@ -12430,13 +13980,13 @@ "symbol": "BOME/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" @@ -12446,136 +13996,153 @@ "tier": 2.0, "symbol": "BOME/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": "BOME/USDT:USDT", "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 300000.0, + "minNotional": 10000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "300000", - "notionalFloor": "60000", + "notionalCap": "25000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "350.0" + "cum": "75.0" } }, { "tier": 4.0, "symbol": "BOME/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "300000", + "notionalCap": "50000", + "notionalFloor": "25000", "maintMarginRatio": "0.025", - "cum": "1850.0" + "cum": "200.0" } }, { "tier": 5.0, "symbol": "BOME/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 3000000.0, + "minNotional": 50000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "3000000", - "notionalFloor": "600000", + "notionalCap": "250000", + "notionalFloor": "50000", "maintMarginRatio": "0.05", - "cum": "16850.0" + "cum": "1450.0" } }, { "tier": 6.0, "symbol": "BOME/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "500000", + "notionalFloor": "250000", "maintMarginRatio": "0.1", - "cum": "166850.0" + "cum": "13950.0" } }, { "tier": 7.0, "symbol": "BOME/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "7500000", - "notionalFloor": "6000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "316850.0" + "cum": "26450.0" } }, { "tier": 8.0, "symbol": "BOME/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "15000000", - "notionalFloor": "7500000", - "maintMarginRatio": "0.25", - "cum": "1254350.0" + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1667", + "cum": "68150.0" } }, { "tier": 9.0, "symbol": "BOME/USDT:USDT", "currency": "USDT", - "minNotional": 15000000.0, - "maxNotional": 30000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.25", + "cum": "318050.0" + } + }, + { + "tier": 10.0, + "symbol": "BOME/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "15000000", + "notionalCap": "8000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "5004350.0" + "cum": "1568050.0" } } ], @@ -12700,6 +14267,127 @@ } } ], + "BR/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "BR/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": "BR/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": "BR/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": "BR/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": "BR/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "23150.0" + } + }, + { + "tier": 6.0, + "symbol": "BR/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "116900.0" + } + }, + { + "tier": 7.0, + "symbol": "BR/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "491900.0" + } + } + ], "BRETT/USDT:USDT": [ { "tier": 1.0, @@ -12855,6 +14543,248 @@ } } ], + "BROCCOLI714/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "BROCCOLI714/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": "BROCCOLI714/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": "BROCCOLI714/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": "BROCCOLI714/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": "BROCCOLI714/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "23150.0" + } + }, + { + "tier": 6.0, + "symbol": "BROCCOLI714/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "116900.0" + } + }, + { + "tier": 7.0, + "symbol": "BROCCOLI714/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "491900.0" + } + } + ], + "BROCCOLIF3B/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "BROCCOLIF3B/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": "BROCCOLIF3B/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": "BROCCOLIF3B/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": "BROCCOLIF3B/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": "BROCCOLIF3B/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "23150.0" + } + }, + { + "tier": 6.0, + "symbol": "BROCCOLIF3B/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "116900.0" + } + }, + { + "tier": 7.0, + "symbol": "BROCCOLIF3B/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "491900.0" + } + } + ], "BSV/USDT:USDT": [ { "tier": 1.0, @@ -12982,15 +14912,15 @@ "symbol": "BSW/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "75", - "notionalCap": "5000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -12998,89 +14928,55 @@ "tier": 2.0, "symbol": "BSW/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "minNotional": 20000.0, + "maxNotional": 40000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 7.0, "info": { "bracket": "2", - "initialLeverage": "50", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.015", - "cum": "25.0" + "initialLeverage": "7", + "notionalCap": "40000", + "notionalFloor": "20000", + "maintMarginRatio": "0.025", + "cum": "100.0" } }, { "tier": 3.0, "symbol": "BSW/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 40000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "10000", - "maintMarginRatio": "0.02", - "cum": "75.0" + "initialLeverage": "6", + "notionalCap": "200000", + "notionalFloor": "40000", + "maintMarginRatio": "0.05", + "cum": "1100.0" } }, { "tier": 4.0, "symbol": "BSW/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": "BSW/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": "BSW/USDT:USDT", - "currency": "USDT", "minNotional": 200000.0, "maxNotional": 400000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "6", + "bracket": "4", "initialLeverage": "5", "notionalCap": "400000", "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "11175.0" + "cum": "11100.0" } }, { - "tier": 7.0, + "tier": 5.0, "symbol": "BSW/USDT:USDT", "currency": "USDT", "minNotional": 400000.0, @@ -13088,33 +14984,50 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "7", + "bracket": "5", "initialLeverage": "4", "notionalCap": "500000", "notionalFloor": "400000", "maintMarginRatio": "0.125", - "cum": "21175.0" + "cum": "21100.0" } }, { - "tier": 8.0, + "tier": 6.0, "symbol": "BSW/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "6", + "initialLeverage": "3", + "notionalCap": "750000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "41950.0" + } + }, + { + "tier": 7.0, + "symbol": "BSW/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "83675.0" + "cum": "104425.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "BSW/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, @@ -13122,12 +15035,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "2000000", "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "333675.0" + "cum": "354425.0" } } ], @@ -13509,144 +15422,6 @@ } } ], - "BTC/USDT:USDT-250328": [ - { - "tier": 1.0, - "symbol": "BTC/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": "BTC/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": "BTC/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": "BTC/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": "BTC/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": "BTC/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": "BTC/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": "BTC/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" - } - } - ], "BTC/USDT:USDT-250627": [ { "tier": 1.0, @@ -13785,6 +15560,144 @@ } } ], + "BTC/USDT:USDT-250926": [ + { + "tier": 1.0, + "symbol": "BTC/USDT:USDT-250926", + "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": "BTC/USDT:USDT-250926", + "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": "BTC/USDT:USDT-250926", + "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": "BTC/USDT:USDT-250926", + "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": "BTC/USDT:USDT-250926", + "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": "BTC/USDT:USDT-250926", + "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": "BTC/USDT:USDT-250926", + "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": "BTC/USDT:USDT-250926", + "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" + } + } + ], "BTCDOM/USDT:USDT": [ { "tier": 1.0, @@ -14277,10 +16190,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -14294,10 +16207,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -14311,10 +16224,10 @@ "minNotional": 30000.0, "maxNotional": 150000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "150000", "notionalFloor": "30000", "maintMarginRatio": "0.02", @@ -14328,10 +16241,10 @@ "minNotional": 150000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "300000", "notionalFloor": "150000", "maintMarginRatio": "0.025", @@ -14343,13 +16256,13 @@ "symbol": "CATI/USDT:USDT", "currency": "USDT", "minNotional": 300000.0, - "maxNotional": 1500000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "1500000", + "initialLeverage": "5", + "notionalCap": "800000", "notionalFloor": "300000", "maintMarginRatio": "0.05", "cum": "8450.0" @@ -14359,68 +16272,68 @@ "tier": 6.0, "symbol": "CATI/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 800000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "800000", "maintMarginRatio": "0.1", - "cum": "83450.0" + "cum": "48450.0" } }, { "tier": 7.0, "symbol": "CATI/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3750000.0, + "minNotional": 1000000.0, + "maxNotional": 1200000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "3750000", - "notionalFloor": "3000000", + "initialLeverage": "3", + "notionalCap": "1200000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "158450.0" + "cum": "73450.0" } }, { "tier": 8.0, "symbol": "CATI/USDT:USDT", "currency": "USDT", - "minNotional": 3750000.0, - "maxNotional": 7500000.0, + "minNotional": 1200000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "3750000", + "notionalCap": "1500000", + "notionalFloor": "1200000", "maintMarginRatio": "0.25", - "cum": "627200.0" + "cum": "223450.0" } }, { "tier": 9.0, "symbol": "CATI/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 1500000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "2000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "2502200.0" + "cum": "598450.0" } } ], @@ -14432,10 +16345,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -14449,10 +16362,10 @@ "minNotional": 5000.0, "maxNotional": 16000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "16000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -14466,10 +16379,10 @@ "minNotional": 16000.0, "maxNotional": 80000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "80000", "notionalFloor": "16000", "maintMarginRatio": "0.02", @@ -14483,10 +16396,10 @@ "minNotional": 80000.0, "maxNotional": 160000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "160000", "notionalFloor": "80000", "maintMarginRatio": "0.025", @@ -14500,10 +16413,10 @@ "minNotional": 160000.0, "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "800000", "notionalFloor": "160000", "maintMarginRatio": "0.05", @@ -14517,10 +16430,10 @@ "minNotional": 800000.0, "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1600000", "notionalFloor": "800000", "maintMarginRatio": "0.1", @@ -14534,10 +16447,10 @@ "minNotional": 1600000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "2000000", "notionalFloor": "1600000", "maintMarginRatio": "0.125", @@ -14566,13 +16479,13 @@ "symbol": "CELO/USDT:USDT", "currency": "USDT", "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "maxNotional": 4500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "8000000", + "notionalCap": "4500000", "notionalFloor": "4000000", "maintMarginRatio": "0.5", "cum": "1334505.0" @@ -14861,13 +16774,13 @@ "symbol": "CFX/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" @@ -14877,136 +16790,153 @@ "tier": 2.0, "symbol": "CFX/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": "CFX/USDT:USDT", "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 400000.0, + "minNotional": 10000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "400000", - "notionalFloor": "60000", + "notionalCap": "25000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "350.0" + "cum": "75.0" } }, { "tier": 4.0, "symbol": "CFX/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 600000.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "400000", + "notionalCap": "50000", + "notionalFloor": "25000", "maintMarginRatio": "0.025", - "cum": "2350.0" + "cum": "200.0" } }, { "tier": 5.0, "symbol": "CFX/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 2000000.0, + "minNotional": 50000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "2000000", - "notionalFloor": "600000", + "notionalCap": "250000", + "notionalFloor": "50000", "maintMarginRatio": "0.05", - "cum": "17350.0" + "cum": "1450.0" } }, { "tier": 6.0, "symbol": "CFX/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 2500000.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "2500000", - "notionalFloor": "2000000", + "notionalCap": "500000", + "notionalFloor": "250000", "maintMarginRatio": "0.1", - "cum": "117350.0" + "cum": "13950.0" } }, { "tier": 7.0, "symbol": "CFX/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 3000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "3000000", - "notionalFloor": "2500000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "179850.0" + "cum": "26450.0" } }, { "tier": 8.0, "symbol": "CFX/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "3500000", - "notionalFloor": "3000000", - "maintMarginRatio": "0.25", - "cum": "554850.0" + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1667", + "cum": "68150.0" } }, { "tier": 9.0, "symbol": "CFX/USDT:USDT", "currency": "USDT", - "minNotional": 3500000.0, - "maxNotional": 4000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.25", + "cum": "318050.0" + } + }, + { + "tier": 10.0, + "symbol": "CFX/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "4000000", - "notionalFloor": "3500000", + "notionalCap": "8000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1429850.0" + "cum": "1568050.0" } } ], @@ -15173,10 +17103,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -15190,10 +17120,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -15205,13 +17135,13 @@ "symbol": "CHESS/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 23000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "20000", + "initialLeverage": "10", + "notionalCap": "23000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -15221,102 +17151,119 @@ "tier": 4.0, "symbol": "CHESS/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 40000.0, + "minNotional": 23000.0, + "maxNotional": 46000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "40000", - "notionalFloor": "20000", + "initialLeverage": "7", + "notionalCap": "46000", + "notionalFloor": "23000", "maintMarginRatio": "0.025", - "cum": "175.0" + "cum": "190.0" } }, { "tier": 5.0, "symbol": "CHESS/USDT:USDT", "currency": "USDT", - "minNotional": 40000.0, - "maxNotional": 200000.0, + "minNotional": 46000.0, + "maxNotional": 230000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "40000", + "initialLeverage": "6", + "notionalCap": "230000", + "notionalFloor": "46000", "maintMarginRatio": "0.05", - "cum": "1175.0" + "cum": "1340.0" } }, { "tier": 6.0, "symbol": "CHESS/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 230000.0, + "maxNotional": 460000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "460000", + "notionalFloor": "230000", "maintMarginRatio": "0.1", - "cum": "11175.0" + "cum": "12840.0" } }, { "tier": 7.0, "symbol": "CHESS/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 460000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "800000", + "notionalFloor": "460000", "maintMarginRatio": "0.125", - "cum": "21175.0" + "cum": "24340.0" } }, { "tier": 8.0, "symbol": "CHESS/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 800000.0, + "maxNotional": 2100000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "83675.0" + "initialLeverage": "3", + "notionalCap": "2100000", + "notionalFloor": "800000", + "maintMarginRatio": "0.1667", + "cum": "57700.0" } }, { "tier": 9.0, "symbol": "CHESS/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 2100000.0, + "maxNotional": 3400000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "3400000", + "notionalFloor": "2100000", + "maintMarginRatio": "0.25", + "cum": "232630.0" + } + }, + { + "tier": 10.0, + "symbol": "CHESS/USDT:USDT", + "currency": "USDT", + "minNotional": 3400000.0, + "maxNotional": 5600000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "5600000", + "notionalFloor": "3400000", "maintMarginRatio": "0.5", - "cum": "333675.0" + "cum": "1082630.0" } } ], @@ -15483,10 +17430,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -15500,10 +17447,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -15515,13 +17462,13 @@ "symbol": "CHR/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 50000.0, + "maxNotional": 35000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "50000", + "initialLeverage": "10", + "notionalCap": "35000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -15531,102 +17478,119 @@ "tier": 4.0, "symbol": "CHR/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, + "minNotional": 35000.0, + "maxNotional": 70000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "100000", - "notionalFloor": "50000", + "initialLeverage": "7", + "notionalCap": "70000", + "notionalFloor": "35000", "maintMarginRatio": "0.025", - "cum": "325.0" + "cum": "250.0" } }, { "tier": 5.0, "symbol": "CHR/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 500000.0, + "minNotional": 70000.0, + "maxNotional": 350000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "500000", - "notionalFloor": "100000", + "initialLeverage": "6", + "notionalCap": "350000", + "notionalFloor": "70000", "maintMarginRatio": "0.05", - "cum": "2825.0" + "cum": "2000.0" } }, { "tier": 6.0, "symbol": "CHR/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 350000.0, + "maxNotional": 700000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "700000", + "notionalFloor": "350000", "maintMarginRatio": "0.1", - "cum": "27825.0" + "cum": "19500.0" } }, { "tier": 7.0, "symbol": "CHR/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 1250000.0, + "minNotional": 700000.0, + "maxNotional": 1100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "1250000", - "notionalFloor": "1000000", + "notionalCap": "1100000", + "notionalFloor": "700000", "maintMarginRatio": "0.125", - "cum": "52825.0" + "cum": "37000.0" } }, { "tier": 8.0, "symbol": "CHR/USDT:USDT", "currency": "USDT", - "minNotional": 1250000.0, - "maxNotional": 2500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 1100000.0, + "maxNotional": 2550000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "2500000", - "notionalFloor": "1250000", - "maintMarginRatio": "0.25", - "cum": "209075.0" + "initialLeverage": "3", + "notionalCap": "2550000", + "notionalFloor": "1100000", + "maintMarginRatio": "0.1667", + "cum": "82870.0" } }, { "tier": 9.0, "symbol": "CHR/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "minNotional": 2550000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "4000000", + "notionalFloor": "2550000", + "maintMarginRatio": "0.25", + "cum": "295285.0" + } + }, + { + "tier": 10.0, + "symbol": "CHR/USDT:USDT", + "currency": "USDT", + "minNotional": 4000000.0, + "maxNotional": 6800000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "2500000", + "notionalCap": "6800000", + "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "834075.0" + "cum": "1295285.0" } } ], @@ -15793,10 +17757,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -15810,10 +17774,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -15827,10 +17791,10 @@ "minNotional": 20000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "8", "notionalCap": "100000", "notionalFloor": "20000", "maintMarginRatio": "0.02", @@ -15844,10 +17808,10 @@ "minNotional": 100000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "7", "notionalCap": "200000", "notionalFloor": "100000", "maintMarginRatio": "0.025", @@ -15861,10 +17825,10 @@ "minNotional": 200000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "1000000", "notionalFloor": "200000", "maintMarginRatio": "0.05", @@ -15910,33 +17874,50 @@ "symbol": "CKB/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maxNotional": 3750000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "5000000", + "initialLeverage": "3", + "notionalCap": "3750000", "notionalFloor": "2500000", - "maintMarginRatio": "0.25", - "cum": "418150.0" + "maintMarginRatio": "0.1667", + "cum": "209900.0" } }, { "tier": 9.0, "symbol": "CKB/USDT:USDT", "currency": "USDT", + "minNotional": 3750000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3750000", + "maintMarginRatio": "0.25", + "cum": "522275.0" + } + }, + { + "tier": 10.0, + "symbol": "CKB/USDT:USDT", + "currency": "USDT", "minNotional": 5000000.0, "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", "notionalCap": "10000000", "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1668150.0" + "cum": "1772275.0" } } ], @@ -15946,15 +17927,15 @@ "symbol": "COMBO/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 20.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 7.0, "info": { "bracket": "1", - "initialLeverage": "20", - "notionalCap": "5000", + "initialLeverage": "7", + "notionalCap": "25000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.025", "cum": "0.0" } }, @@ -15962,51 +17943,51 @@ "tier": 2.0, "symbol": "COMBO/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 15.0, + "minNotional": 25000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, "info": { "bracket": "2", - "initialLeverage": "15", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" + "initialLeverage": "6", + "notionalCap": "200000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "625.0" } }, { "tier": 3.0, "symbol": "COMBO/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 200000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 200000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "650.0" + "initialLeverage": "5", + "notionalCap": "400000", + "notionalFloor": "200000", + "maintMarginRatio": "0.1", + "cum": "10625.0" } }, { "tier": 4.0, "symbol": "COMBO/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, + "minNotional": 400000.0, "maxNotional": 500000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "4", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "500000", - "notionalFloor": "200000", - "maintMarginRatio": "0.1", - "cum": "10650.0" + "notionalFloor": "400000", + "maintMarginRatio": "0.125", + "cum": "20625.0" } }, { @@ -16014,50 +17995,33 @@ "symbol": "COMBO/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 3.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "1000000", + "initialLeverage": "3", + "notionalCap": "600000", "notionalFloor": "500000", - "maintMarginRatio": "0.125", - "cum": "23150.0" + "maintMarginRatio": "0.25", + "cum": "83125.0" } }, { "tier": 6.0, "symbol": "COMBO/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": "COMBO/USDT:USDT", - "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 5000000.0, + "minNotional": 600000.0, + "maxNotional": 700000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "3000000", + "notionalCap": "700000", + "notionalFloor": "600000", "maintMarginRatio": "0.5", - "cum": "898150.0" + "cum": "233125.0" } } ], @@ -16069,10 +18033,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -16086,10 +18050,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -16101,13 +18065,13 @@ "symbol": "COMP/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 50000.0, + "maxNotional": 35000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "50000", + "initialLeverage": "10", + "notionalCap": "35000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -16117,102 +18081,119 @@ "tier": 4.0, "symbol": "COMP/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, + "minNotional": 35000.0, + "maxNotional": 70000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "100000", - "notionalFloor": "50000", + "initialLeverage": "7", + "notionalCap": "70000", + "notionalFloor": "35000", "maintMarginRatio": "0.025", - "cum": "325.0" + "cum": "250.0" } }, { "tier": 5.0, "symbol": "COMP/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 500000.0, + "minNotional": 70000.0, + "maxNotional": 350000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "500000", - "notionalFloor": "100000", + "initialLeverage": "6", + "notionalCap": "350000", + "notionalFloor": "70000", "maintMarginRatio": "0.05", - "cum": "2825.0" + "cum": "2000.0" } }, { "tier": 6.0, "symbol": "COMP/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 350000.0, + "maxNotional": 700000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "700000", + "notionalFloor": "350000", "maintMarginRatio": "0.1", - "cum": "27825.0" + "cum": "19500.0" } }, { "tier": 7.0, "symbol": "COMP/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 1250000.0, + "minNotional": 700000.0, + "maxNotional": 1100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "1250000", - "notionalFloor": "1000000", + "notionalCap": "1100000", + "notionalFloor": "700000", "maintMarginRatio": "0.125", - "cum": "52825.0" + "cum": "37000.0" } }, { "tier": 8.0, "symbol": "COMP/USDT:USDT", "currency": "USDT", - "minNotional": 1250000.0, - "maxNotional": 2500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 1100000.0, + "maxNotional": 2550000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "2500000", - "notionalFloor": "1250000", - "maintMarginRatio": "0.25", - "cum": "209075.0" + "initialLeverage": "3", + "notionalCap": "2550000", + "notionalFloor": "1100000", + "maintMarginRatio": "0.1667", + "cum": "82870.0" } }, { "tier": 9.0, "symbol": "COMP/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "minNotional": 2550000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "4000000", + "notionalFloor": "2550000", + "maintMarginRatio": "0.25", + "cum": "295285.0" + } + }, + { + "tier": 10.0, + "symbol": "COMP/USDT:USDT", + "currency": "USDT", + "minNotional": 4000000.0, + "maxNotional": 6800000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "2500000", + "notionalCap": "6800000", + "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "834075.0" + "cum": "1295285.0" } } ], @@ -16379,10 +18360,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -16396,10 +18377,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -16413,10 +18394,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -16430,10 +18411,10 @@ "minNotional": 20000.0, "maxNotional": 40000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "40000", "notionalFloor": "20000", "maintMarginRatio": "0.025", @@ -16447,10 +18428,10 @@ "minNotional": 40000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "200000", "notionalFloor": "40000", "maintMarginRatio": "0.05", @@ -16464,10 +18445,10 @@ "minNotional": 200000.0, "maxNotional": 400000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "400000", "notionalFloor": "200000", "maintMarginRatio": "0.1", @@ -16481,10 +18462,10 @@ "minNotional": 400000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "500000", "notionalFloor": "400000", "maintMarginRatio": "0.125", @@ -16672,10 +18653,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -16689,10 +18670,10 @@ "minNotional": 5000.0, "maxNotional": 16000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "16000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -16706,10 +18687,10 @@ "minNotional": 16000.0, "maxNotional": 80000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 7.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "7", "notionalCap": "80000", "notionalFloor": "16000", "maintMarginRatio": "0.02", @@ -16723,10 +18704,10 @@ "minNotional": 80000.0, "maxNotional": 160000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "160000", "notionalFloor": "80000", "maintMarginRatio": "0.025", @@ -16740,10 +18721,10 @@ "minNotional": 160000.0, "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "800000", "notionalFloor": "160000", "maintMarginRatio": "0.05", @@ -16757,10 +18738,10 @@ "minNotional": 800000.0, "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1600000", "notionalFloor": "800000", "maintMarginRatio": "0.1", @@ -16774,10 +18755,10 @@ "minNotional": 1600000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "2000000", "notionalFloor": "1600000", "maintMarginRatio": "0.125", @@ -17119,110 +19100,6 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 11.0, - "info": { - "bracket": "1", - "initialLeverage": "11", - "notionalCap": "5000", - "notionalFloor": "0", - "maintMarginRatio": "0.02", - "cum": "0.0" - } - }, - { - "tier": 2.0, - "symbol": "CTK/USDT:USDT", - "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, - "info": { - "bracket": "2", - "initialLeverage": "10", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" - } - }, - { - "tier": 3.0, - "symbol": "CTK/USDT:USDT", - "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, - "info": { - "bracket": "3", - "initialLeverage": "8", - "notionalCap": "100000", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "650.0" - } - }, - { - "tier": 4.0, - "symbol": "CTK/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": "CTK/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": "CTK/USDT:USDT", - "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 1500000.0, - "maintenanceMarginRate": 0.5, - "maxLeverage": 1.0, - "info": { - "bracket": "6", - "initialLeverage": "1", - "notionalCap": "1500000", - "notionalFloor": "1000000", - "maintMarginRatio": "0.5", - "cum": "386900.0" - } - } - ], - "CTSI/USDT:USDT": [ - { - "tier": 1.0, - "symbol": "CTSI/USDT:USDT", - "currency": "USDT", - "minNotional": 0.0, - "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { @@ -17236,7 +19113,7 @@ }, { "tier": 2.0, - "symbol": "CTSI/USDT:USDT", + "symbol": "CTK/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -17253,15 +19130,187 @@ }, { "tier": 3.0, - "symbol": "CTSI/USDT:USDT", + "symbol": "CTK/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 50000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "CTK/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "200.0" + } + }, + { + "tier": 5.0, + "symbol": "CTK/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "125000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1450.0" + } + }, + { + "tier": 6.0, + "symbol": "CTK/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.1", + "cum": "7700.0" + } + }, + { + "tier": 7.0, + "symbol": "CTK/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "13950.0" + } + }, + { + "tier": 8.0, + "symbol": "CTK/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "1500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34800.0" + } + }, + { + "tier": 9.0, + "symbol": "CTK/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.25", + "cum": "159750.0" + } + }, + { + "tier": 10.0, + "symbol": "CTK/USDT:USDT", + "currency": "USDT", + "minNotional": 2500000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "4000000", + "notionalFloor": "2500000", + "maintMarginRatio": "0.5", + "cum": "784750.0" + } + } + ], + "CTSI/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "CTSI/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, + "symbol": "CTSI/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 15.0, + "info": { + "bracket": "2", + "initialLeverage": "15", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "CTSI/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -17275,10 +19324,10 @@ "minNotional": 50000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.025", @@ -17292,10 +19341,10 @@ "minNotional": 100000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "500000", "notionalFloor": "100000", "maintMarginRatio": "0.05", @@ -17309,10 +19358,10 @@ "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.1", @@ -17326,10 +19375,10 @@ "minNotional": 1000000.0, "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "1250000", "notionalFloor": "1000000", "maintMarginRatio": "0.125", @@ -17984,10 +20033,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -18001,10 +20050,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -18016,13 +20065,13 @@ "symbol": "DASH/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 50000.0, + "maxNotional": 35000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "50000", + "initialLeverage": "10", + "notionalCap": "35000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -18032,75 +20081,247 @@ "tier": 4.0, "symbol": "DASH/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, + "minNotional": 35000.0, + "maxNotional": 70000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "100000", - "notionalFloor": "50000", + "initialLeverage": "7", + "notionalCap": "70000", + "notionalFloor": "35000", "maintMarginRatio": "0.025", - "cum": "325.0" + "cum": "250.0" } }, { "tier": 5.0, "symbol": "DASH/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 500000.0, + "minNotional": 70000.0, + "maxNotional": 350000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "500000", - "notionalFloor": "100000", + "initialLeverage": "6", + "notionalCap": "350000", + "notionalFloor": "70000", "maintMarginRatio": "0.05", - "cum": "2825.0" + "cum": "2000.0" } }, { "tier": 6.0, "symbol": "DASH/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 350000.0, + "maxNotional": 700000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "700000", + "notionalFloor": "350000", "maintMarginRatio": "0.1", - "cum": "27825.0" + "cum": "19500.0" } }, { "tier": 7.0, "symbol": "DASH/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 1250000.0, + "minNotional": 700000.0, + "maxNotional": 1100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "1250000", - "notionalFloor": "1000000", + "notionalCap": "1100000", + "notionalFloor": "700000", "maintMarginRatio": "0.125", - "cum": "52825.0" + "cum": "37000.0" } }, { "tier": 8.0, "symbol": "DASH/USDT:USDT", "currency": "USDT", - "minNotional": 1250000.0, + "minNotional": 1100000.0, + "maxNotional": 2550000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "2550000", + "notionalFloor": "1100000", + "maintMarginRatio": "0.1667", + "cum": "82870.0" + } + }, + { + "tier": 9.0, + "symbol": "DASH/USDT:USDT", + "currency": "USDT", + "minNotional": 2550000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "4000000", + "notionalFloor": "2550000", + "maintMarginRatio": "0.25", + "cum": "295285.0" + } + }, + { + "tier": 10.0, + "symbol": "DASH/USDT:USDT", + "currency": "USDT", + "minNotional": 4000000.0, + "maxNotional": 6800000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "6800000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.5", + "cum": "1295285.0" + } + } + ], + "DEEP/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "DEEP/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": "DEEP/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "DEEP/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "DEEP/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "125000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1325.0" + } + }, + { + "tier": 5.0, + "symbol": "DEEP/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.1", + "cum": "7575.0" + } + }, + { + "tier": 6.0, + "symbol": "DEEP/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "13825.0" + } + }, + { + "tier": 7.0, + "symbol": "DEEP/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "1500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34675.0" + } + }, + { + "tier": 8.0, + "symbol": "DEEP/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, @@ -18108,26 +20329,26 @@ "bracket": "8", "initialLeverage": "2", "notionalCap": "2500000", - "notionalFloor": "1250000", + "notionalFloor": "1500000", "maintMarginRatio": "0.25", - "cum": "209075.0" + "cum": "159625.0" } }, { "tier": 9.0, - "symbol": "DASH/USDT:USDT", + "symbol": "DEEP/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "5000000", + "notionalCap": "4000000", "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "834075.0" + "cum": "784625.0" } } ], @@ -18674,10 +20895,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -18691,10 +20912,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -18708,10 +20929,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 12.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "12", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -18725,10 +20946,10 @@ "minNotional": 30000.0, "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "60000", "notionalFloor": "30000", "maintMarginRatio": "0.025", @@ -18742,10 +20963,10 @@ "minNotional": 60000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "8", "notionalCap": "300000", "notionalFloor": "60000", "maintMarginRatio": "0.05", @@ -18808,13 +21029,13 @@ "symbol": "DEXE/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "3000000", + "notionalCap": "2000000", "notionalFloor": "1500000", "maintMarginRatio": "0.5", "cum": "500475.0" @@ -19088,10 +21309,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -19105,10 +21326,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -19122,10 +21343,10 @@ "minNotional": 20000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "100000", "notionalFloor": "20000", "maintMarginRatio": "0.02", @@ -19139,10 +21360,10 @@ "minNotional": 100000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "7", "notionalCap": "200000", "notionalFloor": "100000", "maintMarginRatio": "0.025", @@ -19154,13 +21375,13 @@ "symbol": "DIA/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, - "maxNotional": 1000000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "1000000", + "initialLeverage": "6", + "notionalCap": "300000", "notionalFloor": "200000", "maintMarginRatio": "0.05", "cum": "5650.0" @@ -19170,68 +21391,85 @@ "tier": 6.0, "symbol": "DIA/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 300000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "500000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "55650.0" + "cum": "20650.0" } }, { "tier": 7.0, "symbol": "DIA/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 2500000.0, + "minNotional": 500000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "2500000", - "notionalFloor": "2000000", + "notionalCap": "600000", + "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "105650.0" + "cum": "33150.0" } }, { "tier": 8.0, "symbol": "DIA/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 600000.0, + "maxNotional": 650000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "5000000", - "notionalFloor": "2500000", - "maintMarginRatio": "0.25", - "cum": "418150.0" + "initialLeverage": "3", + "notionalCap": "650000", + "notionalFloor": "600000", + "maintMarginRatio": "0.1667", + "cum": "58170.0" } }, { "tier": 9.0, "symbol": "DIA/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 650000.0, + "maxNotional": 700000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "700000", + "notionalFloor": "650000", + "maintMarginRatio": "0.25", + "cum": "112315.0" + } + }, + { + "tier": 10.0, + "symbol": "DIA/USDT:USDT", + "currency": "USDT", + "minNotional": 700000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "800000", + "notionalFloor": "700000", "maintMarginRatio": "0.5", - "cum": "1668150.0" + "cum": "287315.0" } } ], @@ -19362,13 +21600,13 @@ "symbol": "DOGE/USDC:USDC", "currency": "USDC", "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" @@ -19378,153 +21616,153 @@ "tier": 2.0, "symbol": "DOGE/USDC:USDC", "currency": "USDC", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.006, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.007, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.006", - "cum": "5.0" + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.007", + "cum": "20.0" } }, { "tier": 3.0, "symbol": "DOGE/USDC:USDC", "currency": "USDC", - "minNotional": 10000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.007, + "minNotional": 50000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.01, "maxLeverage": 40.0, "info": { "bracket": "3", "initialLeverage": "40", - "notionalCap": "50000", - "notionalFloor": "10000", - "maintMarginRatio": "0.007", - "cum": "15.0" + "notionalCap": "750000", + "notionalFloor": "50000", + "maintMarginRatio": "0.01", + "cum": "170.0" } }, { "tier": 4.0, "symbol": "DOGE/USDC:USDC", "currency": "USDC", - "minNotional": 50000.0, - "maxNotional": 750000.0, - "maintenanceMarginRate": 0.01, + "minNotional": 750000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "4", "initialLeverage": "25", - "notionalCap": "750000", - "notionalFloor": "50000", - "maintMarginRatio": "0.01", - "cum": "165.0" + "notionalCap": "1000000", + "notionalFloor": "750000", + "maintMarginRatio": "0.02", + "cum": "7670.0" } }, { "tier": 5.0, "symbol": "DOGE/USDC:USDC", "currency": "USDC", - "minNotional": 750000.0, - "maxNotional": 1100000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "5", "initialLeverage": "20", - "notionalCap": "1100000", - "notionalFloor": "750000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.025", - "cum": "11415.0" + "cum": "12670.0" } }, { "tier": 6.0, "symbol": "DOGE/USDC:USDC", "currency": "USDC", - "minNotional": 1100000.0, - "maxNotional": 2200000.0, + "minNotional": 2000000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "6", "initialLeverage": "10", - "notionalCap": "2200000", - "notionalFloor": "1100000", + "notionalCap": "10000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.05", - "cum": "38915.0" + "cum": "62670.0" } }, { "tier": 7.0, "symbol": "DOGE/USDC:USDC", "currency": "USDC", - "minNotional": 2200000.0, - "maxNotional": 5600000.0, + "minNotional": 10000000.0, + "maxNotional": 20000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "7", "initialLeverage": "5", - "notionalCap": "5600000", - "notionalFloor": "2200000", + "notionalCap": "20000000", + "notionalFloor": "10000000", "maintMarginRatio": "0.1", - "cum": "148915.0" + "cum": "562670.0" } }, { "tier": 8.0, "symbol": "DOGE/USDC:USDC", "currency": "USDC", - "minNotional": 5600000.0, - "maxNotional": 7000000.0, + "minNotional": 20000000.0, + "maxNotional": 25000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "8", "initialLeverage": "4", - "notionalCap": "7000000", - "notionalFloor": "5600000", + "notionalCap": "25000000", + "notionalFloor": "20000000", "maintMarginRatio": "0.125", - "cum": "288915.0" + "cum": "1062670.0" } }, { "tier": 9.0, "symbol": "DOGE/USDC:USDC", "currency": "USDC", - "minNotional": 7000000.0, - "maxNotional": 18000000.0, + "minNotional": 25000000.0, + "maxNotional": 50000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "18000000", - "notionalFloor": "7000000", + "notionalCap": "50000000", + "notionalFloor": "25000000", "maintMarginRatio": "0.25", - "cum": "1163915.0" + "cum": "4187670.0" } }, { "tier": 10.0, "symbol": "DOGE/USDC:USDC", "currency": "USDC", - "minNotional": 18000000.0, - "maxNotional": 30000000.0, + "minNotional": 50000000.0, + "maxNotional": 100000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "18000000", + "notionalCap": "100000000", + "notionalFloor": "50000000", "maintMarginRatio": "0.5", - "cum": "5663915.0" + "cum": "16687670.0" } } ], @@ -19706,13 +21944,13 @@ "symbol": "DOGS/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, + "maxNotional": 7000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", - "notionalCap": "10000", + "initialLeverage": "20", + "notionalCap": "7000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -19722,136 +21960,308 @@ "tier": 2.0, "symbol": "DOGS/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 60000.0, + "minNotional": 7000.0, + "maxNotional": 30000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", - "notionalCap": "60000", - "notionalFloor": "10000", + "initialLeverage": "10", + "notionalCap": "30000", + "notionalFloor": "7000", "maintMarginRatio": "0.015", - "cum": "50.0" + "cum": "35.0" } }, { "tier": 3.0, "symbol": "DOGS/USDT:USDT", "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 300000.0, + "minNotional": 30000.0, + "maxNotional": 135000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "300000", - "notionalFloor": "60000", + "initialLeverage": "8", + "notionalCap": "135000", + "notionalFloor": "30000", "maintMarginRatio": "0.02", - "cum": "350.0" + "cum": "185.0" } }, { "tier": 4.0, "symbol": "DOGS/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 135000.0, + "maxNotional": 270000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "300000", + "initialLeverage": "7", + "notionalCap": "270000", + "notionalFloor": "135000", "maintMarginRatio": "0.025", - "cum": "1850.0" + "cum": "860.0" } }, { "tier": 5.0, "symbol": "DOGS/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 1500000.0, + "minNotional": 270000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "1500000", - "notionalFloor": "600000", + "initialLeverage": "6", + "notionalCap": "750000", + "notionalFloor": "270000", "maintMarginRatio": "0.05", - "cum": "16850.0" + "cum": "7610.0" } }, { "tier": 6.0, "symbol": "DOGS/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 2000000.0, + "minNotional": 750000.0, + "maxNotional": 1100000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "2000000", - "notionalFloor": "1500000", + "notionalCap": "1100000", + "notionalFloor": "750000", "maintMarginRatio": "0.1", - "cum": "91850.0" + "cum": "45110.0" } }, { "tier": 7.0, "symbol": "DOGS/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 2500000.0, + "minNotional": 1100000.0, + "maxNotional": 1600000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "2500000", - "notionalFloor": "2000000", + "notionalCap": "1600000", + "notionalFloor": "1100000", "maintMarginRatio": "0.125", - "cum": "141850.0" + "cum": "72610.0" } }, { "tier": 8.0, "symbol": "DOGS/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 3000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 1600000.0, + "maxNotional": 2900000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "2500000", - "maintMarginRatio": "0.25", - "cum": "454350.0" + "initialLeverage": "3", + "notionalCap": "2900000", + "notionalFloor": "1600000", + "maintMarginRatio": "0.1667", + "cum": "139330.0" } }, { "tier": 9.0, "symbol": "DOGS/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3500000.0, + "minNotional": 2900000.0, + "maxNotional": 4200000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "4200000", + "notionalFloor": "2900000", + "maintMarginRatio": "0.25", + "cum": "380900.0" + } + }, + { + "tier": 10.0, + "symbol": "DOGS/USDT:USDT", + "currency": "USDT", + "minNotional": 4200000.0, + "maxNotional": 6200000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "6200000", + "notionalFloor": "4200000", + "maintMarginRatio": "0.5", + "cum": "1430900.0" + } + } + ], + "DOLO/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "DOLO/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": "DOLO/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "DOLO/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "DOLO/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "125000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1325.0" + } + }, + { + "tier": 5.0, + "symbol": "DOLO/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.1", + "cum": "7575.0" + } + }, + { + "tier": 6.0, + "symbol": "DOLO/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "13825.0" + } + }, + { + "tier": 7.0, + "symbol": "DOLO/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "1500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34675.0" + } + }, + { + "tier": 8.0, + "symbol": "DOLO/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.25", + "cum": "159625.0" + } + }, + { + "tier": 9.0, + "symbol": "DOLO/USDT:USDT", + "currency": "USDT", + "minNotional": 2500000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "3500000", - "notionalFloor": "3000000", + "notionalCap": "4000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "1204350.0" + "cum": "784625.0" } } ], @@ -20035,10 +22445,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -20052,10 +22462,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -20069,10 +22479,10 @@ "minNotional": 20000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "8", "notionalCap": "100000", "notionalFloor": "20000", "maintMarginRatio": "0.02", @@ -20086,10 +22496,10 @@ "minNotional": 100000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "7", "notionalCap": "200000", "notionalFloor": "100000", "maintMarginRatio": "0.025", @@ -20103,10 +22513,10 @@ "minNotional": 200000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "1000000", "notionalFloor": "200000", "maintMarginRatio": "0.05", @@ -20152,33 +22562,50 @@ "symbol": "DRIFT/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maxNotional": 3750000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "5000000", + "initialLeverage": "3", + "notionalCap": "3750000", "notionalFloor": "2500000", - "maintMarginRatio": "0.25", - "cum": "418150.0" + "maintMarginRatio": "0.1667", + "cum": "209900.0" } }, { "tier": 9.0, "symbol": "DRIFT/USDT:USDT", "currency": "USDT", + "minNotional": 3750000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3750000", + "maintMarginRatio": "0.25", + "cum": "522275.0" + } + }, + { + "tier": 10.0, + "symbol": "DRIFT/USDT:USDT", + "currency": "USDT", "minNotional": 5000000.0, "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", "notionalCap": "10000000", "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1668150.0" + "cum": "1772275.0" } } ], @@ -20190,10 +22617,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -20207,10 +22634,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -20224,10 +22651,10 @@ "minNotional": 10000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -20241,10 +22668,10 @@ "minNotional": 50000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.025", @@ -20258,10 +22685,10 @@ "minNotional": 100000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "500000", "notionalFloor": "100000", "maintMarginRatio": "0.05", @@ -20275,10 +22702,10 @@ "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.1", @@ -20292,10 +22719,10 @@ "minNotional": 1000000.0, "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "1250000", "notionalFloor": "1000000", "maintMarginRatio": "0.125", @@ -20498,15 +22925,15 @@ "symbol": "DYM/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 4000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "25", + "notionalCap": "4000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, @@ -20514,72 +22941,89 @@ "tier": 2.0, "symbol": "DYM/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 4000.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "initialLeverage": "20", + "notionalCap": "5000", + "notionalFloor": "4000", + "maintMarginRatio": "0.015", + "cum": "20.0" } }, { "tier": 3.0, "symbol": "DYM/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 80000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "80000", - "notionalFloor": "25000", - "maintMarginRatio": "0.025", - "cum": "150.0" + "initialLeverage": "10", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "45.0" } }, { "tier": 4.0, "symbol": "DYM/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 800000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 25000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "800000", - "notionalFloor": "80000", - "maintMarginRatio": "0.05", - "cum": "2150.0" + "initialLeverage": "7", + "notionalCap": "80000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "170.0" } }, { "tier": 5.0, "symbol": "DYM/USDT:USDT", "currency": "USDT", + "minNotional": 80000.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, + "info": { + "bracket": "5", + "initialLeverage": "6", + "notionalCap": "800000", + "notionalFloor": "80000", + "maintMarginRatio": "0.05", + "cum": "2170.0" + } + }, + { + "tier": 6.0, + "symbol": "DYM/USDT:USDT", + "currency": "USDT", "minNotional": 800000.0, "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", "notionalCap": "1600000", "notionalFloor": "800000", "maintMarginRatio": "0.1", - "cum": "42150.0" + "cum": "42170.0" } }, { - "tier": 6.0, + "tier": 7.0, "symbol": "DYM/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, @@ -20587,46 +23031,63 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", "notionalCap": "2000000", "notionalFloor": "1600000", "maintMarginRatio": "0.125", - "cum": "82150.0" - } - }, - { - "tier": 7.0, - "symbol": "DYM/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" + "cum": "82170.0" } }, { "tier": 8.0, "symbol": "DYM/USDT:USDT", "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.1667", + "cum": "165570.0" + } + }, + { + "tier": 9.0, + "symbol": "DYM/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "4000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.25", + "cum": "415470.0" + } + }, + { + "tier": 10.0, + "symbol": "DYM/USDT:USDT", + "currency": "USDT", "minNotional": 4000000.0, "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "10", "initialLeverage": "1", "notionalCap": "8000000", "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "1332150.0" + "cum": "1415470.0" } } ], @@ -20759,10 +23220,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -20776,10 +23237,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -20793,10 +23254,10 @@ "minNotional": 20000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "8", "notionalCap": "100000", "notionalFloor": "20000", "maintMarginRatio": "0.02", @@ -20810,10 +23271,10 @@ "minNotional": 100000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "7", "notionalCap": "200000", "notionalFloor": "100000", "maintMarginRatio": "0.025", @@ -20827,10 +23288,10 @@ "minNotional": 200000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "1000000", "notionalFloor": "200000", "maintMarginRatio": "0.05", @@ -20876,33 +23337,50 @@ "symbol": "EGLD/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, - "maxNotional": 6000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maxNotional": 3750000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "6000000", + "initialLeverage": "3", + "notionalCap": "3750000", "notionalFloor": "2500000", - "maintMarginRatio": "0.25", - "cum": "418150.0" + "maintMarginRatio": "0.1667", + "cum": "209900.0" } }, { "tier": 9.0, "symbol": "EGLD/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, + "minNotional": 3750000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3750000", + "maintMarginRatio": "0.25", + "cum": "522275.0" + } + }, + { + "tier": 10.0, + "symbol": "EGLD/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1918150.0" + "cum": "1772275.0" } } ], @@ -20912,13 +23390,13 @@ "symbol": "EIGEN/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, + "maxNotional": 7000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", - "notionalCap": "10000", + "initialLeverage": "20", + "notionalCap": "7000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -20928,136 +23406,153 @@ "tier": 2.0, "symbol": "EIGEN/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 60000.0, + "minNotional": 7000.0, + "maxNotional": 30000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", - "notionalCap": "60000", - "notionalFloor": "10000", + "initialLeverage": "10", + "notionalCap": "30000", + "notionalFloor": "7000", "maintMarginRatio": "0.015", - "cum": "50.0" + "cum": "35.0" } }, { "tier": 3.0, "symbol": "EIGEN/USDT:USDT", "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 300000.0, + "minNotional": 30000.0, + "maxNotional": 135000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "300000", - "notionalFloor": "60000", + "initialLeverage": "8", + "notionalCap": "135000", + "notionalFloor": "30000", "maintMarginRatio": "0.02", - "cum": "350.0" + "cum": "185.0" } }, { "tier": 4.0, "symbol": "EIGEN/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 135000.0, + "maxNotional": 270000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "300000", + "initialLeverage": "7", + "notionalCap": "270000", + "notionalFloor": "135000", "maintMarginRatio": "0.025", - "cum": "1850.0" + "cum": "860.0" } }, { "tier": 5.0, "symbol": "EIGEN/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 3000000.0, + "minNotional": 270000.0, + "maxNotional": 950000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "3000000", - "notionalFloor": "600000", + "initialLeverage": "6", + "notionalCap": "950000", + "notionalFloor": "270000", "maintMarginRatio": "0.05", - "cum": "16850.0" + "cum": "7610.0" } }, { "tier": 6.0, "symbol": "EIGEN/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "minNotional": 950000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "1500000", + "notionalFloor": "950000", "maintMarginRatio": "0.1", - "cum": "166850.0" + "cum": "55110.0" } }, { "tier": 7.0, "symbol": "EIGEN/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "minNotional": 1500000.0, + "maxNotional": 2200000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "7500000", - "notionalFloor": "6000000", + "notionalCap": "2200000", + "notionalFloor": "1500000", "maintMarginRatio": "0.125", - "cum": "316850.0" + "cum": "92610.0" } }, { "tier": 8.0, "symbol": "EIGEN/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 2200000.0, + "maxNotional": 3500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "15000000", - "notionalFloor": "7500000", - "maintMarginRatio": "0.25", - "cum": "1254350.0" + "initialLeverage": "3", + "notionalCap": "3500000", + "notionalFloor": "2200000", + "maintMarginRatio": "0.1667", + "cum": "184350.0" } }, { "tier": 9.0, "symbol": "EIGEN/USDT:USDT", "currency": "USDT", - "minNotional": 15000000.0, - "maxNotional": 30000000.0, + "minNotional": 3500000.0, + "maxNotional": 4800000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "4800000", + "notionalFloor": "3500000", + "maintMarginRatio": "0.25", + "cum": "475900.0" + } + }, + { + "tier": 10.0, + "symbol": "EIGEN/USDT:USDT", + "currency": "USDT", + "minNotional": 4800000.0, + "maxNotional": 6800000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "15000000", + "notionalCap": "6800000", + "notionalFloor": "4800000", "maintMarginRatio": "0.5", - "cum": "5004350.0" + "cum": "1675900.0" } } ], @@ -21755,13 +24250,13 @@ "symbol": "EOS/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, - "maxNotional": 5000000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "7", "initialLeverage": "5", - "notionalCap": "5000000", + "notionalCap": "3000000", "notionalFloor": "2000000", "maintMarginRatio": "0.1", "cum": "114450.0" @@ -21771,51 +24266,361 @@ "tier": 8.0, "symbol": "EOS/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 20000000.0, + "minNotional": 3000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "8", "initialLeverage": "4", - "notionalCap": "20000000", - "notionalFloor": "5000000", + "notionalCap": "4000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.125", - "cum": "239450.0" + "cum": "189450.0" } }, { "tier": 9.0, "symbol": "EOS/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 30000000.0, + "minNotional": 4000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "30000000", - "notionalFloor": "20000000", + "notionalCap": "5000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.25", - "cum": "2739450.0" + "cum": "689450.0" } }, { "tier": 10.0, "symbol": "EOS/USDT:USDT", "currency": "USDT", - "minNotional": 30000000.0, - "maxNotional": 50000000.0, + "minNotional": 5000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "30000000", + "notionalCap": "6000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "10239450.0" + "cum": "1939450.0" + } + } + ], + "EPIC/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "EPIC/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, + "symbol": "EPIC/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 15.0, + "info": { + "bracket": "2", + "initialLeverage": "15", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "EPIC/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "EPIC/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 6.0, + "info": { + "bracket": "4", + "initialLeverage": "6", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "EPIC/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "EPIC/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "16725.0" + } + }, + { + "tier": 7.0, + "symbol": "EPIC/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "EPIC/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": "EPIC/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" + } + } + ], + "EPT/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "EPT/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": "EPT/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "EPT/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "EPT/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "125000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1325.0" + } + }, + { + "tier": 5.0, + "symbol": "EPT/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.1", + "cum": "7575.0" + } + }, + { + "tier": 6.0, + "symbol": "EPT/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "13825.0" + } + }, + { + "tier": 7.0, + "symbol": "EPT/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "1500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34675.0" + } + }, + { + "tier": 8.0, + "symbol": "EPT/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.25", + "cum": "159625.0" + } + }, + { + "tier": 9.0, + "symbol": "EPT/USDT:USDT", + "currency": "USDT", + "minNotional": 2500000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "4000000", + "notionalFloor": "2500000", + "maintMarginRatio": "0.5", + "cum": "784625.0" } } ], @@ -21910,13 +24715,13 @@ "symbol": "ETC/USDT:USDT", "currency": "USDT", "minNotional": 800000.0, - "maxNotional": 4000000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "6", "initialLeverage": "10", - "notionalCap": "4000000", + "notionalCap": "3000000", "notionalFloor": "800000", "maintMarginRatio": "0.05", "cum": "22700.0" @@ -21926,68 +24731,68 @@ "tier": 7.0, "symbol": "ETC/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "7", "initialLeverage": "5", - "notionalCap": "8000000", - "notionalFloor": "4000000", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.1", - "cum": "222700.0" + "cum": "172700.0" } }, { "tier": 8.0, "symbol": "ETC/USDT:USDT", "currency": "USDT", - "minNotional": 8000000.0, - "maxNotional": 20000000.0, + "minNotional": 5000000.0, + "maxNotional": 7000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "8", "initialLeverage": "4", - "notionalCap": "20000000", - "notionalFloor": "8000000", + "notionalCap": "7000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.125", - "cum": "422700.0" + "cum": "297700.0" } }, { "tier": 9.0, "symbol": "ETC/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 30000000.0, + "minNotional": 7000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "30000000", - "notionalFloor": "20000000", + "notionalCap": "8000000", + "notionalFloor": "7000000", "maintMarginRatio": "0.25", - "cum": "2922700.0" + "cum": "1172700.0" } }, { "tier": 10.0, "symbol": "ETC/USDT:USDT", "currency": "USDT", - "minNotional": 30000000.0, - "maxNotional": 50000000.0, + "minNotional": 8000000.0, + "maxNotional": 9000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "30000000", + "notionalCap": "9000000", + "notionalFloor": "8000000", "maintMarginRatio": "0.5", - "cum": "10422700.0" + "cum": "3172700.0" } } ], @@ -22558,144 +25363,6 @@ } } ], - "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" - } - } - ], "ETH/USDT:USDT-250627": [ { "tier": 1.0, @@ -22834,6 +25501,144 @@ } } ], + "ETH/USDT:USDT-250926": [ + { + "tier": 1.0, + "symbol": "ETH/USDT:USDT-250926", + "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-250926", + "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-250926", + "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-250926", + "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-250926", + "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-250926", + "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-250926", + "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-250926", + "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, @@ -22842,10 +25647,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -22859,10 +25664,10 @@ "minNotional": 5000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "50000", "notionalFloor": "5000", "maintMarginRatio": "0.02", @@ -22876,10 +25681,10 @@ "minNotional": 50000.0, "maxNotional": 600000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "600000", "notionalFloor": "50000", "maintMarginRatio": "0.025", @@ -22893,10 +25698,10 @@ "minNotional": 600000.0, "maxNotional": 1200000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "1200000", "notionalFloor": "600000", "maintMarginRatio": "0.05", @@ -22910,10 +25715,10 @@ "minNotional": 1200000.0, "maxNotional": 3000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "3000000", "notionalFloor": "1200000", "maintMarginRatio": "0.1", @@ -22927,10 +25732,10 @@ "minNotional": 3000000.0, "maxNotional": 4000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "6", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "4000000", "notionalFloor": "3000000", "maintMarginRatio": "0.125", @@ -22980,10 +25785,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -22997,10 +25802,10 @@ "minNotional": 10000.0, "maxNotional": 40000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "40000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -23014,10 +25819,10 @@ "minNotional": 40000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 7.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "7", "notionalCap": "200000", "notionalFloor": "40000", "maintMarginRatio": "0.02", @@ -23031,10 +25836,10 @@ "minNotional": 200000.0, "maxNotional": 400000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "400000", "notionalFloor": "200000", "maintMarginRatio": "0.025", @@ -23048,10 +25853,10 @@ "minNotional": 400000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "2000000", "notionalFloor": "400000", "maintMarginRatio": "0.05", @@ -23065,10 +25870,10 @@ "minNotional": 2000000.0, "maxNotional": 4000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "4000000", "notionalFloor": "2000000", "maintMarginRatio": "0.1", @@ -23082,10 +25887,10 @@ "minNotional": 4000000.0, "maxNotional": 5000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "5000000", "notionalFloor": "4000000", "maintMarginRatio": "0.125", @@ -23288,13 +26093,13 @@ "symbol": "FARTCOIN/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, + "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "25", - "notionalCap": "10000", + "initialLeverage": "75", + "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -23304,17 +26109,17 @@ "tier": 2.0, "symbol": "FARTCOIN/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, + "minNotional": 5000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 20.0, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "50", "notionalCap": "20000", - "notionalFloor": "10000", + "notionalFloor": "5000", "maintMarginRatio": "0.015", - "cum": "50.0" + "cum": "25.0" } }, { @@ -23322,50 +26127,50 @@ "symbol": "FARTCOIN/USDT:USDT", "currency": "USDT", "minNotional": 20000.0, - "maxNotional": 100000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 15.0, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "15", - "notionalCap": "100000", + "initialLeverage": "25", + "notionalCap": "300000", "notionalFloor": "20000", "maintMarginRatio": "0.02", - "cum": "150.0" + "cum": "125.0" } }, { "tier": 4.0, "symbol": "FARTCOIN/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 200000.0, + "minNotional": 300000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxLeverage": 20.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "100000", + "initialLeverage": "20", + "notionalCap": "500000", + "notionalFloor": "300000", "maintMarginRatio": "0.025", - "cum": "650.0" + "cum": "1625.0" } }, { "tier": 5.0, "symbol": "FARTCOIN/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, + "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "maxLeverage": 10.0, "info": { "bracket": "5", - "initialLeverage": "8", + "initialLeverage": "10", "notionalCap": "1000000", - "notionalFloor": "200000", + "notionalFloor": "500000", "maintMarginRatio": "0.05", - "cum": "5650.0" + "cum": "14125.0" } }, { @@ -23382,7 +26187,7 @@ "notionalCap": "2000000", "notionalFloor": "1000000", "maintMarginRatio": "0.1", - "cum": "55650.0" + "cum": "64125.0" } }, { @@ -23399,7 +26204,7 @@ "notionalCap": "2500000", "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "105650.0" + "cum": "114125.0" } }, { @@ -23416,7 +26221,7 @@ "notionalCap": "5000000", "notionalFloor": "2500000", "maintMarginRatio": "0.25", - "cum": "418150.0" + "cum": "426625.0" } }, { @@ -23433,7 +26238,7 @@ "notionalCap": "6000000", "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1668150.0" + "cum": "1676625.0" } } ], @@ -23511,13 +26316,13 @@ "symbol": "FET/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 5000000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "5000000", + "notionalCap": "3000000", "notionalFloor": "1000000", "maintMarginRatio": "0.05", "cum": "28050.0" @@ -23527,68 +26332,189 @@ "tier": 6.0, "symbol": "FET/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.1", - "cum": "278050.0" + "cum": "178050.0" } }, { "tier": 7.0, "symbol": "FET/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 12500000.0, + "minNotional": 5000000.0, + "maxNotional": 7000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "12500000", - "notionalFloor": "10000000", + "notionalCap": "7000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.125", - "cum": "528050.0" + "cum": "303050.0" } }, { "tier": 8.0, "symbol": "FET/USDT:USDT", "currency": "USDT", - "minNotional": 12500000.0, - "maxNotional": 25000000.0, + "minNotional": 7000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "25000000", - "notionalFloor": "12500000", + "notionalCap": "8000000", + "notionalFloor": "7000000", "maintMarginRatio": "0.25", - "cum": "2090550.0" + "cum": "1178050.0" } }, { "tier": 9.0, "symbol": "FET/USDT:USDT", "currency": "USDT", - "minNotional": 25000000.0, - "maxNotional": 50000000.0, + "minNotional": 8000000.0, + "maxNotional": 9000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "25000000", + "notionalCap": "9000000", + "notionalFloor": "8000000", "maintMarginRatio": "0.5", - "cum": "8340550.0" + "cum": "3178050.0" + } + } + ], + "FHE/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "FHE/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "1", + "initialLeverage": "20", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.025", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "FHE/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.033, + "maxLeverage": 15.0, + "info": { + "bracket": "2", + "initialLeverage": "15", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.033", + "cum": "40.0" + } + }, + { + "tier": 3.0, + "symbol": "FHE/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": "465.0" + } + }, + { + "tier": 4.0, + "symbol": "FHE/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": "5465.0" + } + }, + { + "tier": 5.0, + "symbol": "FHE/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": "10465.0" + } + }, + { + "tier": 6.0, + "symbol": "FHE/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": "72965.0" + } + }, + { + "tier": 7.0, + "symbol": "FHE/USDT:USDT", + "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": "322965.0" } } ], @@ -23600,10 +26526,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -23617,10 +26543,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -23634,10 +26560,10 @@ "minNotional": 10000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -23651,10 +26577,10 @@ "minNotional": 50000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.025", @@ -23668,10 +26594,10 @@ "minNotional": 100000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "500000", "notionalFloor": "100000", "maintMarginRatio": "0.05", @@ -23685,10 +26611,10 @@ "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.1", @@ -23702,10 +26628,10 @@ "minNotional": 1000000.0, "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "1250000", "notionalFloor": "1000000", "maintMarginRatio": "0.125", @@ -24082,10 +27008,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -24099,10 +27025,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -24116,10 +27042,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -24133,10 +27059,10 @@ "minNotional": 30000.0, "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "60000", "notionalFloor": "30000", "maintMarginRatio": "0.025", @@ -24150,10 +27076,10 @@ "minNotional": 60000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "300000", "notionalFloor": "60000", "maintMarginRatio": "0.05", @@ -24167,10 +27093,10 @@ "minNotional": 300000.0, "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "600000", "notionalFloor": "300000", "maintMarginRatio": "0.1", @@ -24184,10 +27110,10 @@ "minNotional": 600000.0, "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "750000", "notionalFloor": "600000", "maintMarginRatio": "0.125", @@ -24229,21 +27155,193 @@ } } ], + "FIS/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "FIS/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": "FIS/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": "FIS/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "FIS/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "200.0" + } + }, + { + "tier": 5.0, + "symbol": "FIS/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "125000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1450.0" + } + }, + { + "tier": 6.0, + "symbol": "FIS/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.1", + "cum": "7700.0" + } + }, + { + "tier": 7.0, + "symbol": "FIS/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "13950.0" + } + }, + { + "tier": 8.0, + "symbol": "FIS/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "1500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34800.0" + } + }, + { + "tier": 9.0, + "symbol": "FIS/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.25", + "cum": "159750.0" + } + }, + { + "tier": 10.0, + "symbol": "FIS/USDT:USDT", + "currency": "USDT", + "minNotional": 2500000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "4000000", + "notionalFloor": "2500000", + "maintMarginRatio": "0.5", + "cum": "784750.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, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 15.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "15", + "notionalCap": "20000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -24251,72 +27349,55 @@ "tier": 2.0, "symbol": "FLM/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 20000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "initialLeverage": "10", + "notionalCap": "25000", + "notionalFloor": "20000", + "maintMarginRatio": "0.025", + "cum": "100.0" } }, { "tier": 3.0, "symbol": "FLM/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 25000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "20000", - "maintMarginRatio": "0.025", - "cum": "125.0" + "initialLeverage": "6", + "notionalCap": "200000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "725.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", + "bracket": "4", "initialLeverage": "5", "notionalCap": "400000", "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "10750.0" + "cum": "10725.0" } }, { - "tier": 6.0, + "tier": 5.0, "symbol": "FLM/USDT:USDT", "currency": "USDT", "minNotional": 400000.0, @@ -24324,19 +27405,36 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "500000", "notionalFloor": "400000", "maintMarginRatio": "0.125", - "cum": "20750.0" + "cum": "20725.0" + } + }, + { + "tier": 6.0, + "symbol": "FLM/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "6", + "initialLeverage": "3", + "notionalCap": "750000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "41575.0" } }, { "tier": 7.0, "symbol": "FLM/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, + "minNotional": 750000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, @@ -24344,9 +27442,9 @@ "bracket": "7", "initialLeverage": "2", "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "83250.0" + "cum": "104050.0" } }, { @@ -24363,7 +27461,7 @@ "notionalCap": "2000000", "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "333250.0" + "cum": "354050.0" } } ], @@ -24677,6 +27775,265 @@ } } ], + "FORM/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "FORM/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": "FORM/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": "FORM/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": "FORM/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": "FORM/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": "FORM/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": "FORM/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": "FORM/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" + } + } + ], + "FORTH/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "FORTH/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": "FORTH/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 10.0, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "FORTH/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 5.0, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "60000", + "notionalFloor": "10000", + "maintMarginRatio": "0.05", + "cum": "275.0" + } + }, + { + "tier": 4.0, + "symbol": "FORTH/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 4.0, + "info": { + "bracket": "4", + "initialLeverage": "4", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.1", + "cum": "3275.0" + } + }, + { + "tier": 5.0, + "symbol": "FORTH/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 3.0, + "info": { + "bracket": "5", + "initialLeverage": "3", + "notionalCap": "400000", + "notionalFloor": "300000", + "maintMarginRatio": "0.125", + "cum": "10775.0" + } + }, + { + "tier": 6.0, + "symbol": "FORTH/USDT:USDT", + "currency": "USDT", + "minNotional": 400000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "1000000", + "notionalFloor": "400000", + "maintMarginRatio": "0.25", + "cum": "60775.0" + } + }, + { + "tier": 7.0, + "symbol": "FORTH/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.5", + "cum": "310775.0" + } + } + ], "FTM/USDT:USDT": [ { "tier": 1.0, @@ -24936,6 +28293,144 @@ } } ], + "FUN/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "FUN/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 25.0, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.015", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "FUN/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "20000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "FUN/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "30000", + "notionalFloor": "20000", + "maintMarginRatio": "0.025", + "cum": "125.0" + } + }, + { + "tier": 4.0, + "symbol": "FUN/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "300000", + "notionalFloor": "30000", + "maintMarginRatio": "0.05", + "cum": "875.0" + } + }, + { + "tier": 5.0, + "symbol": "FUN/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "15875.0" + } + }, + { + "tier": 6.0, + "symbol": "FUN/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 3.0, + "info": { + "bracket": "6", + "initialLeverage": "3", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "30875.0" + } + }, + { + "tier": 7.0, + "symbol": "FUN/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": "FUN/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" + } + } + ], "FXS/USDT:USDT": [ { "tier": 1.0, @@ -25184,15 +28679,15 @@ "symbol": "GALA/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", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.006", + "maintMarginRatio": "0.01", "cum": "0.0" } }, @@ -25200,153 +28695,153 @@ "tier": 2.0, "symbol": "GALA/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": "40.0" + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" } }, { "tier": 3.0, "symbol": "GALA/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 80000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 40.0, + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "40", - "notionalCap": "80000", - "notionalFloor": "50000", - "maintMarginRatio": "0.015", - "cum": "290.0" + "initialLeverage": "25", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" } }, { "tier": 4.0, "symbol": "GALA/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 200000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "4", - "initialLeverage": "25", - "notionalCap": "200000", - "notionalFloor": "80000", - "maintMarginRatio": "0.02", - "cum": "690.0" + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "200.0" } }, { "tier": 5.0, "symbol": "GALA/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 900000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 50000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "5", - "initialLeverage": "20", - "notionalCap": "900000", - "notionalFloor": "200000", - "maintMarginRatio": "0.025", - "cum": "1690.0" + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1450.0" } }, { "tier": 6.0, "symbol": "GALA/USDT:USDT", "currency": "USDT", - "minNotional": 900000.0, - "maxNotional": 2000000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "6", - "initialLeverage": "10", - "notionalCap": "2000000", - "notionalFloor": "900000", - "maintMarginRatio": "0.05", - "cum": "24190.0" + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "13950.0" } }, { "tier": 7.0, "symbol": "GALA/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "7", - "initialLeverage": "5", - "notionalCap": "5000000", - "notionalFloor": "2000000", - "maintMarginRatio": "0.1", - "cum": "124190.0" + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "26450.0" } }, { "tier": 8.0, "symbol": "GALA/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 6000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "4", - "notionalCap": "6000000", - "notionalFloor": "5000000", - "maintMarginRatio": "0.125", - "cum": "249190.0" + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1667", + "cum": "68150.0" } }, { "tier": 9.0, "symbol": "GALA/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 18000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "18000000", - "notionalFloor": "6000000", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.25", - "cum": "999190.0" + "cum": "318050.0" } }, { "tier": 10.0, "symbol": "GALA/USDT:USDT", "currency": "USDT", - "minNotional": 18000000.0, - "maxNotional": 30000000.0, + "minNotional": 5000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "18000000", + "notionalCap": "8000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "5499190.0" + "cum": "1568050.0" } } ], @@ -25668,10 +29163,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.015", @@ -25685,10 +29180,10 @@ "minNotional": 5000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "20000", "notionalFloor": "5000", "maintMarginRatio": "0.02", @@ -25702,10 +29197,10 @@ "minNotional": 20000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "30000", "notionalFloor": "20000", "maintMarginRatio": "0.025", @@ -25719,10 +29214,10 @@ "minNotional": 30000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "4", - "initialLeverage": "10", + "initialLeverage": "8", "notionalCap": "300000", "notionalFloor": "30000", "maintMarginRatio": "0.05", @@ -25768,13 +29263,13 @@ "symbol": "GLM/USDT:USDT", "currency": "USDT", "minNotional": 750000.0, - "maxNotional": 1500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "1500000", + "notionalCap": "1000000", "notionalFloor": "750000", "maintMarginRatio": "0.25", "cum": "124625.0" @@ -25784,17 +29279,17 @@ "tier": 8.0, "symbol": "GLM/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": "374625.0" } } ], @@ -25908,15 +29403,15 @@ "symbol": "GMT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "50000", + "initialLeverage": "75", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, @@ -25924,102 +29419,153 @@ "tier": 2.0, "symbol": "GMT/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 150000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "150000", - "notionalFloor": "50000", - "maintMarginRatio": "0.025", - "cum": "500.0" + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" } }, { "tier": 3.0, "symbol": "GMT/USDT:USDT", "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 600000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "600000", - "notionalFloor": "150000", - "maintMarginRatio": "0.05", - "cum": "4250.0" + "initialLeverage": "25", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" } }, { "tier": 4.0, "symbol": "GMT/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 1600000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "1600000", - "notionalFloor": "600000", - "maintMarginRatio": "0.1", - "cum": "34250.0" + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "200.0" } }, { "tier": 5.0, "symbol": "GMT/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 2000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 50000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1600000", - "maintMarginRatio": "0.125", - "cum": "74250.0" + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1450.0" } }, { "tier": 6.0, "symbol": "GMT/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "6", - "initialLeverage": "2", - "notionalCap": "4000000", - "notionalFloor": "2000000", - "maintMarginRatio": "0.25", - "cum": "324250.0" + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "13950.0" } }, { "tier": 7.0, "symbol": "GMT/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "26450.0" + } + }, + { + "tier": 8.0, + "symbol": "GMT/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1667", + "cum": "68150.0" + } + }, + { + "tier": 9.0, + "symbol": "GMT/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.25", + "cum": "318050.0" + } + }, + { + "tier": 10.0, + "symbol": "GMT/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "4000000", + "notionalCap": "8000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1324250.0" + "cum": "1568050.0" } } ], @@ -26150,13 +29696,13 @@ "symbol": "GOAT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, + "maxNotional": 4600.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "25", - "notionalCap": "10000", + "initialLeverage": "20", + "notionalCap": "4600", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -26166,136 +29712,291 @@ "tier": 2.0, "symbol": "GOAT/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 80000.0, + "minNotional": 4600.0, + "maxNotional": 35000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "80000", - "notionalFloor": "10000", + "initialLeverage": "10", + "notionalCap": "35000", + "notionalFloor": "4600", "maintMarginRatio": "0.015", - "cum": "50.0" + "cum": "23.0" } }, { "tier": 3.0, "symbol": "GOAT/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 400000.0, + "minNotional": 35000.0, + "maxNotional": 175000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 15.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "15", - "notionalCap": "400000", - "notionalFloor": "80000", + "initialLeverage": "8", + "notionalCap": "175000", + "notionalFloor": "35000", "maintMarginRatio": "0.02", - "cum": "450.0" + "cum": "198.0" } }, { "tier": 4.0, "symbol": "GOAT/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 800000.0, + "minNotional": 175000.0, + "maxNotional": 350000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "800000", - "notionalFloor": "400000", + "initialLeverage": "7", + "notionalCap": "350000", + "notionalFloor": "175000", "maintMarginRatio": "0.025", - "cum": "2450.0" + "cum": "1073.0" } }, { "tier": 5.0, "symbol": "GOAT/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 4000000.0, + "minNotional": 350000.0, + "maxNotional": 1350000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "8", - "notionalCap": "4000000", - "notionalFloor": "800000", + "initialLeverage": "6", + "notionalCap": "1350000", + "notionalFloor": "350000", "maintMarginRatio": "0.05", - "cum": "22450.0" + "cum": "9823.0" } }, { "tier": 6.0, "symbol": "GOAT/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "minNotional": 1350000.0, + "maxNotional": 1900000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "8000000", - "notionalFloor": "4000000", + "notionalCap": "1900000", + "notionalFloor": "1350000", "maintMarginRatio": "0.1", - "cum": "222450.0" + "cum": "77323.0" } }, { "tier": 7.0, "symbol": "GOAT/USDT:USDT", "currency": "USDT", - "minNotional": 8000000.0, - "maxNotional": 10000000.0, + "minNotional": 1900000.0, + "maxNotional": 2600000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "10000000", - "notionalFloor": "8000000", + "notionalCap": "2600000", + "notionalFloor": "1900000", "maintMarginRatio": "0.125", - "cum": "422450.0" + "cum": "124823.0" } }, { "tier": 8.0, "symbol": "GOAT/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 2600000.0, + "maxNotional": 3900000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "20000000", - "notionalFloor": "10000000", - "maintMarginRatio": "0.25", - "cum": "1672450.0" + "initialLeverage": "3", + "notionalCap": "3900000", + "notionalFloor": "2600000", + "maintMarginRatio": "0.1667", + "cum": "233243.0" } }, { "tier": 9.0, "symbol": "GOAT/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 21000000.0, + "minNotional": 3900000.0, + "maxNotional": 5200000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5200000", + "notionalFloor": "3900000", + "maintMarginRatio": "0.25", + "cum": "558113.0" + } + }, + { + "tier": 10.0, + "symbol": "GOAT/USDT:USDT", + "currency": "USDT", + "minNotional": 5200000.0, + "maxNotional": 7200000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "21000000", - "notionalFloor": "20000000", + "notionalCap": "7200000", + "notionalFloor": "5200000", "maintMarginRatio": "0.5", - "cum": "6672450.0" + "cum": "1858113.0" + } + } + ], + "GPS/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "GPS/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": "GPS/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": "GPS/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": "GPS/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": "GPS/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "23150.0" + } + }, + { + "tier": 6.0, + "symbol": "GPS/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1125000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "6", + "initialLeverage": "3", + "notionalCap": "1125000", + "notionalFloor": "750000", + "maintMarginRatio": "0.1667", + "cum": "54425.0" + } + }, + { + "tier": 7.0, + "symbol": "GPS/USDT:USDT", + "currency": "USDT", + "minNotional": 1125000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "1125000", + "maintMarginRatio": "0.25", + "cum": "148137.5" + } + }, + { + "tier": 8.0, + "symbol": "GPS/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": "523137.5" } } ], @@ -26738,10 +30439,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -26755,10 +30456,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -26772,10 +30473,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -26789,10 +30490,10 @@ "minNotional": 30000.0, "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "60000", "notionalFloor": "30000", "maintMarginRatio": "0.025", @@ -26806,10 +30507,10 @@ "minNotional": 60000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "300000", "notionalFloor": "60000", "maintMarginRatio": "0.05", @@ -26823,10 +30524,10 @@ "minNotional": 300000.0, "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "600000", "notionalFloor": "300000", "maintMarginRatio": "0.1", @@ -26840,10 +30541,10 @@ "minNotional": 600000.0, "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "750000", "notionalFloor": "600000", "maintMarginRatio": "0.125", @@ -26885,6 +30586,471 @@ } } ], + "GUN/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "GUN/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": "GUN/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": "GUN/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": "GUN/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": "GUN/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": "GUN/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": "GUN/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": "GUN/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": "GUN/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" + } + } + ], + "HAEDAL/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "HAEDAL/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": "HAEDAL/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "HAEDAL/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "HAEDAL/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "125000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1325.0" + } + }, + { + "tier": 5.0, + "symbol": "HAEDAL/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.1", + "cum": "7575.0" + } + }, + { + "tier": 6.0, + "symbol": "HAEDAL/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "13825.0" + } + }, + { + "tier": 7.0, + "symbol": "HAEDAL/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "1500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34675.0" + } + }, + { + "tier": 8.0, + "symbol": "HAEDAL/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.25", + "cum": "159625.0" + } + }, + { + "tier": 9.0, + "symbol": "HAEDAL/USDT:USDT", + "currency": "USDT", + "minNotional": 2500000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "4000000", + "notionalFloor": "2500000", + "maintMarginRatio": "0.5", + "cum": "784625.0" + } + } + ], + "HBAR/USDC:USDC": [ + { + "tier": 1.0, + "symbol": "HBAR/USDC:USDC", + "currency": "USDC", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 25.0, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "HBAR/USDC:USDC", + "currency": "USDC", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "HBAR/USDC:USDC", + "currency": "USDC", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 15.0, + "info": { + "bracket": "3", + "initialLeverage": "15", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "HBAR/USDC:USDC", + "currency": "USDC", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "HBAR/USDC:USDC", + "currency": "USDC", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 8.0, + "info": { + "bracket": "5", + "initialLeverage": "8", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "HBAR/USDC:USDC", + "currency": "USDC", + "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": "HBAR/USDC:USDC", + "currency": "USDC", + "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": "HBAR/USDC:USDC", + "currency": "USDC", + "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": "HBAR/USDC:USDC", + "currency": "USDC", + "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, @@ -27040,6 +31206,161 @@ } } ], + "HEI/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "HEI/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, + "symbol": "HEI/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 15.0, + "info": { + "bracket": "2", + "initialLeverage": "15", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "HEI/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "HEI/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 6.0, + "info": { + "bracket": "4", + "initialLeverage": "6", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "HEI/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "HEI/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "16725.0" + } + }, + { + "tier": 7.0, + "symbol": "HEI/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "HEI/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": "HEI/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" + } + } + ], "HFT/USDT:USDT": [ { "tier": 1.0, @@ -27411,10 +31732,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -27428,10 +31749,10 @@ "minNotional": 5000.0, "maxNotional": 16000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "16000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -27445,10 +31766,10 @@ "minNotional": 16000.0, "maxNotional": 80000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 15.0, + "maxLeverage": 7.0, "info": { "bracket": "3", - "initialLeverage": "15", + "initialLeverage": "7", "notionalCap": "80000", "notionalFloor": "16000", "maintMarginRatio": "0.02", @@ -27462,10 +31783,10 @@ "minNotional": 80000.0, "maxNotional": 160000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "160000", "notionalFloor": "80000", "maintMarginRatio": "0.025", @@ -27479,10 +31800,10 @@ "minNotional": 160000.0, "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "8", + "initialLeverage": "5", "notionalCap": "800000", "notionalFloor": "160000", "maintMarginRatio": "0.05", @@ -27496,10 +31817,10 @@ "minNotional": 800000.0, "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1600000", "notionalFloor": "800000", "maintMarginRatio": "0.1", @@ -27513,10 +31834,10 @@ "minNotional": 1600000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "2000000", "notionalFloor": "1600000", "maintMarginRatio": "0.125", @@ -27721,10 +32042,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -27738,10 +32059,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -27755,10 +32076,10 @@ "minNotional": 20000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "8", "notionalCap": "100000", "notionalFloor": "20000", "maintMarginRatio": "0.02", @@ -27772,10 +32093,10 @@ "minNotional": 100000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "7", "notionalCap": "200000", "notionalFloor": "100000", "maintMarginRatio": "0.025", @@ -27789,10 +32110,10 @@ "minNotional": 200000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "1000000", "notionalFloor": "200000", "maintMarginRatio": "0.05", @@ -27838,33 +32159,50 @@ "symbol": "HMSTR/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maxNotional": 3750000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "5000000", + "initialLeverage": "3", + "notionalCap": "3750000", "notionalFloor": "2500000", - "maintMarginRatio": "0.25", - "cum": "418150.0" + "maintMarginRatio": "0.1667", + "cum": "209900.0" } }, { "tier": 9.0, "symbol": "HMSTR/USDT:USDT", "currency": "USDT", + "minNotional": 3750000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3750000", + "maintMarginRatio": "0.25", + "cum": "522275.0" + } + }, + { + "tier": 10.0, + "symbol": "HMSTR/USDT:USDT", + "currency": "USDT", "minNotional": 5000000.0, "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", "notionalCap": "10000000", "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1668150.0" + "cum": "1772275.0" } } ], @@ -27980,6 +32318,178 @@ "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, + "symbol": "HOT/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 15.0, + "info": { + "bracket": "2", + "initialLeverage": "15", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "HOT/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 35000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "35000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "HOT/USDT:USDT", + "currency": "USDT", + "minNotional": 35000.0, + "maxNotional": 70000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 7.0, + "info": { + "bracket": "4", + "initialLeverage": "7", + "notionalCap": "70000", + "notionalFloor": "35000", + "maintMarginRatio": "0.025", + "cum": "250.0" + } + }, + { + "tier": 5.0, + "symbol": "HOT/USDT:USDT", + "currency": "USDT", + "minNotional": 70000.0, + "maxNotional": 350000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, + "info": { + "bracket": "5", + "initialLeverage": "6", + "notionalCap": "350000", + "notionalFloor": "70000", + "maintMarginRatio": "0.05", + "cum": "2000.0" + } + }, + { + "tier": 6.0, + "symbol": "HOT/USDT:USDT", + "currency": "USDT", + "minNotional": 350000.0, + "maxNotional": 700000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "700000", + "notionalFloor": "350000", + "maintMarginRatio": "0.1", + "cum": "19500.0" + } + }, + { + "tier": 7.0, + "symbol": "HOT/USDT:USDT", + "currency": "USDT", + "minNotional": 700000.0, + "maxNotional": 1100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "1100000", + "notionalFloor": "700000", + "maintMarginRatio": "0.125", + "cum": "37000.0" + } + }, + { + "tier": 8.0, + "symbol": "HOT/USDT:USDT", + "currency": "USDT", + "minNotional": 1100000.0, + "maxNotional": 2550000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "2550000", + "notionalFloor": "1100000", + "maintMarginRatio": "0.1667", + "cum": "82870.0" + } + }, + { + "tier": 9.0, + "symbol": "HOT/USDT:USDT", + "currency": "USDT", + "minNotional": 2550000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "4000000", + "notionalFloor": "2550000", + "maintMarginRatio": "0.25", + "cum": "295285.0" + } + }, + { + "tier": 10.0, + "symbol": "HOT/USDT:USDT", + "currency": "USDT", + "minNotional": 4000000.0, + "maxNotional": 6800000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "6800000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.5", + "cum": "1295285.0" + } + } + ], + "HYPER/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "HYPER/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", @@ -27992,7 +32502,7 @@ }, { "tier": 2.0, - "symbol": "HOT/USDT:USDT", + "symbol": "HYPER/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -28009,16 +32519,16 @@ }, { "tier": 3.0, - "symbol": "HOT/USDT:USDT", + "symbol": "HYPER/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 50000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "50000", + "notionalCap": "25000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -28026,104 +32536,121 @@ }, { "tier": 4.0, - "symbol": "HOT/USDT:USDT", + "symbol": "HYPER/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "100000", - "notionalFloor": "50000", + "notionalCap": "50000", + "notionalFloor": "25000", "maintMarginRatio": "0.025", - "cum": "325.0" + "cum": "200.0" } }, { "tier": 5.0, - "symbol": "HOT/USDT:USDT", + "symbol": "HYPER/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 500000.0, + "minNotional": 50000.0, + "maxNotional": 125000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "500000", - "notionalFloor": "100000", + "notionalCap": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.05", - "cum": "2825.0" + "cum": "1450.0" } }, { "tier": 6.0, - "symbol": "HOT/USDT:USDT", + "symbol": "HYPER/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 125000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "250000", + "notionalFloor": "125000", "maintMarginRatio": "0.1", - "cum": "27825.0" + "cum": "7700.0" } }, { "tier": 7.0, - "symbol": "HOT/USDT:USDT", + "symbol": "HYPER/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 1250000.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "1250000", - "notionalFloor": "1000000", + "notionalCap": "500000", + "notionalFloor": "250000", "maintMarginRatio": "0.125", - "cum": "52825.0" + "cum": "13950.0" } }, { "tier": 8.0, - "symbol": "HOT/USDT:USDT", + "symbol": "HYPER/USDT:USDT", "currency": "USDT", - "minNotional": 1250000.0, - "maxNotional": 2500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 500000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "2500000", - "notionalFloor": "1250000", - "maintMarginRatio": "0.25", - "cum": "209075.0" + "initialLeverage": "3", + "notionalCap": "1500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34800.0" } }, { "tier": 9.0, - "symbol": "HOT/USDT:USDT", + "symbol": "HYPER/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.25", + "cum": "159750.0" + } + }, + { + "tier": 10.0, + "symbol": "HYPER/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "5000000", + "notionalCap": "4000000", "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "834075.0" + "cum": "784750.0" } } ], @@ -28428,10 +32955,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -28445,10 +32972,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -28462,10 +32989,10 @@ "minNotional": 10000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -28479,10 +33006,10 @@ "minNotional": 50000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.025", @@ -28496,10 +33023,10 @@ "minNotional": 100000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "500000", "notionalFloor": "100000", "maintMarginRatio": "0.05", @@ -28513,10 +33040,10 @@ "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.1", @@ -28530,10 +33057,10 @@ "minNotional": 1000000.0, "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "1250000", "notionalFloor": "1000000", "maintMarginRatio": "0.125", @@ -28938,6 +33465,178 @@ } } ], + "INIT/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "INIT/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": "INIT/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": "INIT/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "INIT/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "200.0" + } + }, + { + "tier": 5.0, + "symbol": "INIT/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1450.0" + } + }, + { + "tier": 6.0, + "symbol": "INIT/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "13950.0" + } + }, + { + "tier": 7.0, + "symbol": "INIT/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "26450.0" + } + }, + { + "tier": 8.0, + "symbol": "INIT/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1667", + "cum": "68150.0" + } + }, + { + "tier": 9.0, + "symbol": "INIT/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.25", + "cum": "318050.0" + } + }, + { + "tier": 10.0, + "symbol": "INIT/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 8000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "8000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.5", + "cum": "1568050.0" + } + } + ], "INJ/USDT:USDT": [ { "tier": 1.0, @@ -29029,13 +33728,13 @@ "symbol": "INJ/USDT:USDT", "currency": "USDT", "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "8000000", + "notionalCap": "5000000", "notionalFloor": "4000000", "maintMarginRatio": "0.1", "cum": "222450.0" @@ -29045,51 +33744,51 @@ "tier": 7.0, "symbol": "INJ/USDT:USDT", "currency": "USDT", - "minNotional": 8000000.0, - "maxNotional": 10000000.0, + "minNotional": 5000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "10000000", - "notionalFloor": "8000000", + "notionalCap": "6000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.125", - "cum": "422450.0" + "cum": "347450.0" } }, { "tier": 8.0, "symbol": "INJ/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "minNotional": 6000000.0, + "maxNotional": 7000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "7000000", + "notionalFloor": "6000000", "maintMarginRatio": "0.25", - "cum": "1672450.0" + "cum": "1097450.0" } }, { "tier": 9.0, "symbol": "INJ/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 40000000.0, + "minNotional": 7000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "40000000", - "notionalFloor": "20000000", + "notionalCap": "8000000", + "notionalFloor": "7000000", "maintMarginRatio": "0.5", - "cum": "6672450.0" + "cum": "2847450.0" } } ], @@ -29099,13 +33798,13 @@ "symbol": "IO/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" @@ -29115,136 +33814,153 @@ "tier": 2.0, "symbol": "IO/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": "IO/USDT:USDT", "currency": "USDT", - "minNotional": 30000.0, - "maxNotional": 150000.0, + "minNotional": 10000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "150000", - "notionalFloor": "30000", + "notionalCap": "25000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "200.0" + "cum": "75.0" } }, { "tier": 4.0, "symbol": "IO/USDT:USDT", "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 300000.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "300000", - "notionalFloor": "150000", + "notionalCap": "50000", + "notionalFloor": "25000", "maintMarginRatio": "0.025", - "cum": "950.0" + "cum": "200.0" } }, { "tier": 5.0, "symbol": "IO/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 1500000.0, + "minNotional": 50000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "1500000", - "notionalFloor": "300000", + "notionalCap": "250000", + "notionalFloor": "50000", "maintMarginRatio": "0.05", - "cum": "8450.0" + "cum": "1450.0" } }, { "tier": 6.0, "symbol": "IO/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "500000", + "notionalFloor": "250000", "maintMarginRatio": "0.1", - "cum": "83450.0" + "cum": "13950.0" } }, { "tier": 7.0, "symbol": "IO/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3750000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "3750000", - "notionalFloor": "3000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "158450.0" + "cum": "26450.0" } }, { "tier": 8.0, "symbol": "IO/USDT:USDT", "currency": "USDT", - "minNotional": 3750000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "3750000", - "maintMarginRatio": "0.25", - "cum": "627200.0" + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1667", + "cum": "68150.0" } }, { "tier": 9.0, "symbol": "IO/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.25", + "cum": "318050.0" + } + }, + { + "tier": 10.0, + "symbol": "IO/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "8000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "2502200.0" + "cum": "1568050.0" } } ], @@ -29662,19 +34378,19 @@ } } ], - "JASMY/USDT:USDT": [ + "IP/USDC:USDC": [ { "tier": 1.0, - "symbol": "JASMY/USDT:USDT", - "currency": "USDT", + "symbol": "IP/USDC:USDC", + "currency": "USDC", "minNotional": 0.0, - "maxNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 10.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "10", - "notionalCap": "5000", + "initialLeverage": "25", + "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.015", "cum": "0.0" @@ -29682,23 +34398,282 @@ }, { "tier": 2.0, - "symbol": "JASMY/USDT:USDT", - "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, + "symbol": "IP/USDC:USDC", + "currency": "USDC", + "minNotional": 10000.0, + "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 9.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "9", - "notionalCap": "25000", - "notionalFloor": "5000", + "initialLeverage": "20", + "notionalCap": "30000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "25.0" + "cum": "50.0" } }, { "tier": 3.0, + "symbol": "IP/USDC:USDC", + "currency": "USDC", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 15.0, + "info": { + "bracket": "3", + "initialLeverage": "15", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "200.0" + } + }, + { + "tier": 4.0, + "symbol": "IP/USDC:USDC", + "currency": "USDC", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1700.0" + } + }, + { + "tier": 5.0, + "symbol": "IP/USDC:USDC", + "currency": "USDC", + "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": "16700.0" + } + }, + { + "tier": 6.0, + "symbol": "IP/USDC:USDC", + "currency": "USDC", + "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": "31700.0" + } + }, + { + "tier": 7.0, + "symbol": "IP/USDC:USDC", + "currency": "USDC", + "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": "125450.0" + } + }, + { + "tier": 8.0, + "symbol": "IP/USDC:USDC", + "currency": "USDC", + "minNotional": 1500000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "2000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "500450.0" + } + } + ], + "IP/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "IP/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 25.0, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "10000", + "notionalFloor": "0", + "maintMarginRatio": "0.015", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "IP/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "IP/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 15.0, + "info": { + "bracket": "3", + "initialLeverage": "15", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "200.0" + } + }, + { + "tier": 4.0, + "symbol": "IP/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1700.0" + } + }, + { + "tier": 5.0, + "symbol": "IP/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": "16700.0" + } + }, + { + "tier": 6.0, + "symbol": "IP/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": "31700.0" + } + }, + { + "tier": 7.0, + "symbol": "IP/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": "125450.0" + } + }, + { + "tier": 8.0, + "symbol": "IP/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "2000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "500450.0" + } + } + ], + "JASMY/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "JASMY/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 9.0, + "info": { + "bracket": "1", + "initialLeverage": "9", + "notionalCap": "25000", + "notionalFloor": "0", + "maintMarginRatio": "0.02", + "cum": "0.0" + } + }, + { + "tier": 2.0, "symbol": "JASMY/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, @@ -29706,16 +34681,16 @@ "maintenanceMarginRate": 0.025, "maxLeverage": 8.0, "info": { - "bracket": "3", + "bracket": "2", "initialLeverage": "8", "notionalCap": "80000", "notionalFloor": "25000", "maintMarginRatio": "0.025", - "cum": "150.0" + "cum": "125.0" } }, { - "tier": 4.0, + "tier": 3.0, "symbol": "JASMY/USDT:USDT", "currency": "USDT", "minNotional": 80000.0, @@ -29723,16 +34698,16 @@ "maintenanceMarginRate": 0.05, "maxLeverage": 6.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "6", "notionalCap": "800000", "notionalFloor": "80000", "maintMarginRatio": "0.05", - "cum": "2150.0" + "cum": "2125.0" } }, { - "tier": 5.0, + "tier": 4.0, "symbol": "JASMY/USDT:USDT", "currency": "USDT", "minNotional": 800000.0, @@ -29740,16 +34715,16 @@ "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "5", "notionalCap": "1600000", "notionalFloor": "800000", "maintMarginRatio": "0.1", - "cum": "42150.0" + "cum": "42125.0" } }, { - "tier": 6.0, + "tier": 5.0, "symbol": "JASMY/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, @@ -29757,19 +34732,36 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "2000000", "notionalFloor": "1600000", "maintMarginRatio": "0.125", - "cum": "82150.0" + "cum": "82125.0" + } + }, + { + "tier": 6.0, + "symbol": "JASMY/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "6", + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.1667", + "cum": "165525.0" } }, { "tier": 7.0, "symbol": "JASMY/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, + "minNotional": 3000000.0, "maxNotional": 4000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, @@ -29777,9 +34769,9 @@ "bracket": "7", "initialLeverage": "2", "notionalCap": "4000000", - "notionalFloor": "2000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.25", - "cum": "332150.0" + "cum": "415425.0" } }, { @@ -29796,7 +34788,128 @@ "notionalCap": "4500000", "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "1332150.0" + "cum": "1415425.0" + } + } + ], + "JELLYJELLY/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "JELLYJELLY/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": "JELLYJELLY/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 10.0, + "info": { + "bracket": "2", + "initialLeverage": "10", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "JELLYJELLY/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 5.0, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "200000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "650.0" + } + }, + { + "tier": 4.0, + "symbol": "JELLYJELLY/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 4.0, + "info": { + "bracket": "4", + "initialLeverage": "4", + "notionalCap": "300000", + "notionalFloor": "200000", + "maintMarginRatio": "0.1", + "cum": "10650.0" + } + }, + { + "tier": 5.0, + "symbol": "JELLYJELLY/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 3.0, + "info": { + "bracket": "5", + "initialLeverage": "3", + "notionalCap": "400000", + "notionalFloor": "300000", + "maintMarginRatio": "0.125", + "cum": "18150.0" + } + }, + { + "tier": 6.0, + "symbol": "JELLYJELLY/USDT:USDT", + "currency": "USDT", + "minNotional": 400000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "500000", + "notionalFloor": "400000", + "maintMarginRatio": "0.25", + "cum": "68150.0" + } + }, + { + "tier": 7.0, + "symbol": "JELLYJELLY/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "600000", + "notionalFloor": "500000", + "maintMarginRatio": "0.5", + "cum": "193150.0" } } ], @@ -29808,10 +34921,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -29825,10 +34938,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -29842,10 +34955,10 @@ "minNotional": 10000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -29859,10 +34972,10 @@ "minNotional": 50000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.025", @@ -29876,10 +34989,10 @@ "minNotional": 100000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "500000", "notionalFloor": "100000", "maintMarginRatio": "0.05", @@ -29893,10 +35006,10 @@ "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.1", @@ -29910,10 +35023,10 @@ "minNotional": 1000000.0, "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "1250000", "notionalFloor": "1000000", "maintMarginRatio": "0.125", @@ -29955,6 +35068,178 @@ } } ], + "JST/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "JST/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": "JST/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": "JST/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "JST/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "200.0" + } + }, + { + "tier": 5.0, + "symbol": "JST/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "125000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1450.0" + } + }, + { + "tier": 6.0, + "symbol": "JST/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.1", + "cum": "7700.0" + } + }, + { + "tier": 7.0, + "symbol": "JST/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "13950.0" + } + }, + { + "tier": 8.0, + "symbol": "JST/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "1500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34800.0" + } + }, + { + "tier": 9.0, + "symbol": "JST/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.25", + "cum": "159750.0" + } + }, + { + "tier": 10.0, + "symbol": "JST/USDT:USDT", + "currency": "USDT", + "minNotional": 2500000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "4000000", + "notionalFloor": "2500000", + "maintMarginRatio": "0.5", + "cum": "784750.0" + } + } + ], "JTO/USDT:USDT": [ { "tier": 1.0, @@ -30420,6 +35705,316 @@ } } ], + "KAITO/USDC:USDC": [ + { + "tier": 1.0, + "symbol": "KAITO/USDC:USDC", + "currency": "USDC", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 25.0, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "KAITO/USDC:USDC", + "currency": "USDC", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "KAITO/USDC:USDC", + "currency": "USDC", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 15.0, + "info": { + "bracket": "3", + "initialLeverage": "15", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "KAITO/USDC:USDC", + "currency": "USDC", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "KAITO/USDC:USDC", + "currency": "USDC", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 8.0, + "info": { + "bracket": "5", + "initialLeverage": "8", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "KAITO/USDC:USDC", + "currency": "USDC", + "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": "KAITO/USDC:USDC", + "currency": "USDC", + "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": "KAITO/USDC:USDC", + "currency": "USDC", + "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": "KAITO/USDC:USDC", + "currency": "USDC", + "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" + } + } + ], + "KAITO/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "KAITO/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": "KAITO/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": "KAITO/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": "KAITO/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": "KAITO/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": "KAITO/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": "KAITO/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": "KAITO/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": "KAITO/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" + } + } + ], "KAS/USDT:USDT": [ { "tier": 1.0, @@ -30868,6 +36463,161 @@ } } ], + "KERNEL/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "KERNEL/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": "KERNEL/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": "KERNEL/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": "KERNEL/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": "KERNEL/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": "KERNEL/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": "KERNEL/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": "KERNEL/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": "KERNEL/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" + } + } + ], "KEY/USDT:USDT": [ { "tier": 1.0, @@ -31696,6 +37446,161 @@ } } ], + "LAYER/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "LAYER/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 25.0, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "LAYER/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "LAYER/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 15.0, + "info": { + "bracket": "3", + "initialLeverage": "15", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "LAYER/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "LAYER/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 8.0, + "info": { + "bracket": "5", + "initialLeverage": "8", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "LAYER/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "16725.0" + } + }, + { + "tier": 7.0, + "symbol": "LAYER/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "LAYER/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "125475.0" + } + }, + { + "tier": 9.0, + "symbol": "LAYER/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "2000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "500475.0" + } + } + ], "LDO/USDT:USDT": [ { "tier": 1.0, @@ -31995,15 +37900,15 @@ "symbol": "LINA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 10.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 7.0, "info": { "bracket": "1", - "initialLeverage": "10", - "notionalCap": "5000", + "initialLeverage": "7", + "notionalCap": "25000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.025", "cum": "0.0" } }, @@ -32011,102 +37916,85 @@ "tier": 2.0, "symbol": "LINA/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, + "minNotional": 25000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, "info": { "bracket": "2", - "initialLeverage": "8", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "25.0" + "initialLeverage": "6", + "notionalCap": "400000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "625.0" } }, { "tier": 3.0, "symbol": "LINA/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 900000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, + "minNotional": 400000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "3", - "initialLeverage": "6", - "notionalCap": "900000", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "650.0" + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "400000", + "maintMarginRatio": "0.1", + "cum": "20625.0" } }, { "tier": 4.0, "symbol": "LINA/USDT:USDT", "currency": "USDT", - "minNotional": 900000.0, - "maxNotional": 2400000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 500000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "2400000", - "notionalFloor": "900000", - "maintMarginRatio": "0.1", - "cum": "45650.0" + "initialLeverage": "4", + "notionalCap": "600000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "33125.0" } }, { "tier": 5.0, "symbol": "LINA/USDT:USDT", "currency": "USDT", - "minNotional": 2400000.0, - "maxNotional": 3000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 600000.0, + "maxNotional": 700000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "3000000", - "notionalFloor": "2400000", - "maintMarginRatio": "0.125", - "cum": "105650.0" + "initialLeverage": "2", + "notionalCap": "700000", + "notionalFloor": "600000", + "maintMarginRatio": "0.25", + "cum": "108125.0" } }, { "tier": 6.0, "symbol": "LINA/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "6", - "initialLeverage": "2", - "notionalCap": "5000000", - "notionalFloor": "3000000", - "maintMarginRatio": "0.25", - "cum": "480650.0" - } - }, - { - "tier": 7.0, - "symbol": "LINA/USDT:USDT", - "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 5500000.0, + "minNotional": 700000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "5500000", - "notionalFloor": "5000000", + "notionalCap": "800000", + "notionalFloor": "700000", "maintMarginRatio": "0.5", - "cum": "1730650.0" + "cum": "283125.0" } } ], @@ -32460,15 +38348,15 @@ "symbol": "LISTA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 4000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "25", + "notionalCap": "4000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, @@ -32476,72 +38364,89 @@ "tier": 2.0, "symbol": "LISTA/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 4000.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "initialLeverage": "20", + "notionalCap": "5000", + "notionalFloor": "4000", + "maintMarginRatio": "0.015", + "cum": "20.0" } }, { "tier": 3.0, "symbol": "LISTA/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "25000", - "maintMarginRatio": "0.025", - "cum": "150.0" + "initialLeverage": "10", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "45.0" } }, { "tier": 4.0, "symbol": "LISTA/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "500000", - "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1400.0" + "initialLeverage": "7", + "notionalCap": "50000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "170.0" } }, { "tier": 5.0, "symbol": "LISTA/USDT:USDT", "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, + "info": { + "bracket": "5", + "initialLeverage": "6", + "notionalCap": "500000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1420.0" + } + }, + { + "tier": 6.0, + "symbol": "LISTA/USDT:USDT", + "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "26400.0" + "cum": "26420.0" } }, { - "tier": 6.0, + "tier": 7.0, "symbol": "LISTA/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, @@ -32549,46 +38454,63 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", "notionalCap": "1250000", "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "51400.0" - } - }, - { - "tier": 7.0, - "symbol": "LISTA/USDT:USDT", - "currency": "USDT", - "minNotional": 1250000.0, - "maxNotional": 2500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "2500000", - "notionalFloor": "1250000", - "maintMarginRatio": "0.25", - "cum": "207650.0" + "cum": "51420.0" } }, { "tier": 8.0, "symbol": "LISTA/USDT:USDT", "currency": "USDT", + "minNotional": 1250000.0, + "maxNotional": 1875000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "1875000", + "notionalFloor": "1250000", + "maintMarginRatio": "0.1667", + "cum": "103545.0" + } + }, + { + "tier": 9.0, + "symbol": "LISTA/USDT:USDT", + "currency": "USDT", + "minNotional": 1875000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "1875000", + "maintMarginRatio": "0.25", + "cum": "259732.5" + } + }, + { + "tier": 10.0, + "symbol": "LISTA/USDT:USDT", + "currency": "USDT", "minNotional": 2500000.0, "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "10", "initialLeverage": "1", "notionalCap": "5000000", "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "832650.0" + "cum": "884732.5" } } ], @@ -32738,10 +38660,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -32755,10 +38677,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -32772,10 +38694,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -32789,10 +38711,10 @@ "minNotional": 20000.0, "maxNotional": 40000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "40000", "notionalFloor": "20000", "maintMarginRatio": "0.025", @@ -32806,10 +38728,10 @@ "minNotional": 40000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "200000", "notionalFloor": "40000", "maintMarginRatio": "0.05", @@ -32823,10 +38745,10 @@ "minNotional": 200000.0, "maxNotional": 400000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "400000", "notionalFloor": "200000", "maintMarginRatio": "0.1", @@ -32840,10 +38762,10 @@ "minNotional": 400000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "500000", "notionalFloor": "400000", "maintMarginRatio": "0.125", @@ -32997,10 +38919,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -33014,10 +38936,10 @@ "minNotional": 5000.0, "maxNotional": 16000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "16000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -33031,10 +38953,10 @@ "minNotional": 16000.0, "maxNotional": 80000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "80000", "notionalFloor": "16000", "maintMarginRatio": "0.02", @@ -33048,10 +38970,10 @@ "minNotional": 80000.0, "maxNotional": 160000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "160000", "notionalFloor": "80000", "maintMarginRatio": "0.025", @@ -33065,10 +38987,10 @@ "minNotional": 160000.0, "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "800000", "notionalFloor": "160000", "maintMarginRatio": "0.05", @@ -33082,10 +39004,10 @@ "minNotional": 800000.0, "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1600000", "notionalFloor": "800000", "maintMarginRatio": "0.1", @@ -33099,10 +39021,10 @@ "minNotional": 1600000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "2000000", "notionalFloor": "1600000", "maintMarginRatio": "0.125", @@ -33131,13 +39053,13 @@ "symbol": "LPT/USDT:USDT", "currency": "USDT", "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "maxNotional": 4500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "8000000", + "notionalCap": "4500000", "notionalFloor": "4000000", "maintMarginRatio": "0.5", "cum": "1334505.0" @@ -33997,10 +39919,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -34014,10 +39936,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -34031,10 +39953,10 @@ "minNotional": 10000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -34048,10 +39970,10 @@ "minNotional": 50000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.025", @@ -34065,10 +39987,10 @@ "minNotional": 100000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "500000", "notionalFloor": "100000", "maintMarginRatio": "0.05", @@ -34082,10 +40004,10 @@ "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.1", @@ -34099,10 +40021,10 @@ "minNotional": 1000000.0, "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "1250000", "notionalFloor": "1000000", "maintMarginRatio": "0.125", @@ -34152,10 +40074,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -34169,10 +40091,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -34186,10 +40108,10 @@ "minNotional": 10000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -34203,10 +40125,10 @@ "minNotional": 50000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.025", @@ -34220,10 +40142,10 @@ "minNotional": 100000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "500000", "notionalFloor": "100000", "maintMarginRatio": "0.05", @@ -34237,10 +40159,10 @@ "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.1", @@ -34254,10 +40176,10 @@ "minNotional": 1000000.0, "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "1250000", "notionalFloor": "1000000", "maintMarginRatio": "0.125", @@ -34305,13 +40227,13 @@ "symbol": "MANA/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, + "maxNotional": 10600.0, "maintenanceMarginRate": 0.0065, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "20", + "notionalCap": "10600", "notionalFloor": "0", "maintMarginRatio": "0.0065", "cum": "0.0" @@ -34321,89 +40243,106 @@ "tier": 2.0, "symbol": "MANA/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.0075, - "maxLeverage": 40.0, + "minNotional": 10600.0, + "maxNotional": 23000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "40", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.0075", - "cum": "5.0" + "initialLeverage": "10", + "notionalCap": "23000", + "notionalFloor": "10600", + "maintMarginRatio": "0.01", + "cum": "37.1" } }, { "tier": 3.0, "symbol": "MANA/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "minNotional": 23000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 9.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "50000", - "notionalFloor": "25000", - "maintMarginRatio": "0.01", - "cum": "67.5" + "initialLeverage": "9", + "notionalCap": "30000", + "notionalFloor": "23000", + "maintMarginRatio": "0.015", + "cum": "152.1" } }, { "tier": 4.0, "symbol": "MANA/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 150000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 30000.0, + "maxNotional": 47000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 8.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "150000", - "notionalFloor": "50000", - "maintMarginRatio": "0.025", - "cum": "817.5" + "initialLeverage": "8", + "notionalCap": "47000", + "notionalFloor": "30000", + "maintMarginRatio": "0.02", + "cum": "302.1" } }, { "tier": 5.0, "symbol": "MANA/USDT:USDT", "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 47000.0, + "maxNotional": 90000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 7.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "250000", - "notionalFloor": "150000", - "maintMarginRatio": "0.05", - "cum": "4567.5" + "initialLeverage": "7", + "notionalCap": "90000", + "notionalFloor": "47000", + "maintMarginRatio": "0.025", + "cum": "537.1" } }, { "tier": 6.0, "symbol": "MANA/USDT:USDT", "currency": "USDT", + "minNotional": 90000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, + "info": { + "bracket": "6", + "initialLeverage": "6", + "notionalCap": "250000", + "notionalFloor": "90000", + "maintMarginRatio": "0.05", + "cum": "2787.1" + } + }, + { + "tier": 7.0, + "symbol": "MANA/USDT:USDT", + "currency": "USDT", "minNotional": 250000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "5", "notionalCap": "500000", "notionalFloor": "250000", "maintMarginRatio": "0.1", - "cum": "17067.5" + "cum": "15287.1" } }, { - "tier": 7.0, + "tier": 8.0, "symbol": "MANA/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, @@ -34411,46 +40350,63 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "4", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "29567.5" - } - }, - { - "tier": 8.0, - "symbol": "MANA/USDT:USDT", - "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "8", - "initialLeverage": "2", - "notionalCap": "5000000", - "notionalFloor": "1000000", - "maintMarginRatio": "0.25", - "cum": "154567.5" + "cum": "27787.1" } }, { "tier": 9.0, "symbol": "MANA/USDT:USDT", "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "9", + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1667", + "cum": "69487.1" + } + }, + { + "tier": 10.0, + "symbol": "MANA/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "10", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.25", + "cum": "319387.1" + } + }, + { + "tier": 11.0, + "symbol": "MANA/USDT:USDT", + "currency": "USDT", "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "maxNotional": 8800000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "11", "initialLeverage": "1", - "notionalCap": "10000000", + "notionalCap": "8800000", "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1404567.5" + "cum": "1569387.1" } } ], @@ -34462,282 +40418,6 @@ "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": "MANTA/USDT:USDT", - "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": "50.0" - } - }, - { - "tier": 3.0, - "symbol": "MANTA/USDT:USDT", - "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": "300.0" - } - }, - { - "tier": 4.0, - "symbol": "MANTA/USDT:USDT", - "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, - "info": { - "bracket": "4", - "initialLeverage": "10", - "notionalCap": "1000000", - "notionalFloor": "100000", - "maintMarginRatio": "0.05", - "cum": "2800.0" - } - }, - { - "tier": 5.0, - "symbol": "MANTA/USDT:USDT", - "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "2000000", - "notionalFloor": "1000000", - "maintMarginRatio": "0.1", - "cum": "52800.0" - } - }, - { - "tier": 6.0, - "symbol": "MANTA/USDT:USDT", - "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 2500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "6", - "initialLeverage": "4", - "notionalCap": "2500000", - "notionalFloor": "2000000", - "maintMarginRatio": "0.125", - "cum": "102800.0" - } - }, - { - "tier": 7.0, - "symbol": "MANTA/USDT:USDT", - "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "5000000", - "notionalFloor": "2500000", - "maintMarginRatio": "0.25", - "cum": "415300.0" - } - }, - { - "tier": 8.0, - "symbol": "MANTA/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": "1665300.0" - } - } - ], - "MASK/USDT:USDT": [ - { - "tier": 1.0, - "symbol": "MASK/USDT:USDT", - "currency": "USDT", - "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": "MASK/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", - "maintMarginRatio": "0.02", - "cum": "50.0" - } - }, - { - "tier": 3.0, - "symbol": "MASK/USDT:USDT", - "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 900000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, - "info": { - "bracket": "3", - "initialLeverage": "20", - "notionalCap": "900000", - "notionalFloor": "25000", - "maintMarginRatio": "0.025", - "cum": "175.0" - } - }, - { - "tier": 4.0, - "symbol": "MASK/USDT:USDT", - "currency": "USDT", - "minNotional": 900000.0, - "maxNotional": 1800000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, - "info": { - "bracket": "4", - "initialLeverage": "10", - "notionalCap": "1800000", - "notionalFloor": "900000", - "maintMarginRatio": "0.05", - "cum": "22675.0" - } - }, - { - "tier": 5.0, - "symbol": "MASK/USDT:USDT", - "currency": "USDT", - "minNotional": 1800000.0, - "maxNotional": 4800000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "4800000", - "notionalFloor": "1800000", - "maintMarginRatio": "0.1", - "cum": "112675.0" - } - }, - { - "tier": 6.0, - "symbol": "MASK/USDT:USDT", - "currency": "USDT", - "minNotional": 4800000.0, - "maxNotional": 6000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "6", - "initialLeverage": "4", - "notionalCap": "6000000", - "notionalFloor": "4800000", - "maintMarginRatio": "0.125", - "cum": "232675.0" - } - }, - { - "tier": 7.0, - "symbol": "MASK/USDT:USDT", - "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 18000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "18000000", - "notionalFloor": "6000000", - "maintMarginRatio": "0.25", - "cum": "982675.0" - } - }, - { - "tier": 8.0, - "symbol": "MASK/USDT:USDT", - "currency": "USDT", - "minNotional": 18000000.0, - "maxNotional": 30000000.0, - "maintenanceMarginRate": 0.5, - "maxLeverage": 1.0, - "info": { - "bracket": "8", - "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "18000000", - "maintMarginRatio": "0.5", - "cum": "5482675.0" - } - } - ], - "MAV/USDT:USDT": [ - { - "tier": 1.0, - "symbol": "MAV/USDT:USDT", - "currency": "USDT", - "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", @@ -34750,7 +40430,7 @@ }, { "tier": 2.0, - "symbol": "MAV/USDT:USDT", + "symbol": "MANTA/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, @@ -34767,15 +40447,359 @@ }, { "tier": 3.0, - "symbol": "MAV/USDT:USDT", + "symbol": "MANTA/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 50000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "MANTA/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "200.0" + } + }, + { + "tier": 5.0, + "symbol": "MANTA/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1450.0" + } + }, + { + "tier": 6.0, + "symbol": "MANTA/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "13950.0" + } + }, + { + "tier": 7.0, + "symbol": "MANTA/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "26450.0" + } + }, + { + "tier": 8.0, + "symbol": "MANTA/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1667", + "cum": "68150.0" + } + }, + { + "tier": 9.0, + "symbol": "MANTA/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.25", + "cum": "318050.0" + } + }, + { + "tier": 10.0, + "symbol": "MANTA/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 8000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "8000000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.5", + "cum": "1568050.0" + } + } + ], + "MASK/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "MASK/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, + "symbol": "MASK/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 15.0, + "info": { + "bracket": "2", + "initialLeverage": "15", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "MASK/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "MASK/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 900000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 7.0, + "info": { + "bracket": "4", + "initialLeverage": "7", + "notionalCap": "900000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "200.0" + } + }, + { + "tier": 5.0, + "symbol": "MASK/USDT:USDT", + "currency": "USDT", + "minNotional": 900000.0, + "maxNotional": 1800000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, + "info": { + "bracket": "5", + "initialLeverage": "6", + "notionalCap": "1800000", + "notionalFloor": "900000", + "maintMarginRatio": "0.05", + "cum": "22700.0" + } + }, + { + "tier": 6.0, + "symbol": "MASK/USDT:USDT", + "currency": "USDT", + "minNotional": 1800000.0, + "maxNotional": 4800000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "4800000", + "notionalFloor": "1800000", + "maintMarginRatio": "0.1", + "cum": "112700.0" + } + }, + { + "tier": 7.0, + "symbol": "MASK/USDT:USDT", + "currency": "USDT", + "minNotional": 4800000.0, + "maxNotional": 6000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "6000000", + "notionalFloor": "4800000", + "maintMarginRatio": "0.125", + "cum": "232700.0" + } + }, + { + "tier": 8.0, + "symbol": "MASK/USDT:USDT", + "currency": "USDT", + "minNotional": 6000000.0, + "maxNotional": 12000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "12000000", + "notionalFloor": "6000000", + "maintMarginRatio": "0.1667", + "cum": "482900.0" + } + }, + { + "tier": 9.0, + "symbol": "MASK/USDT:USDT", + "currency": "USDT", + "minNotional": 12000000.0, + "maxNotional": 18000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "18000000", + "notionalFloor": "12000000", + "maintMarginRatio": "0.25", + "cum": "1482500.0" + } + }, + { + "tier": 10.0, + "symbol": "MASK/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": "5982500.0" + } + } + ], + "MAV/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "MAV/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, + "symbol": "MAV/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 15.0, + "info": { + "bracket": "2", + "initialLeverage": "15", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "MAV/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -34789,10 +40813,10 @@ "minNotional": 50000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.025", @@ -34806,10 +40830,10 @@ "minNotional": 100000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "500000", "notionalFloor": "100000", "maintMarginRatio": "0.05", @@ -34823,10 +40847,10 @@ "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.1", @@ -34840,10 +40864,10 @@ "minNotional": 1000000.0, "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "1250000", "notionalFloor": "1000000", "maintMarginRatio": "0.125", @@ -34892,14 +40916,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 10.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "10", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -34910,14 +40934,14 @@ "minNotional": 5000.0, "maxNotional": 25000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 8.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "8", + "initialLeverage": "20", "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { @@ -34925,84 +40949,84 @@ "symbol": "MAVIA/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 100000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "6", - "notionalCap": "100000", + "initialLeverage": "10", + "notionalCap": "200000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "675.0" + "cum": "650.0" } }, { "tier": 4.0, "symbol": "MAVIA/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": "MAVIA/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 500000.0, + "minNotional": 500000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "200000", + "notionalCap": "750000", + "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "10675.0" + "cum": "23150.0" } }, { "tier": 6.0, "symbol": "MAVIA/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", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "73175.0" + "cum": "116900.0" } }, { "tier": 7.0, "symbol": "MAVIA/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", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "323175.0" + "cum": "491900.0" } } ], @@ -35290,10 +41314,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "25", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -35307,10 +41331,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -35324,10 +41348,10 @@ "minNotional": 30000.0, "maxNotional": 150000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "150000", "notionalFloor": "30000", "maintMarginRatio": "0.02", @@ -35341,10 +41365,10 @@ "minNotional": 150000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "300000", "notionalFloor": "150000", "maintMarginRatio": "0.025", @@ -35358,10 +41382,10 @@ "minNotional": 300000.0, "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "8", "notionalCap": "1500000", "notionalFloor": "300000", "maintMarginRatio": "0.05", @@ -35390,13 +41414,13 @@ "symbol": "ME/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, - "maxNotional": 3750000.0, + "maxNotional": 3100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "3750000", + "notionalCap": "3100000", "notionalFloor": "3000000", "maintMarginRatio": "0.125", "cum": "158450.0" @@ -35406,34 +41430,34 @@ "tier": 8.0, "symbol": "ME/USDT:USDT", "currency": "USDT", - "minNotional": 3750000.0, - "maxNotional": 7500000.0, + "minNotional": 3100000.0, + "maxNotional": 3300000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "3750000", + "notionalCap": "3300000", + "notionalFloor": "3100000", "maintMarginRatio": "0.25", - "cum": "627200.0" + "cum": "545950.0" } }, { "tier": 9.0, "symbol": "ME/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 3300000.0, + "maxNotional": 3500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "3500000", + "notionalFloor": "3300000", "maintMarginRatio": "0.5", - "cum": "2502200.0" + "cum": "1370950.0" } } ], @@ -35566,10 +41590,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -35583,10 +41607,10 @@ "minNotional": 5000.0, "maxNotional": 16000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "16000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -35600,10 +41624,10 @@ "minNotional": 16000.0, "maxNotional": 80000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 7.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "7", "notionalCap": "80000", "notionalFloor": "16000", "maintMarginRatio": "0.02", @@ -35617,10 +41641,10 @@ "minNotional": 80000.0, "maxNotional": 160000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "160000", "notionalFloor": "80000", "maintMarginRatio": "0.025", @@ -35634,10 +41658,10 @@ "minNotional": 160000.0, "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "800000", "notionalFloor": "160000", "maintMarginRatio": "0.05", @@ -35651,10 +41675,10 @@ "minNotional": 800000.0, "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1600000", "notionalFloor": "800000", "maintMarginRatio": "0.1", @@ -35668,10 +41692,10 @@ "minNotional": 1600000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "2000000", "notionalFloor": "1600000", "maintMarginRatio": "0.125", @@ -35713,6 +41737,161 @@ } } ], + "MEMEFI/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "MEMEFI/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": "MEMEFI/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "MEMEFI/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "MEMEFI/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "125000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1325.0" + } + }, + { + "tier": 5.0, + "symbol": "MEMEFI/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.1", + "cum": "7575.0" + } + }, + { + "tier": 6.0, + "symbol": "MEMEFI/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "13825.0" + } + }, + { + "tier": 7.0, + "symbol": "MEMEFI/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "1500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34675.0" + } + }, + { + "tier": 8.0, + "symbol": "MEMEFI/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.25", + "cum": "159625.0" + } + }, + { + "tier": 9.0, + "symbol": "MEMEFI/USDT:USDT", + "currency": "USDT", + "minNotional": 2500000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "4000000", + "notionalFloor": "2500000", + "maintMarginRatio": "0.5", + "cum": "784625.0" + } + } + ], "METIS/USDT:USDT": [ { "tier": 1.0, @@ -35840,15 +42019,15 @@ "symbol": "MEW/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" } }, @@ -35856,136 +42035,136 @@ "tier": 2.0, "symbol": "MEW/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 60000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "2", - "initialLeverage": "50", - "notionalCap": "60000", - "notionalFloor": "10000", - "maintMarginRatio": "0.015", - "cum": "50.0" + "initialLeverage": "25", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" } }, { "tier": 3.0, "symbol": "MEW/USDT:USDT", "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 300000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "300000", - "notionalFloor": "60000", - "maintMarginRatio": "0.02", - "cum": "350.0" + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "150.0" } }, { "tier": 4.0, "symbol": "MEW/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 50000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "300000", - "maintMarginRatio": "0.025", - "cum": "1850.0" + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1400.0" } }, { "tier": 5.0, "symbol": "MEW/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 900000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "900000", - "notionalFloor": "600000", - "maintMarginRatio": "0.05", - "cum": "16850.0" + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "13900.0" } }, { "tier": 6.0, "symbol": "MEW/USDT:USDT", "currency": "USDT", - "minNotional": 900000.0, - "maxNotional": 1200000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", - "notionalCap": "1200000", - "notionalFloor": "900000", - "maintMarginRatio": "0.1", - "cum": "61850.0" + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "26400.0" } }, { "tier": 7.0, "symbol": "MEW/USDT:USDT", "currency": "USDT", - "minNotional": 1200000.0, - "maxNotional": 1500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "1500000", - "notionalFloor": "1200000", - "maintMarginRatio": "0.125", - "cum": "91850.0" + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1667", + "cum": "68100.0" } }, { "tier": 8.0, "symbol": "MEW/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 1800000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "1800000", - "notionalFloor": "1500000", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.25", - "cum": "279350.0" + "cum": "318000.0" } }, { "tier": 9.0, "symbol": "MEW/USDT:USDT", "currency": "USDT", - "minNotional": 1800000.0, - "maxNotional": 2000000.0, + "minNotional": 5000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1800000", + "notionalCap": "8000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "729350.0" + "cum": "1568000.0" } } ], @@ -36252,13 +42431,13 @@ "symbol": "MKR/USDT:USDT", "currency": "USDT", "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "maxNotional": 12000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "20000000", + "notionalCap": "12000000", "notionalFloor": "10000000", "maintMarginRatio": "0.25", "cum": "1672545.0" @@ -36268,17 +42447,155 @@ "tier": 10.0, "symbol": "MKR/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 40000000.0, + "minNotional": 12000000.0, + "maxNotional": 14000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "40000000", - "notionalFloor": "20000000", + "notionalCap": "14000000", + "notionalFloor": "12000000", "maintMarginRatio": "0.5", - "cum": "6672545.0" + "cum": "4672545.0" + } + } + ], + "MLN/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "MLN/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": "MLN/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": "MLN/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": "MLN/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": "MLN/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": "MLN/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": "MLN/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": "MLN/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" } } ], @@ -36443,13 +42760,13 @@ "symbol": "MOODENG/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, + "maxNotional": 4600.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "25", - "notionalCap": "10000", + "initialLeverage": "20", + "notionalCap": "4600", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -36459,136 +42776,153 @@ "tier": 2.0, "symbol": "MOODENG/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 80000.0, + "minNotional": 4600.0, + "maxNotional": 35000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "80000", - "notionalFloor": "10000", + "initialLeverage": "10", + "notionalCap": "35000", + "notionalFloor": "4600", "maintMarginRatio": "0.015", - "cum": "50.0" + "cum": "23.0" } }, { "tier": 3.0, "symbol": "MOODENG/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 400000.0, + "minNotional": 35000.0, + "maxNotional": 175000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 15.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "15", - "notionalCap": "400000", - "notionalFloor": "80000", + "initialLeverage": "8", + "notionalCap": "175000", + "notionalFloor": "35000", "maintMarginRatio": "0.02", - "cum": "450.0" + "cum": "198.0" } }, { "tier": 4.0, "symbol": "MOODENG/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 800000.0, + "minNotional": 175000.0, + "maxNotional": 350000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "800000", - "notionalFloor": "400000", + "initialLeverage": "7", + "notionalCap": "350000", + "notionalFloor": "175000", "maintMarginRatio": "0.025", - "cum": "2450.0" + "cum": "1073.0" } }, { "tier": 5.0, "symbol": "MOODENG/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 4000000.0, + "minNotional": 350000.0, + "maxNotional": 1750000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "8", - "notionalCap": "4000000", - "notionalFloor": "800000", + "initialLeverage": "6", + "notionalCap": "1750000", + "notionalFloor": "350000", "maintMarginRatio": "0.05", - "cum": "22450.0" + "cum": "9823.0" } }, { "tier": 6.0, "symbol": "MOODENG/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "minNotional": 1750000.0, + "maxNotional": 2100000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "8000000", - "notionalFloor": "4000000", + "notionalCap": "2100000", + "notionalFloor": "1750000", "maintMarginRatio": "0.1", - "cum": "222450.0" + "cum": "97323.0" } }, { "tier": 7.0, "symbol": "MOODENG/USDT:USDT", "currency": "USDT", - "minNotional": 8000000.0, - "maxNotional": 10000000.0, + "minNotional": 2100000.0, + "maxNotional": 2600000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "10000000", - "notionalFloor": "8000000", + "notionalCap": "2600000", + "notionalFloor": "2100000", "maintMarginRatio": "0.125", - "cum": "422450.0" + "cum": "149823.0" } }, { "tier": 8.0, "symbol": "MOODENG/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 2600000.0, + "maxNotional": 3900000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "20000000", - "notionalFloor": "10000000", - "maintMarginRatio": "0.25", - "cum": "1672450.0" + "initialLeverage": "3", + "notionalCap": "3900000", + "notionalFloor": "2600000", + "maintMarginRatio": "0.1667", + "cum": "258243.0" } }, { "tier": 9.0, "symbol": "MOODENG/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 21000000.0, + "minNotional": 3900000.0, + "maxNotional": 5200000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5200000", + "notionalFloor": "3900000", + "maintMarginRatio": "0.25", + "cum": "583113.0" + } + }, + { + "tier": 10.0, + "symbol": "MOODENG/USDT:USDT", + "currency": "USDT", + "minNotional": 5200000.0, + "maxNotional": 7200000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "21000000", - "notionalFloor": "20000000", + "notionalCap": "7200000", + "notionalFloor": "5200000", "maintMarginRatio": "0.5", - "cum": "6672450.0" + "cum": "1883113.0" } } ], @@ -37029,6 +43363,178 @@ "symbol": "MTL/USDT:USDT", "currency": "USDT", "minNotional": 0.0, + "maxNotional": 4200.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 26.0, + "info": { + "bracket": "1", + "initialLeverage": "26", + "notionalCap": "4200", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "MTL/USDT:USDT", + "currency": "USDT", + "minNotional": 4200.0, + "maxNotional": 7600.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 25.0, + "info": { + "bracket": "2", + "initialLeverage": "25", + "notionalCap": "7600", + "notionalFloor": "4200", + "maintMarginRatio": "0.015", + "cum": "21.0" + } + }, + { + "tier": 3.0, + "symbol": "MTL/USDT:USDT", + "currency": "USDT", + "minNotional": 7600.0, + "maxNotional": 17000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "17000", + "notionalFloor": "7600", + "maintMarginRatio": "0.02", + "cum": "59.0" + } + }, + { + "tier": 4.0, + "symbol": "MTL/USDT:USDT", + "currency": "USDT", + "minNotional": 17000.0, + "maxNotional": 40000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "40000", + "notionalFloor": "17000", + "maintMarginRatio": "0.025", + "cum": "144.0" + } + }, + { + "tier": 5.0, + "symbol": "MTL/USDT:USDT", + "currency": "USDT", + "minNotional": 40000.0, + "maxNotional": 390000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, + "info": { + "bracket": "5", + "initialLeverage": "6", + "notionalCap": "390000", + "notionalFloor": "40000", + "maintMarginRatio": "0.05", + "cum": "1144.0" + } + }, + { + "tier": 6.0, + "symbol": "MTL/USDT:USDT", + "currency": "USDT", + "minNotional": 390000.0, + "maxNotional": 940000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "940000", + "notionalFloor": "390000", + "maintMarginRatio": "0.1", + "cum": "20644.0" + } + }, + { + "tier": 7.0, + "symbol": "MTL/USDT:USDT", + "currency": "USDT", + "minNotional": 940000.0, + "maxNotional": 1400000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "1400000", + "notionalFloor": "940000", + "maintMarginRatio": "0.125", + "cum": "44144.0" + } + }, + { + "tier": 8.0, + "symbol": "MTL/USDT:USDT", + "currency": "USDT", + "minNotional": 1400000.0, + "maxNotional": 3400000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "3400000", + "notionalFloor": "1400000", + "maintMarginRatio": "0.1667", + "cum": "102524.0" + } + }, + { + "tier": 9.0, + "symbol": "MTL/USDT:USDT", + "currency": "USDT", + "minNotional": 3400000.0, + "maxNotional": 5400000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5400000", + "notionalFloor": "3400000", + "maintMarginRatio": "0.25", + "cum": "385744.0" + } + }, + { + "tier": 10.0, + "symbol": "MTL/USDT:USDT", + "currency": "USDT", + "minNotional": 5400000.0, + "maxNotional": 8800000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "8800000", + "notionalFloor": "5400000", + "maintMarginRatio": "0.5", + "cum": "1735744.0" + } + } + ], + "MUBARAK/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "MUBARAK/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, @@ -37043,7 +43549,7 @@ }, { "tier": 2.0, - "symbol": "MTL/USDT:USDT", + "symbol": "MUBARAK/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, "maxNotional": 25000.0, @@ -37060,16 +43566,16 @@ }, { "tier": 3.0, - "symbol": "MTL/USDT:USDT", + "symbol": "MUBARAK/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 600000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "600000", + "notionalCap": "200000", "notionalFloor": "25000", "maintMarginRatio": "0.05", "cum": "650.0" @@ -37077,70 +43583,70 @@ }, { "tier": 4.0, - "symbol": "MTL/USDT:USDT", + "symbol": "MUBARAK/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 1600000.0, + "minNotional": 200000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "4", "initialLeverage": "5", - "notionalCap": "1600000", - "notionalFloor": "600000", + "notionalCap": "500000", + "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "30650.0" + "cum": "10650.0" } }, { "tier": 5.0, - "symbol": "MTL/USDT:USDT", + "symbol": "MUBARAK/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 2000000.0, + "minNotional": 500000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1600000", + "notionalCap": "750000", + "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "70650.0" + "cum": "23150.0" } }, { "tier": 6.0, - "symbol": "MTL/USDT:USDT", + "symbol": "MUBARAK/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 6000000.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "6", "initialLeverage": "2", - "notionalCap": "6000000", - "notionalFloor": "2000000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "320650.0" + "cum": "116900.0" } }, { "tier": 7.0, - "symbol": "MTL/USDT:USDT", + "symbol": "MUBARAK/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 10000000.0, + "minNotional": 1500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "7", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalCap": "3000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "1820650.0" + "cum": "491900.0" } } ], @@ -37600,10 +44106,10 @@ "minNotional": 0.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "20000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -37617,10 +44123,10 @@ "minNotional": 20000.0, "maxNotional": 160000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "8", "notionalCap": "160000", "notionalFloor": "20000", "maintMarginRatio": "0.015", @@ -37634,10 +44140,10 @@ "minNotional": 160000.0, "maxNotional": 800000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 7.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "7", "notionalCap": "800000", "notionalFloor": "160000", "maintMarginRatio": "0.02", @@ -37651,10 +44157,10 @@ "minNotional": 800000.0, "maxNotional": 1600000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "1600000", "notionalFloor": "800000", "maintMarginRatio": "0.025", @@ -37666,13 +44172,13 @@ "symbol": "NEIRO/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, - "maxNotional": 8000000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "8000000", + "initialLeverage": "5", + "notionalCap": "3000000", "notionalFloor": "1600000", "maintMarginRatio": "0.05", "cum": "44900.0" @@ -37682,68 +44188,68 @@ "tier": 6.0, "symbol": "NEIRO/USDT:USDT", "currency": "USDT", - "minNotional": 8000000.0, - "maxNotional": 16000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", - "notionalCap": "16000000", - "notionalFloor": "8000000", + "initialLeverage": "4", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.1", - "cum": "444900.0" + "cum": "194900.0" } }, { "tier": 7.0, "symbol": "NEIRO/USDT:USDT", "currency": "USDT", - "minNotional": 16000000.0, - "maxNotional": 20000000.0, + "minNotional": 5000000.0, + "maxNotional": 7000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "20000000", - "notionalFloor": "16000000", + "initialLeverage": "3", + "notionalCap": "7000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.125", - "cum": "844900.0" + "cum": "319900.0" } }, { "tier": 8.0, "symbol": "NEIRO/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 40000000.0, + "minNotional": 7000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "40000000", - "notionalFloor": "20000000", + "notionalCap": "8000000", + "notionalFloor": "7000000", "maintMarginRatio": "0.25", - "cum": "3344900.0" + "cum": "1194900.0" } }, { "tier": 9.0, "symbol": "NEIRO/USDT:USDT", "currency": "USDT", - "minNotional": 40000000.0, - "maxNotional": 80000000.0, + "minNotional": 8000000.0, + "maxNotional": 9000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "80000000", - "notionalFloor": "40000000", + "notionalCap": "9000000", + "notionalFloor": "8000000", "maintMarginRatio": "0.5", - "cum": "13344900.0" + "cum": "3194900.0" } } ], @@ -37910,10 +44416,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.006, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.006", @@ -37927,10 +44433,10 @@ "minNotional": 5000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "50000", "notionalFloor": "5000", "maintMarginRatio": "0.01", @@ -37942,13 +44448,13 @@ "symbol": "NEO/USDC:USDC", "currency": "USDC", "minNotional": 50000.0, - "maxNotional": 400000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "400000", + "initialLeverage": "10", + "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.025", "cum": "770.0" @@ -37958,85 +44464,85 @@ "tier": 4.0, "symbol": "NEO/USDC:USDC", "currency": "USDC", - "minNotional": 400000.0, - "maxNotional": 800000.0, + "minNotional": 100000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "800000", - "notionalFloor": "400000", + "initialLeverage": "5", + "notionalCap": "300000", + "notionalFloor": "100000", "maintMarginRatio": "0.05", - "cum": "10770.0" + "cum": "3270.0" } }, { "tier": 5.0, "symbol": "NEO/USDC:USDC", "currency": "USDC", - "minNotional": 800000.0, - "maxNotional": 2000000.0, + "minNotional": 300000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "5", - "notionalCap": "2000000", - "notionalFloor": "800000", + "initialLeverage": "4", + "notionalCap": "600000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "50770.0" + "cum": "18270.0" } }, { "tier": 6.0, "symbol": "NEO/USDC:USDC", "currency": "USDC", - "minNotional": 2000000.0, - "maxNotional": 5000000.0, + "minNotional": 600000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "6", - "initialLeverage": "4", - "notionalCap": "5000000", - "notionalFloor": "2000000", + "initialLeverage": "3", + "notionalCap": "750000", + "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "100770.0" + "cum": "33270.0" } }, { "tier": 7.0, "symbol": "NEO/USDC:USDC", "currency": "USDC", - "minNotional": 5000000.0, - "maxNotional": 12000000.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "12000000", - "notionalFloor": "5000000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "725770.0" + "cum": "127020.0" } }, { "tier": 8.0, "symbol": "NEO/USDC:USDC", "currency": "USDC", - "minNotional": 12000000.0, - "maxNotional": 20000000.0, + "minNotional": 1500000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "20000000", - "notionalFloor": "12000000", + "notionalCap": "2500000", + "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "3725770.0" + "cum": "502020.0" } } ], @@ -38048,10 +44554,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.006, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.006", @@ -38065,10 +44571,10 @@ "minNotional": 5000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "50000", "notionalFloor": "5000", "maintMarginRatio": "0.01", @@ -38080,13 +44586,13 @@ "symbol": "NEO/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 400000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "400000", + "initialLeverage": "10", + "notionalCap": "250000", "notionalFloor": "50000", "maintMarginRatio": "0.025", "cum": "770.0" @@ -38096,85 +44602,85 @@ "tier": 4.0, "symbol": "NEO/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 800000.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "800000", - "notionalFloor": "400000", + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", "maintMarginRatio": "0.05", - "cum": "10770.0" + "cum": "7020.0" } }, { "tier": 5.0, "symbol": "NEO/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 2000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "5", - "notionalCap": "2000000", - "notionalFloor": "800000", + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "50770.0" + "cum": "32020.0" } }, { "tier": 6.0, "symbol": "NEO/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 5000000.0, + "minNotional": 1000000.0, + "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "6", - "initialLeverage": "4", - "notionalCap": "5000000", - "notionalFloor": "2000000", + "initialLeverage": "3", + "notionalCap": "1250000", + "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "100770.0" + "cum": "57020.0" } }, { "tier": 7.0, "symbol": "NEO/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 12000000.0, + "minNotional": 1250000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "12000000", - "notionalFloor": "5000000", + "notionalCap": "2000000", + "notionalFloor": "1250000", "maintMarginRatio": "0.25", - "cum": "725770.0" + "cum": "213270.0" } }, { "tier": 8.0, "symbol": "NEO/USDT:USDT", "currency": "USDT", - "minNotional": 12000000.0, - "maxNotional": 20000000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "20000000", - "notionalFloor": "12000000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.5", - "cum": "3725770.0" + "cum": "713270.0" } } ], @@ -38184,15 +44690,15 @@ "symbol": "NFP/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 4000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "25", + "notionalCap": "4000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, @@ -38200,72 +44706,89 @@ "tier": 2.0, "symbol": "NFP/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 4000.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "initialLeverage": "20", + "notionalCap": "5000", + "notionalFloor": "4000", + "maintMarginRatio": "0.015", + "cum": "20.0" } }, { "tier": 3.0, "symbol": "NFP/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "25000", - "maintMarginRatio": "0.025", - "cum": "150.0" + "initialLeverage": "10", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "45.0" } }, { "tier": 4.0, "symbol": "NFP/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "500000", - "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1400.0" + "initialLeverage": "7", + "notionalCap": "50000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "170.0" } }, { "tier": 5.0, "symbol": "NFP/USDT:USDT", "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, + "info": { + "bracket": "5", + "initialLeverage": "6", + "notionalCap": "500000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1420.0" + } + }, + { + "tier": 6.0, + "symbol": "NFP/USDT:USDT", + "currency": "USDT", "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "26400.0" + "cum": "26420.0" } }, { - "tier": 6.0, + "tier": 7.0, "symbol": "NFP/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, @@ -38273,46 +44796,218 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", "notionalCap": "1250000", "notionalFloor": "1000000", "maintMarginRatio": "0.125", - "cum": "51400.0" - } - }, - { - "tier": 7.0, - "symbol": "NFP/USDT:USDT", - "currency": "USDT", - "minNotional": 1250000.0, - "maxNotional": 2500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "7", - "initialLeverage": "2", - "notionalCap": "2500000", - "notionalFloor": "1250000", - "maintMarginRatio": "0.25", - "cum": "207650.0" + "cum": "51420.0" } }, { "tier": 8.0, "symbol": "NFP/USDT:USDT", "currency": "USDT", + "minNotional": 1250000.0, + "maxNotional": 1875000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "1875000", + "notionalFloor": "1250000", + "maintMarginRatio": "0.1667", + "cum": "103545.0" + } + }, + { + "tier": 9.0, + "symbol": "NFP/USDT:USDT", + "currency": "USDT", + "minNotional": 1875000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "1875000", + "maintMarginRatio": "0.25", + "cum": "259732.5" + } + }, + { + "tier": 10.0, + "symbol": "NFP/USDT:USDT", + "currency": "USDT", "minNotional": 2500000.0, "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "10", "initialLeverage": "1", "notionalCap": "5000000", "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "832650.0" + "cum": "884732.5" + } + } + ], + "NIL/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "NIL/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": "NIL/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": "NIL/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": "NIL/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": "NIL/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": "NIL/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": "NIL/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": "NIL/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": "NIL/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" } } ], @@ -38392,10 +45087,10 @@ "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", @@ -38407,16 +45102,50 @@ "symbol": "NKN/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "6", + "initialLeverage": "3", + "notionalCap": "1500000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1667", + "cum": "65475.0" + } + }, + { + "tier": 7.0, + "symbol": "NKN/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "2000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.25", + "cum": "190425.0" + } + }, + { + "tier": 8.0, + "symbol": "NKN/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "8", "initialLeverage": "1", "notionalCap": "3000000", - "notionalFloor": "1000000", + "notionalFloor": "2000000", "maintMarginRatio": "0.5", - "cum": "398775.0" + "cum": "690425.0" } } ], @@ -38547,13 +45276,13 @@ "symbol": "NOT/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" @@ -38563,136 +45292,153 @@ "tier": 2.0, "symbol": "NOT/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": "NOT/USDT:USDT", "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 300000.0, + "minNotional": 10000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "300000", - "notionalFloor": "60000", + "notionalCap": "25000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "350.0" + "cum": "75.0" } }, { "tier": 4.0, "symbol": "NOT/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "300000", + "notionalCap": "50000", + "notionalFloor": "25000", "maintMarginRatio": "0.025", - "cum": "1850.0" + "cum": "200.0" } }, { "tier": 5.0, "symbol": "NOT/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 2000000.0, + "minNotional": 50000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "2000000", - "notionalFloor": "600000", + "notionalCap": "250000", + "notionalFloor": "50000", "maintMarginRatio": "0.05", - "cum": "16850.0" + "cum": "1450.0" } }, { "tier": 6.0, "symbol": "NOT/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 3000000.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "2000000", + "notionalCap": "500000", + "notionalFloor": "250000", "maintMarginRatio": "0.1", - "cum": "116850.0" + "cum": "13950.0" } }, { "tier": 7.0, "symbol": "NOT/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 4000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "4000000", - "notionalFloor": "3000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "191850.0" + "cum": "26450.0" } }, { "tier": 8.0, "symbol": "NOT/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "5000000", - "notionalFloor": "4000000", - "maintMarginRatio": "0.25", - "cum": "691850.0" + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1667", + "cum": "68150.0" } }, { "tier": 9.0, "symbol": "NOT/USDT:USDT", "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.25", + "cum": "318050.0" + } + }, + { + "tier": 10.0, + "symbol": "NOT/USDT:USDT", + "currency": "USDT", "minNotional": 5000000.0, - "maxNotional": 6000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "6000000", + "notionalCap": "8000000", "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1941850.0" + "cum": "1568050.0" } } ], @@ -38825,10 +45571,10 @@ "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", @@ -38842,10 +45588,10 @@ "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", @@ -38859,10 +45605,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "8", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -38876,10 +45622,10 @@ "minNotional": 20000.0, "maxNotional": 40000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "7", "notionalCap": "40000", "notionalFloor": "20000", "maintMarginRatio": "0.025", @@ -38893,10 +45639,10 @@ "minNotional": 40000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "200000", "notionalFloor": "40000", "maintMarginRatio": "0.05", @@ -38908,13 +45654,13 @@ "symbol": "NULS/USDT:USDT", "currency": "USDT", "minNotional": 200000.0, - "maxNotional": 400000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", + "notionalCap": "300000", "notionalFloor": "200000", "maintMarginRatio": "0.1", "cum": "11175.0" @@ -38924,51 +45670,51 @@ "tier": 7.0, "symbol": "NULS/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 300000.0, + "maxNotional": 400000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "400000", + "notionalFloor": "300000", "maintMarginRatio": "0.125", - "cum": "21175.0" + "cum": "18675.0" } }, { "tier": 8.0, "symbol": "NULS/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 400000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "500000", + "notionalFloor": "400000", "maintMarginRatio": "0.25", - "cum": "83675.0" + "cum": "68675.0" } }, { "tier": 9.0, "symbol": "NULS/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 500000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "600000", + "notionalFloor": "500000", "maintMarginRatio": "0.5", - "cum": "333675.0" + "cum": "193675.0" } } ], @@ -39220,13 +45966,13 @@ "symbol": "OM/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, + "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 10.0, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "10", - "notionalCap": "10000", + "initialLeverage": "75", + "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -39236,136 +45982,153 @@ "tier": 2.0, "symbol": "OM/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 20000.0, + "minNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 9.0, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "9", - "notionalCap": "20000", - "notionalFloor": "10000", + "initialLeverage": "50", + "notionalCap": "10000", + "notionalFloor": "5000", "maintMarginRatio": "0.015", - "cum": "50.0" + "cum": "25.0" } }, { "tier": 3.0, "symbol": "OM/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 100000.0, + "minNotional": 10000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 8.0, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "8", - "notionalCap": "100000", - "notionalFloor": "20000", + "initialLeverage": "25", + "notionalCap": "25000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "150.0" + "cum": "75.0" } }, { "tier": 4.0, "symbol": "OM/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 200000.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 7.0, + "maxLeverage": 20.0, "info": { "bracket": "4", - "initialLeverage": "7", - "notionalCap": "200000", - "notionalFloor": "100000", + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "25000", "maintMarginRatio": "0.025", - "cum": "650.0" + "cum": "200.0" } }, { "tier": 5.0, "symbol": "OM/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 1000000.0, + "minNotional": 50000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 6.0, + "maxLeverage": 10.0, "info": { "bracket": "5", - "initialLeverage": "6", - "notionalCap": "1000000", - "notionalFloor": "200000", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "50000", "maintMarginRatio": "0.05", - "cum": "5650.0" + "cum": "1450.0" } }, { "tier": 6.0, "symbol": "OM/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "500000", + "notionalFloor": "250000", "maintMarginRatio": "0.1", - "cum": "55650.0" + "cum": "13950.0" } }, { "tier": 7.0, "symbol": "OM/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 2500000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "2500000", - "notionalFloor": "2000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "105650.0" + "cum": "26450.0" } }, { "tier": 8.0, "symbol": "OM/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "5000000", - "notionalFloor": "2500000", - "maintMarginRatio": "0.25", - "cum": "418150.0" + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1667", + "cum": "68150.0" } }, { "tier": 9.0, "symbol": "OM/USDT:USDT", "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.25", + "cum": "318050.0" + } + }, + { + "tier": 10.0, + "symbol": "OM/USDT:USDT", + "currency": "USDT", "minNotional": 5000000.0, - "maxNotional": 5100000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "5100000", + "notionalCap": "8000000", "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1668150.0" + "cum": "1568050.0" } } ], @@ -39791,10 +46554,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -39808,10 +46571,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -39823,13 +46586,13 @@ "symbol": "ONE/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 50000.0, + "maxNotional": 35000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "50000", + "initialLeverage": "10", + "notionalCap": "35000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -39839,102 +46602,119 @@ "tier": 4.0, "symbol": "ONE/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, + "minNotional": 35000.0, + "maxNotional": 70000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "100000", - "notionalFloor": "50000", + "initialLeverage": "7", + "notionalCap": "70000", + "notionalFloor": "35000", "maintMarginRatio": "0.025", - "cum": "325.0" + "cum": "250.0" } }, { "tier": 5.0, "symbol": "ONE/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 500000.0, + "minNotional": 70000.0, + "maxNotional": 350000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "500000", - "notionalFloor": "100000", + "initialLeverage": "6", + "notionalCap": "350000", + "notionalFloor": "70000", "maintMarginRatio": "0.05", - "cum": "2825.0" + "cum": "2000.0" } }, { "tier": 6.0, "symbol": "ONE/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 350000.0, + "maxNotional": 700000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "700000", + "notionalFloor": "350000", "maintMarginRatio": "0.1", - "cum": "27825.0" + "cum": "19500.0" } }, { "tier": 7.0, "symbol": "ONE/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 1250000.0, + "minNotional": 700000.0, + "maxNotional": 1100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "1250000", - "notionalFloor": "1000000", + "notionalCap": "1100000", + "notionalFloor": "700000", "maintMarginRatio": "0.125", - "cum": "52825.0" + "cum": "37000.0" } }, { "tier": 8.0, "symbol": "ONE/USDT:USDT", "currency": "USDT", - "minNotional": 1250000.0, - "maxNotional": 2500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 1100000.0, + "maxNotional": 2550000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "2500000", - "notionalFloor": "1250000", - "maintMarginRatio": "0.25", - "cum": "209075.0" + "initialLeverage": "3", + "notionalCap": "2550000", + "notionalFloor": "1100000", + "maintMarginRatio": "0.1667", + "cum": "82870.0" } }, { "tier": 9.0, "symbol": "ONE/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "minNotional": 2550000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "4000000", + "notionalFloor": "2550000", + "maintMarginRatio": "0.25", + "cum": "295285.0" + } + }, + { + "tier": 10.0, + "symbol": "ONE/USDT:USDT", + "currency": "USDT", + "minNotional": 4000000.0, + "maxNotional": 6800000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "2500000", + "notionalCap": "6800000", + "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "834075.0" + "cum": "1295285.0" } } ], @@ -40515,10 +47295,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 30.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "30", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -40530,13 +47310,13 @@ "symbol": "ORCA/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 10000.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 25.0, "info": { "bracket": "2", - "initialLeverage": "50", - "notionalCap": "10000", + "initialLeverage": "25", + "notionalCap": "20000", "notionalFloor": "5000", "maintMarginRatio": "0.015", "cum": "25.0" @@ -40546,34 +47326,34 @@ "tier": 3.0, "symbol": "ORCA/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 30000.0, + "minNotional": 20000.0, + "maxNotional": 45000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 20.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "30000", - "notionalFloor": "10000", + "initialLeverage": "20", + "notionalCap": "45000", + "notionalFloor": "20000", "maintMarginRatio": "0.02", - "cum": "75.0" + "cum": "125.0" } }, { "tier": 4.0, "symbol": "ORCA/USDT:USDT", "currency": "USDT", - "minNotional": 30000.0, + "minNotional": 45000.0, "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 18.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "18", "notionalCap": "60000", - "notionalFloor": "30000", + "notionalFloor": "45000", "maintMarginRatio": "0.025", - "cum": "225.0" + "cum": "350.0" } }, { @@ -40581,84 +47361,101 @@ "symbol": "ORCA/USDT:USDT", "currency": "USDT", "minNotional": 60000.0, - "maxNotional": 300000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.03, + "maxLeverage": 15.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "300000", + "initialLeverage": "15", + "notionalCap": "80000", "notionalFloor": "60000", - "maintMarginRatio": "0.05", - "cum": "1725.0" + "maintMarginRatio": "0.03", + "cum": "650.0" } }, { "tier": 6.0, "symbol": "ORCA/USDT:USDT", "currency": "USDT", + "minNotional": 80000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "6", + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "80000", + "maintMarginRatio": "0.05", + "cum": "2250.0" + } + }, + { + "tier": 7.0, + "symbol": "ORCA/USDT:USDT", + "currency": "USDT", "minNotional": 300000.0, "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "5", "notionalCap": "600000", "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "16725.0" - } - }, - { - "tier": 7.0, - "symbol": "ORCA/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" + "cum": "17250.0" } }, { "tier": 8.0, "symbol": "ORCA/USDT:USDT", "currency": "USDT", - "minNotional": 750000.0, - "maxNotional": 1500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 600000.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "1500000", - "notionalFloor": "750000", - "maintMarginRatio": "0.25", - "cum": "125475.0" + "initialLeverage": "4", + "notionalCap": "800000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "32250.0" } }, { "tier": 9.0, "symbol": "ORCA/USDT:USDT", "currency": "USDT", + "minNotional": 800000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "800000", + "maintMarginRatio": "0.25", + "cum": "132250.0" + } + }, + { + "tier": 10.0, + "symbol": "ORCA/USDT:USDT", + "currency": "USDT", "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "3000000", + "notionalCap": "2500000", "notionalFloor": "1500000", "maintMarginRatio": "0.5", - "cum": "500475.0" + "cum": "507250.0" } } ], @@ -40670,10 +47467,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.0065, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.0065", @@ -40687,10 +47484,10 @@ "minNotional": 5000.0, "maxNotional": 75000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "75000", "notionalFloor": "5000", "maintMarginRatio": "0.01", @@ -40704,10 +47501,10 @@ "minNotional": 75000.0, "maxNotional": 150000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 40.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "40", + "initialLeverage": "8", "notionalCap": "150000", "notionalFloor": "75000", "maintMarginRatio": "0.015", @@ -40721,10 +47518,10 @@ "minNotional": 150000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "25", + "initialLeverage": "7", "notionalCap": "300000", "notionalFloor": "150000", "maintMarginRatio": "0.02", @@ -40738,10 +47535,10 @@ "minNotional": 300000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "1000000", "notionalFloor": "300000", "maintMarginRatio": "0.025", @@ -40755,10 +47552,10 @@ "minNotional": 1000000.0, "maxNotional": 3000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "6", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "3000000", "notionalFloor": "1000000", "maintMarginRatio": "0.05", @@ -40772,10 +47569,10 @@ "minNotional": 3000000.0, "maxNotional": 6000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "7", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "6000000", "notionalFloor": "3000000", "maintMarginRatio": "0.1", @@ -40789,10 +47586,10 @@ "minNotional": 6000000.0, "maxNotional": 10000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "10000000", "notionalFloor": "6000000", "maintMarginRatio": "0.125", @@ -40840,15 +47637,15 @@ "symbol": "ORDI/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" } }, @@ -40856,153 +47653,153 @@ "tier": 2.0, "symbol": "ORDI/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" + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" } }, { "tier": 3.0, "symbol": "ORDI/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 150000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 40.0, + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "40", - "notionalCap": "150000", - "notionalFloor": "80000", - "maintMarginRatio": "0.015", - "cum": "435.0" + "initialLeverage": "25", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" } }, { "tier": 4.0, "symbol": "ORDI/USDT:USDT", "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 400000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "4", - "initialLeverage": "25", - "notionalCap": "400000", - "notionalFloor": "150000", - "maintMarginRatio": "0.02", - "cum": "1185.0" + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "200.0" } }, { "tier": 5.0, "symbol": "ORDI/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 50000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "5", - "initialLeverage": "20", - "notionalCap": "1000000", - "notionalFloor": "400000", - "maintMarginRatio": "0.025", - "cum": "3185.0" + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1450.0" } }, { "tier": 6.0, "symbol": "ORDI/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 4000000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "6", - "initialLeverage": "10", - "notionalCap": "4000000", - "notionalFloor": "1000000", - "maintMarginRatio": "0.05", - "cum": "28185.0" + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "13950.0" } }, { "tier": 7.0, "symbol": "ORDI/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "7", - "initialLeverage": "5", - "notionalCap": "8000000", - "notionalFloor": "4000000", - "maintMarginRatio": "0.1", - "cum": "228185.0" + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "26450.0" } }, { "tier": 8.0, "symbol": "ORDI/USDT:USDT", "currency": "USDT", - "minNotional": 8000000.0, - "maxNotional": 10000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "4", - "notionalCap": "10000000", - "notionalFloor": "8000000", - "maintMarginRatio": "0.125", - "cum": "428185.0" + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1667", + "cum": "68150.0" } }, { "tier": 9.0, "symbol": "ORDI/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.25", - "cum": "1678185.0" + "cum": "318050.0" } }, { "tier": 10.0, "symbol": "ORDI/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 40000000.0, + "minNotional": 5000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "40000000", - "notionalFloor": "20000000", + "notionalCap": "8000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "6678185.0" + "cum": "1568050.0" } } ], @@ -41127,6 +47924,316 @@ } } ], + "PARTI/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "PARTI/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": "PARTI/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": "PARTI/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": "PARTI/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": "PARTI/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": "PARTI/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": "PARTI/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": "PARTI/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": "PARTI/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" + } + } + ], + "PAXG/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "PAXG/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": "PAXG/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": "PAXG/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": "PAXG/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "300000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "PAXG/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 900000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "900000", + "notionalFloor": "300000", + "maintMarginRatio": "0.05", + "cum": "7725.0" + } + }, + { + "tier": 6.0, + "symbol": "PAXG/USDT:USDT", + "currency": "USDT", + "minNotional": 900000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "2000000", + "notionalFloor": "900000", + "maintMarginRatio": "0.1", + "cum": "52725.0" + } + }, + { + "tier": 7.0, + "symbol": "PAXG/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "3000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.125", + "cum": "102725.0" + } + }, + { + "tier": 8.0, + "symbol": "PAXG/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.25", + "cum": "477725.0" + } + }, + { + "tier": 9.0, + "symbol": "PAXG/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": "1727725.0" + } + } + ], "PENDLE/USDT:USDT": [ { "tier": 1.0, @@ -41288,13 +48395,13 @@ "symbol": "PENGU/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, + "maxNotional": 7000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", - "notionalCap": "10000", + "initialLeverage": "20", + "notionalCap": "7000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -41304,136 +48411,153 @@ "tier": 2.0, "symbol": "PENGU/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 60000.0, + "minNotional": 7000.0, + "maxNotional": 30000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", - "notionalCap": "60000", - "notionalFloor": "10000", + "initialLeverage": "10", + "notionalCap": "30000", + "notionalFloor": "7000", "maintMarginRatio": "0.015", - "cum": "50.0" + "cum": "35.0" } }, { "tier": 3.0, "symbol": "PENGU/USDT:USDT", "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 300000.0, + "minNotional": 30000.0, + "maxNotional": 135000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "300000", - "notionalFloor": "60000", + "initialLeverage": "8", + "notionalCap": "135000", + "notionalFloor": "30000", "maintMarginRatio": "0.02", - "cum": "350.0" + "cum": "185.0" } }, { "tier": 4.0, "symbol": "PENGU/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 135000.0, + "maxNotional": 270000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "300000", + "initialLeverage": "7", + "notionalCap": "270000", + "notionalFloor": "135000", "maintMarginRatio": "0.025", - "cum": "1850.0" + "cum": "860.0" } }, { "tier": 5.0, "symbol": "PENGU/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 3000000.0, + "minNotional": 270000.0, + "maxNotional": 1350000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "3000000", - "notionalFloor": "600000", + "initialLeverage": "6", + "notionalCap": "1350000", + "notionalFloor": "270000", "maintMarginRatio": "0.05", - "cum": "16850.0" + "cum": "7610.0" } }, { "tier": 6.0, "symbol": "PENGU/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "minNotional": 1350000.0, + "maxNotional": 2700000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "6000000", - "notionalFloor": "3000000", + "notionalCap": "2700000", + "notionalFloor": "1350000", "maintMarginRatio": "0.1", - "cum": "166850.0" + "cum": "75110.0" } }, { "tier": 7.0, "symbol": "PENGU/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "minNotional": 2700000.0, + "maxNotional": 3600000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "7500000", - "notionalFloor": "6000000", + "notionalCap": "3600000", + "notionalFloor": "2700000", "maintMarginRatio": "0.125", - "cum": "316850.0" + "cum": "142610.0" } }, { "tier": 8.0, "symbol": "PENGU/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 3600000.0, + "maxNotional": 6300000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "15000000", - "notionalFloor": "7500000", - "maintMarginRatio": "0.25", - "cum": "1254350.0" + "initialLeverage": "3", + "notionalCap": "6300000", + "notionalFloor": "3600000", + "maintMarginRatio": "0.1667", + "cum": "292730.0" } }, { "tier": 9.0, "symbol": "PENGU/USDT:USDT", "currency": "USDT", - "minNotional": 15000000.0, - "maxNotional": 30000000.0, + "minNotional": 6300000.0, + "maxNotional": 9000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "9000000", + "notionalFloor": "6300000", + "maintMarginRatio": "0.25", + "cum": "817520.0" + } + }, + { + "tier": 10.0, + "symbol": "PENGU/USDT:USDT", + "currency": "USDT", + "minNotional": 9000000.0, + "maxNotional": 16800000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "15000000", + "notionalCap": "16800000", + "notionalFloor": "9000000", "maintMarginRatio": "0.5", - "cum": "5004350.0" + "cum": "3067520.0" } } ], @@ -41445,10 +48569,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -41462,10 +48586,10 @@ "minNotional": 10000.0, "maxNotional": 40000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "40000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -41479,10 +48603,10 @@ "minNotional": 40000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 7.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "7", "notionalCap": "200000", "notionalFloor": "40000", "maintMarginRatio": "0.02", @@ -41496,10 +48620,10 @@ "minNotional": 200000.0, "maxNotional": 400000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "400000", "notionalFloor": "200000", "maintMarginRatio": "0.025", @@ -41513,10 +48637,10 @@ "minNotional": 400000.0, "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "1500000", "notionalFloor": "400000", "maintMarginRatio": "0.05", @@ -41530,10 +48654,10 @@ "minNotional": 1500000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "2000000", "notionalFloor": "1500000", "maintMarginRatio": "0.1", @@ -41547,10 +48671,10 @@ "minNotional": 2000000.0, "maxNotional": 2500000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "2500000", "notionalFloor": "2000000", "maintMarginRatio": "0.125", @@ -41599,14 +48723,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "25", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -41624,7 +48748,7 @@ "notionalCap": "25000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "50.0" + "cum": "25.0" } }, { @@ -41641,7 +48765,7 @@ "notionalCap": "200000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "675.0" + "cum": "650.0" } }, { @@ -41658,7 +48782,7 @@ "notionalCap": "500000", "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "10675.0" + "cum": "10650.0" } }, { @@ -41675,7 +48799,7 @@ "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "23175.0" + "cum": "23150.0" } }, { @@ -41683,33 +48807,50 @@ "symbol": "PERP/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 3000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "6", - "initialLeverage": "2", - "notionalCap": "3000000", + "initialLeverage": "3", + "notionalCap": "2000000", "notionalFloor": "1000000", - "maintMarginRatio": "0.25", - "cum": "148175.0" + "maintMarginRatio": "0.1667", + "cum": "64850.0" } }, { "tier": 7.0, "symbol": "PERP/USDT:USDT", "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "3000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.25", + "cum": "231450.0" + } + }, + { + "tier": 8.0, + "symbol": "PERP/USDT:USDT", + "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 3005000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "1", "notionalCap": "3005000", "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "898175.0" + "cum": "981450.0" } } ], @@ -41980,10 +49121,10 @@ "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", @@ -41997,10 +49138,10 @@ "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", @@ -42014,10 +49155,10 @@ "minNotional": 25000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "200000", "notionalFloor": "25000", "maintMarginRatio": "0.05", @@ -42031,10 +49172,10 @@ "minNotional": 200000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "4", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "500000", "notionalFloor": "200000", "maintMarginRatio": "0.1", @@ -42048,10 +49189,10 @@ "minNotional": 500000.0, "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "5", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "750000", "notionalFloor": "500000", "maintMarginRatio": "0.125", @@ -42101,10 +49242,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -42118,10 +49259,10 @@ "minNotional": 5000.0, "maxNotional": 16000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "16000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -42135,10 +49276,10 @@ "minNotional": 16000.0, "maxNotional": 80000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 7.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "7", "notionalCap": "80000", "notionalFloor": "16000", "maintMarginRatio": "0.02", @@ -42152,10 +49293,10 @@ "minNotional": 80000.0, "maxNotional": 160000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "160000", "notionalFloor": "80000", "maintMarginRatio": "0.025", @@ -42169,10 +49310,10 @@ "minNotional": 160000.0, "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "800000", "notionalFloor": "160000", "maintMarginRatio": "0.05", @@ -42186,10 +49327,10 @@ "minNotional": 800000.0, "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1600000", "notionalFloor": "800000", "maintMarginRatio": "0.1", @@ -42203,10 +49344,10 @@ "minNotional": 1600000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "2000000", "notionalFloor": "1600000", "maintMarginRatio": "0.125", @@ -42248,19 +49389,295 @@ } } ], + "PLUME/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "PLUME/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": "PLUME/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": "PLUME/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": "PLUME/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": "PLUME/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "23150.0" + } + }, + { + "tier": 6.0, + "symbol": "PLUME/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "116900.0" + } + }, + { + "tier": 7.0, + "symbol": "PLUME/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "491900.0" + } + } + ], + "PNUT/USDC:USDC": [ + { + "tier": 1.0, + "symbol": "PNUT/USDC:USDC", + "currency": "USDC", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 25.0, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "PNUT/USDC:USDC", + "currency": "USDC", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "PNUT/USDC:USDC", + "currency": "USDC", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 15.0, + "info": { + "bracket": "3", + "initialLeverage": "15", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "PNUT/USDC:USDC", + "currency": "USDC", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "PNUT/USDC:USDC", + "currency": "USDC", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 8.0, + "info": { + "bracket": "5", + "initialLeverage": "8", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "PNUT/USDC:USDC", + "currency": "USDC", + "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": "PNUT/USDC:USDC", + "currency": "USDC", + "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": "PNUT/USDC:USDC", + "currency": "USDC", + "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": "PNUT/USDC:USDC", + "currency": "USDC", + "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" + } + } + ], "PNUT/USDT:USDT": [ { "tier": 1.0, "symbol": "PNUT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 20000.0, + "maxNotional": 15000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", - "notionalCap": "20000", + "initialLeverage": "20", + "notionalCap": "15000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -42270,136 +49687,136 @@ "tier": 2.0, "symbol": "PNUT/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 160000.0, + "minNotional": 15000.0, + "maxNotional": 120000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 8.0, "info": { "bracket": "2", - "initialLeverage": "50", - "notionalCap": "160000", - "notionalFloor": "20000", + "initialLeverage": "8", + "notionalCap": "120000", + "notionalFloor": "15000", "maintMarginRatio": "0.015", - "cum": "100.0" + "cum": "75.0" } }, { "tier": 3.0, "symbol": "PNUT/USDT:USDT", "currency": "USDT", - "minNotional": 160000.0, - "maxNotional": 800000.0, + "minNotional": 120000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 7.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "800000", - "notionalFloor": "160000", + "initialLeverage": "7", + "notionalCap": "600000", + "notionalFloor": "120000", "maintMarginRatio": "0.02", - "cum": "900.0" + "cum": "675.0" } }, { "tier": 4.0, "symbol": "PNUT/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 1600000.0, + "minNotional": 600000.0, + "maxNotional": 1200000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "1600000", - "notionalFloor": "800000", + "initialLeverage": "6", + "notionalCap": "1200000", + "notionalFloor": "600000", "maintMarginRatio": "0.025", - "cum": "4900.0" + "cum": "3675.0" } }, { "tier": 5.0, "symbol": "PNUT/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 8000000.0, + "minNotional": 1200000.0, + "maxNotional": 1800000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "8000000", - "notionalFloor": "1600000", + "initialLeverage": "5", + "notionalCap": "1800000", + "notionalFloor": "1200000", "maintMarginRatio": "0.05", - "cum": "44900.0" + "cum": "33675.0" } }, { "tier": 6.0, "symbol": "PNUT/USDT:USDT", "currency": "USDT", - "minNotional": 8000000.0, - "maxNotional": 16000000.0, + "minNotional": 1800000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", - "notionalCap": "16000000", - "notionalFloor": "8000000", + "initialLeverage": "4", + "notionalCap": "2500000", + "notionalFloor": "1800000", "maintMarginRatio": "0.1", - "cum": "444900.0" + "cum": "123675.0" } }, { "tier": 7.0, "symbol": "PNUT/USDT:USDT", "currency": "USDT", - "minNotional": 16000000.0, - "maxNotional": 20000000.0, + "minNotional": 2500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "20000000", - "notionalFloor": "16000000", + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.125", - "cum": "844900.0" + "cum": "186175.0" } }, { "tier": 8.0, "symbol": "PNUT/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 40000000.0, + "minNotional": 3000000.0, + "maxNotional": 3500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "40000000", - "notionalFloor": "20000000", + "notionalCap": "3500000", + "notionalFloor": "3000000", "maintMarginRatio": "0.25", - "cum": "3344900.0" + "cum": "561175.0" } }, { "tier": 9.0, "symbol": "PNUT/USDT:USDT", "currency": "USDT", - "minNotional": 40000000.0, - "maxNotional": 80000000.0, + "minNotional": 3500000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "80000000", - "notionalFloor": "40000000", + "notionalCap": "4000000", + "notionalFloor": "3500000", "maintMarginRatio": "0.5", - "cum": "13344900.0" + "cum": "1436175.0" } } ], @@ -42494,13 +49911,13 @@ "symbol": "POL/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "maxNotional": 3500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "6000000", + "notionalCap": "3500000", "notionalFloor": "3000000", "maintMarginRatio": "0.1", "cum": "166850.0" @@ -42510,51 +49927,51 @@ "tier": 7.0, "symbol": "POL/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "minNotional": 3500000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "7500000", - "notionalFloor": "6000000", + "notionalCap": "4000000", + "notionalFloor": "3500000", "maintMarginRatio": "0.125", - "cum": "316850.0" + "cum": "254350.0" } }, { "tier": 8.0, "symbol": "POL/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 4000000.0, + "maxNotional": 4500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "4500000", + "notionalFloor": "4000000", "maintMarginRatio": "0.25", - "cum": "1254350.0" + "cum": "754350.0" } }, { "tier": 9.0, "symbol": "POL/USDT:USDT", "currency": "USDT", - "minNotional": 15000000.0, - "maxNotional": 30000000.0, + "minNotional": 4500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "15000000", + "notionalCap": "5000000", + "notionalFloor": "4500000", "maintMarginRatio": "0.5", - "cum": "5004350.0" + "cum": "1879350.0" } } ], @@ -42564,15 +49981,15 @@ "symbol": "POLYX/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 4000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "25", + "notionalCap": "4000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, @@ -42580,72 +49997,89 @@ "tier": 2.0, "symbol": "POLYX/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 4000.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "initialLeverage": "20", + "notionalCap": "5000", + "notionalFloor": "4000", + "maintMarginRatio": "0.015", + "cum": "20.0" } }, { "tier": 3.0, "symbol": "POLYX/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 80000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "80000", - "notionalFloor": "25000", - "maintMarginRatio": "0.025", - "cum": "150.0" + "initialLeverage": "10", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "45.0" } }, { "tier": 4.0, "symbol": "POLYX/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 800000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 25000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "800000", - "notionalFloor": "80000", - "maintMarginRatio": "0.05", - "cum": "2150.0" + "initialLeverage": "7", + "notionalCap": "80000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "170.0" } }, { "tier": 5.0, "symbol": "POLYX/USDT:USDT", "currency": "USDT", + "minNotional": 80000.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, + "info": { + "bracket": "5", + "initialLeverage": "6", + "notionalCap": "800000", + "notionalFloor": "80000", + "maintMarginRatio": "0.05", + "cum": "2170.0" + } + }, + { + "tier": 6.0, + "symbol": "POLYX/USDT:USDT", + "currency": "USDT", "minNotional": 800000.0, "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", "notionalCap": "1600000", "notionalFloor": "800000", "maintMarginRatio": "0.1", - "cum": "42150.0" + "cum": "42170.0" } }, { - "tier": 6.0, + "tier": 7.0, "symbol": "POLYX/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, @@ -42653,46 +50087,63 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", "notionalCap": "2000000", "notionalFloor": "1600000", "maintMarginRatio": "0.125", - "cum": "82150.0" - } - }, - { - "tier": 7.0, - "symbol": "POLYX/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" + "cum": "82170.0" } }, { "tier": 8.0, "symbol": "POLYX/USDT:USDT", "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.1667", + "cum": "165570.0" + } + }, + { + "tier": 9.0, + "symbol": "POLYX/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "4000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.25", + "cum": "415470.0" + } + }, + { + "tier": 10.0, + "symbol": "POLYX/USDT:USDT", + "currency": "USDT", "minNotional": 4000000.0, "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "10", "initialLeverage": "1", "notionalCap": "8000000", "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "1332150.0" + "cum": "1415470.0" } } ], @@ -42857,15 +50308,15 @@ "symbol": "POPCAT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "25", - "notionalCap": "10000", + "initialLeverage": "50", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.015", "cum": "0.0" } }, @@ -42873,136 +50324,136 @@ "tier": 2.0, "symbol": "POPCAT/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 20.0, + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "100000", - "notionalFloor": "10000", - "maintMarginRatio": "0.015", - "cum": "50.0" + "initialLeverage": "25", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" } }, { "tier": 3.0, "symbol": "POPCAT/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 15.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "3", - "initialLeverage": "15", - "notionalCap": "500000", - "notionalFloor": "100000", - "maintMarginRatio": "0.02", - "cum": "550.0" + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "150.0" } }, { "tier": 4.0, "symbol": "POPCAT/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.025, + "minNotional": 50000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "4", "initialLeverage": "10", - "notionalCap": "1000000", - "notionalFloor": "500000", - "maintMarginRatio": "0.025", - "cum": "3050.0" + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1400.0" } }, { "tier": 5.0, "symbol": "POPCAT/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "8", - "notionalCap": "5000000", - "notionalFloor": "1000000", - "maintMarginRatio": "0.05", - "cum": "28050.0" + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "13900.0" } }, { "tier": 6.0, "symbol": "POPCAT/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", - "notionalCap": "10000000", - "notionalFloor": "5000000", - "maintMarginRatio": "0.1", - "cum": "278050.0" + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "26400.0" } }, { "tier": 7.0, "symbol": "POPCAT/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 12500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "12500000", - "notionalFloor": "10000000", - "maintMarginRatio": "0.125", - "cum": "528050.0" + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1667", + "cum": "68100.0" } }, { "tier": 8.0, "symbol": "POPCAT/USDT:USDT", "currency": "USDT", - "minNotional": 12500000.0, - "maxNotional": 25000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "25000000", - "notionalFloor": "12500000", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.25", - "cum": "2090550.0" + "cum": "318000.0" } }, { "tier": 9.0, "symbol": "POPCAT/USDT:USDT", "currency": "USDT", - "minNotional": 25000000.0, - "maxNotional": 30000000.0, + "minNotional": 5000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "25000000", + "notionalCap": "8000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "8340550.0" + "cum": "1568000.0" } } ], @@ -43403,6 +50854,437 @@ } } ], + "PROMPT/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "PROMPT/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 25.0, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.015", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "PROMPT/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "PROMPT/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 150000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "150000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "150.0" + } + }, + { + "tier": 4.0, + "symbol": "PROMPT/USDT:USDT", + "currency": "USDT", + "minNotional": 150000.0, + "maxNotional": 350000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "350000", + "notionalFloor": "150000", + "maintMarginRatio": "0.05", + "cum": "3900.0" + } + }, + { + "tier": 5.0, + "symbol": "PROMPT/USDT:USDT", + "currency": "USDT", + "minNotional": 350000.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "800000", + "notionalFloor": "350000", + "maintMarginRatio": "0.1", + "cum": "21400.0" + } + }, + { + "tier": 6.0, + "symbol": "PROMPT/USDT:USDT", + "currency": "USDT", + "minNotional": 800000.0, + "maxNotional": 900000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 3.0, + "info": { + "bracket": "6", + "initialLeverage": "3", + "notionalCap": "900000", + "notionalFloor": "800000", + "maintMarginRatio": "0.125", + "cum": "41400.0" + } + }, + { + "tier": 7.0, + "symbol": "PROMPT/USDT:USDT", + "currency": "USDT", + "minNotional": 900000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "900000", + "maintMarginRatio": "0.25", + "cum": "153900.0" + } + }, + { + "tier": 8.0, + "symbol": "PROMPT/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": "528900.0" + } + } + ], + "PUMP/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "PUMP/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "1", + "initialLeverage": "20", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.025", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "PUMP/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.033, + "maxLeverage": 15.0, + "info": { + "bracket": "2", + "initialLeverage": "15", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.033", + "cum": "40.0" + } + }, + { + "tier": 3.0, + "symbol": "PUMP/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": "465.0" + } + }, + { + "tier": 4.0, + "symbol": "PUMP/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": "5465.0" + } + }, + { + "tier": 5.0, + "symbol": "PUMP/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": "10465.0" + } + }, + { + "tier": 6.0, + "symbol": "PUMP/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": "72965.0" + } + }, + { + "tier": 7.0, + "symbol": "PUMP/USDT:USDT", + "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": "322965.0" + } + } + ], + "PUNDIX/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "PUNDIX/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": "PUNDIX/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": "PUNDIX/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "PUNDIX/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "200.0" + } + }, + { + "tier": 5.0, + "symbol": "PUNDIX/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "125000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1450.0" + } + }, + { + "tier": 6.0, + "symbol": "PUNDIX/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.1", + "cum": "7700.0" + } + }, + { + "tier": 7.0, + "symbol": "PUNDIX/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "13950.0" + } + }, + { + "tier": 8.0, + "symbol": "PUNDIX/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "1500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34800.0" + } + }, + { + "tier": 9.0, + "symbol": "PUNDIX/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.25", + "cum": "159750.0" + } + }, + { + "tier": 10.0, + "symbol": "PUNDIX/USDT:USDT", + "currency": "USDT", + "minNotional": 2500000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "4000000", + "notionalFloor": "2500000", + "maintMarginRatio": "0.5", + "cum": "784750.0" + } + } + ], "PYTH/USDT:USDT": [ { "tier": 1.0, @@ -43842,10 +51724,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -43859,10 +51741,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -43874,13 +51756,13 @@ "symbol": "QUICK/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, + "maxNotional": 23000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "20000", + "initialLeverage": "10", + "notionalCap": "23000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -43890,102 +51772,119 @@ "tier": 4.0, "symbol": "QUICK/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 40000.0, + "minNotional": 23000.0, + "maxNotional": 46000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "40000", - "notionalFloor": "20000", + "initialLeverage": "7", + "notionalCap": "46000", + "notionalFloor": "23000", "maintMarginRatio": "0.025", - "cum": "175.0" + "cum": "190.0" } }, { "tier": 5.0, "symbol": "QUICK/USDT:USDT", "currency": "USDT", - "minNotional": 40000.0, - "maxNotional": 200000.0, + "minNotional": 46000.0, + "maxNotional": 230000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "200000", - "notionalFloor": "40000", + "initialLeverage": "6", + "notionalCap": "230000", + "notionalFloor": "46000", "maintMarginRatio": "0.05", - "cum": "1175.0" + "cum": "1340.0" } }, { "tier": 6.0, "symbol": "QUICK/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 400000.0, + "minNotional": 230000.0, + "maxNotional": 460000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "400000", - "notionalFloor": "200000", + "notionalCap": "460000", + "notionalFloor": "230000", "maintMarginRatio": "0.1", - "cum": "11175.0" + "cum": "12840.0" } }, { "tier": 7.0, "symbol": "QUICK/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 500000.0, + "minNotional": 460000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "400000", + "notionalCap": "800000", + "notionalFloor": "460000", "maintMarginRatio": "0.125", - "cum": "21175.0" + "cum": "24340.0" } }, { "tier": 8.0, "symbol": "QUICK/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 800000.0, + "maxNotional": 2100000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "1000000", - "notionalFloor": "500000", - "maintMarginRatio": "0.25", - "cum": "83675.0" + "initialLeverage": "3", + "notionalCap": "2100000", + "notionalFloor": "800000", + "maintMarginRatio": "0.1667", + "cum": "57700.0" } }, { "tier": 9.0, "symbol": "QUICK/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "minNotional": 2100000.0, + "maxNotional": 3400000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "3400000", + "notionalFloor": "2100000", + "maintMarginRatio": "0.25", + "cum": "232630.0" + } + }, + { + "tier": 10.0, + "symbol": "QUICK/USDT:USDT", + "currency": "USDT", + "minNotional": 3400000.0, + "maxNotional": 5600000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "2000000", - "notionalFloor": "1000000", + "notionalCap": "5600000", + "notionalFloor": "3400000", "maintMarginRatio": "0.5", - "cum": "333675.0" + "cum": "1082630.0" } } ], @@ -44118,10 +52017,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "25", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -44135,10 +52034,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -44152,10 +52051,10 @@ "minNotional": 30000.0, "maxNotional": 150000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "150000", "notionalFloor": "30000", "maintMarginRatio": "0.02", @@ -44169,10 +52068,10 @@ "minNotional": 150000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "300000", "notionalFloor": "150000", "maintMarginRatio": "0.025", @@ -44184,13 +52083,13 @@ "symbol": "RARE/USDT:USDT", "currency": "USDT", "minNotional": 300000.0, - "maxNotional": 1500000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "1500000", + "initialLeverage": "8", + "notionalCap": "500000", "notionalFloor": "300000", "maintMarginRatio": "0.05", "cum": "8450.0" @@ -44200,68 +52099,68 @@ "tier": 6.0, "symbol": "RARE/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 500000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "600000", + "notionalFloor": "500000", "maintMarginRatio": "0.1", - "cum": "83450.0" + "cum": "33450.0" } }, { "tier": 7.0, "symbol": "RARE/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3750000.0, + "minNotional": 600000.0, + "maxNotional": 700000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "3750000", - "notionalFloor": "3000000", + "notionalCap": "700000", + "notionalFloor": "600000", "maintMarginRatio": "0.125", - "cum": "158450.0" + "cum": "48450.0" } }, { "tier": 8.0, "symbol": "RARE/USDT:USDT", "currency": "USDT", - "minNotional": 3750000.0, - "maxNotional": 7500000.0, + "minNotional": 700000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "3750000", + "notionalCap": "800000", + "notionalFloor": "700000", "maintMarginRatio": "0.25", - "cum": "627200.0" + "cum": "135950.0" } }, { "tier": 9.0, "symbol": "RARE/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 800000.0, + "maxNotional": 900000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "900000", + "notionalFloor": "800000", "maintMarginRatio": "0.5", - "cum": "2502200.0" + "cum": "335950.0" } } ], @@ -44532,10 +52431,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -44549,10 +52448,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -44566,10 +52465,10 @@ "minNotional": 20000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "100000", "notionalFloor": "20000", "maintMarginRatio": "0.02", @@ -44583,10 +52482,10 @@ "minNotional": 100000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "200000", "notionalFloor": "100000", "maintMarginRatio": "0.025", @@ -44600,10 +52499,10 @@ "minNotional": 200000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "1000000", "notionalFloor": "200000", "maintMarginRatio": "0.05", @@ -44617,10 +52516,10 @@ "minNotional": 1000000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "2000000", "notionalFloor": "1000000", "maintMarginRatio": "0.1", @@ -44634,10 +52533,10 @@ "minNotional": 2000000.0, "maxNotional": 2500000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "2500000", "notionalFloor": "2000000", "maintMarginRatio": "0.125", @@ -44679,6 +52578,161 @@ } } ], + "RED/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "RED/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": "RED/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": "RED/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": "RED/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": "RED/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": "RED/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": "RED/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": "RED/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": "RED/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" + } + } + ], "REEF/USDT:USDT": [ { "tier": 1.0, @@ -45167,13 +53221,13 @@ "symbol": "RENDER/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, - "maxNotional": 4000000.0, + "maxNotional": 3500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "4000000", + "notionalCap": "3500000", "notionalFloor": "2000000", "maintMarginRatio": "0.1", "cum": "111250.0" @@ -45183,51 +53237,51 @@ "tier": 7.0, "symbol": "RENDER/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 5000000.0, + "minNotional": 3500000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "5000000", - "notionalFloor": "4000000", + "notionalCap": "4000000", + "notionalFloor": "3500000", "maintMarginRatio": "0.125", - "cum": "211250.0" + "cum": "198750.0" } }, { "tier": 8.0, "symbol": "RENDER/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 4000000.0, + "maxNotional": 4500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "4500000", + "notionalFloor": "4000000", "maintMarginRatio": "0.25", - "cum": "836250.0" + "cum": "698750.0" } }, { "tier": 9.0, "symbol": "RENDER/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "minNotional": 4500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "5000000", + "notionalFloor": "4500000", "maintMarginRatio": "0.5", - "cum": "3336250.0" + "cum": "1823750.0" } } ], @@ -45530,13 +53584,13 @@ "symbol": "RLC/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 600000.0, + "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "600000", + "notionalCap": "300000", "notionalFloor": "25000", "maintMarginRatio": "0.05", "cum": "650.0" @@ -45546,68 +53600,68 @@ "tier": 4.0, "symbol": "RLC/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 1600000.0, + "minNotional": 300000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "4", "initialLeverage": "5", - "notionalCap": "1600000", - "notionalFloor": "600000", + "notionalCap": "500000", + "notionalFloor": "300000", "maintMarginRatio": "0.1", - "cum": "30650.0" + "cum": "15650.0" } }, { "tier": 5.0, "symbol": "RLC/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 2000000.0, + "minNotional": 500000.0, + "maxNotional": 600000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1600000", + "notionalCap": "600000", + "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "70650.0" + "cum": "28150.0" } }, { "tier": 6.0, "symbol": "RLC/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 6000000.0, + "minNotional": 600000.0, + "maxNotional": 700000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "6", "initialLeverage": "2", - "notionalCap": "6000000", - "notionalFloor": "2000000", + "notionalCap": "700000", + "notionalFloor": "600000", "maintMarginRatio": "0.25", - "cum": "320650.0" + "cum": "103150.0" } }, { "tier": 7.0, "symbol": "RLC/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 10000000.0, + "minNotional": 700000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "7", "initialLeverage": "1", - "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalCap": "800000", + "notionalFloor": "700000", "maintMarginRatio": "0.5", - "cum": "1820650.0" + "cum": "278150.0" } } ], @@ -45740,10 +53794,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -45757,10 +53811,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -45774,10 +53828,10 @@ "minNotional": 10000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -45791,10 +53845,10 @@ "minNotional": 50000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.025", @@ -45808,10 +53862,10 @@ "minNotional": 100000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "500000", "notionalFloor": "100000", "maintMarginRatio": "0.05", @@ -45825,10 +53879,10 @@ "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.1", @@ -45842,10 +53896,10 @@ "minNotional": 1000000.0, "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "1250000", "notionalFloor": "1000000", "maintMarginRatio": "0.125", @@ -46050,10 +54104,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -46067,10 +54121,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -46082,13 +54136,13 @@ "symbol": "RSR/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 50000.0, + "maxNotional": 35000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "50000", + "initialLeverage": "10", + "notionalCap": "35000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -46098,102 +54152,119 @@ "tier": 4.0, "symbol": "RSR/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, + "minNotional": 35000.0, + "maxNotional": 70000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "100000", - "notionalFloor": "50000", + "initialLeverage": "7", + "notionalCap": "70000", + "notionalFloor": "35000", "maintMarginRatio": "0.025", - "cum": "325.0" + "cum": "250.0" } }, { "tier": 5.0, "symbol": "RSR/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 500000.0, + "minNotional": 70000.0, + "maxNotional": 350000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "500000", - "notionalFloor": "100000", + "initialLeverage": "6", + "notionalCap": "350000", + "notionalFloor": "70000", "maintMarginRatio": "0.05", - "cum": "2825.0" + "cum": "2000.0" } }, { "tier": 6.0, "symbol": "RSR/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 350000.0, + "maxNotional": 700000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "700000", + "notionalFloor": "350000", "maintMarginRatio": "0.1", - "cum": "27825.0" + "cum": "19500.0" } }, { "tier": 7.0, "symbol": "RSR/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 1250000.0, + "minNotional": 700000.0, + "maxNotional": 1100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "1250000", - "notionalFloor": "1000000", + "notionalCap": "1100000", + "notionalFloor": "700000", "maintMarginRatio": "0.125", - "cum": "52825.0" + "cum": "37000.0" } }, { "tier": 8.0, "symbol": "RSR/USDT:USDT", "currency": "USDT", - "minNotional": 1250000.0, - "maxNotional": 3000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 1100000.0, + "maxNotional": 2650000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "3000000", - "notionalFloor": "1250000", - "maintMarginRatio": "0.25", - "cum": "209075.0" + "initialLeverage": "3", + "notionalCap": "2650000", + "notionalFloor": "1100000", + "maintMarginRatio": "0.1667", + "cum": "82870.0" } }, { "tier": 9.0, "symbol": "RSR/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 5000000.0, + "minNotional": 2650000.0, + "maxNotional": 4200000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "4200000", + "notionalFloor": "2650000", + "maintMarginRatio": "0.25", + "cum": "303615.0" + } + }, + { + "tier": 10.0, + "symbol": "RSR/USDT:USDT", + "currency": "USDT", + "minNotional": 4200000.0, + "maxNotional": 6800000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "3000000", + "notionalCap": "6800000", + "notionalFloor": "4200000", "maintMarginRatio": "0.5", - "cum": "959075.0" + "cum": "1353615.0" } } ], @@ -46205,10 +54276,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -46222,10 +54293,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 20.0, + "maxLeverage": 9.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "9", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -46239,10 +54310,10 @@ "minNotional": 30000.0, "maxNotional": 150000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 15.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "15", + "initialLeverage": "8", "notionalCap": "150000", "notionalFloor": "30000", "maintMarginRatio": "0.02", @@ -46256,10 +54327,10 @@ "minNotional": 150000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "10", + "initialLeverage": "7", "notionalCap": "300000", "notionalFloor": "150000", "maintMarginRatio": "0.025", @@ -46273,10 +54344,10 @@ "minNotional": 300000.0, "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "8", + "initialLeverage": "6", "notionalCap": "1500000", "notionalFloor": "300000", "maintMarginRatio": "0.05", @@ -46808,10 +54879,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -46825,10 +54896,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -46842,10 +54913,10 @@ "minNotional": 30000.0, "maxNotional": 150000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "150000", "notionalFloor": "30000", "maintMarginRatio": "0.02", @@ -46859,10 +54930,10 @@ "minNotional": 150000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "300000", "notionalFloor": "150000", "maintMarginRatio": "0.025", @@ -46876,10 +54947,10 @@ "minNotional": 300000.0, "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "1500000", "notionalFloor": "300000", "maintMarginRatio": "0.05", @@ -46891,13 +54962,13 @@ "symbol": "SAGA/USDT:USDT", "currency": "USDT", "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", - "notionalCap": "3000000", + "initialLeverage": "4", + "notionalCap": "2000000", "notionalFloor": "1500000", "maintMarginRatio": "0.1", "cum": "83450.0" @@ -46907,51 +54978,51 @@ "tier": 7.0, "symbol": "SAGA/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3750000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "3750000", - "notionalFloor": "3000000", + "initialLeverage": "3", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "158450.0" + "cum": "133450.0" } }, { "tier": 8.0, "symbol": "SAGA/USDT:USDT", "currency": "USDT", - "minNotional": 3750000.0, - "maxNotional": 7500000.0, + "minNotional": 2500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "3750000", + "notionalCap": "3000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.25", - "cum": "627200.0" + "cum": "445950.0" } }, { "tier": 9.0, "symbol": "SAGA/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 3000000.0, + "maxNotional": 3500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "3500000", + "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "2502200.0" + "cum": "1195950.0" } } ], @@ -47063,13 +55134,13 @@ "symbol": "SAND/USDT:USDT", "currency": "USDT", "minNotional": 3000000.0, - "maxNotional": 6000000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "7", "initialLeverage": "5", - "notionalCap": "6000000", + "notionalCap": "4000000", "notionalFloor": "3000000", "maintMarginRatio": "0.1", "cum": "167250.0" @@ -47079,51 +55150,51 @@ "tier": 8.0, "symbol": "SAND/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, - "maxNotional": 7500000.0, + "minNotional": 4000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "8", "initialLeverage": "4", - "notionalCap": "7500000", - "notionalFloor": "6000000", + "notionalCap": "5000000", + "notionalFloor": "4000000", "maintMarginRatio": "0.125", - "cum": "317250.0" + "cum": "267250.0" } }, { "tier": 9.0, "symbol": "SAND/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 5000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "6000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.25", - "cum": "1254750.0" + "cum": "892250.0" } }, { "tier": 10.0, "symbol": "SAND/USDT:USDT", "currency": "USDT", - "minNotional": 15000000.0, - "maxNotional": 30000000.0, + "minNotional": 6000000.0, + "maxNotional": 7000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "30000000", - "notionalFloor": "15000000", + "notionalCap": "7000000", + "notionalFloor": "6000000", "maintMarginRatio": "0.5", - "cum": "5004750.0" + "cum": "2392250.0" } } ], @@ -47135,10 +55206,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -47152,10 +55223,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -47169,10 +55240,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -47186,10 +55257,10 @@ "minNotional": 30000.0, "maxNotional": 60000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "60000", "notionalFloor": "30000", "maintMarginRatio": "0.025", @@ -47203,10 +55274,10 @@ "minNotional": 60000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "300000", "notionalFloor": "60000", "maintMarginRatio": "0.05", @@ -47220,10 +55291,10 @@ "minNotional": 300000.0, "maxNotional": 600000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "600000", "notionalFloor": "300000", "maintMarginRatio": "0.1", @@ -47237,10 +55308,10 @@ "minNotional": 600000.0, "maxNotional": 750000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "750000", "notionalFloor": "600000", "maintMarginRatio": "0.125", @@ -47394,10 +55465,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -47411,10 +55482,10 @@ "minNotional": 5000.0, "maxNotional": 16000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "16000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -47428,10 +55499,10 @@ "minNotional": 16000.0, "maxNotional": 80000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "80000", "notionalFloor": "16000", "maintMarginRatio": "0.02", @@ -47445,10 +55516,10 @@ "minNotional": 80000.0, "maxNotional": 160000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "160000", "notionalFloor": "80000", "maintMarginRatio": "0.025", @@ -47462,10 +55533,10 @@ "minNotional": 160000.0, "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "800000", "notionalFloor": "160000", "maintMarginRatio": "0.05", @@ -47479,10 +55550,10 @@ "minNotional": 800000.0, "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1600000", "notionalFloor": "800000", "maintMarginRatio": "0.1", @@ -47496,10 +55567,10 @@ "minNotional": 1600000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "2000000", "notionalFloor": "1600000", "maintMarginRatio": "0.125", @@ -47528,13 +55599,13 @@ "symbol": "SCR/USDT:USDT", "currency": "USDT", "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "maxNotional": 4500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "8000000", + "notionalCap": "4500000", "notionalFloor": "4000000", "maintMarginRatio": "0.5", "cum": "1334505.0" @@ -47702,13 +55773,13 @@ "symbol": "SEI/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" @@ -47718,136 +55789,153 @@ "tier": 2.0, "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 100000.0, + "minNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "100000", - "notionalFloor": "10000", + "notionalCap": "10000", + "notionalFloor": "5000", "maintMarginRatio": "0.015", - "cum": "50.0" + "cum": "25.0" } }, { "tier": 3.0, "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 500000.0, + "minNotional": 10000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "500000", - "notionalFloor": "100000", + "notionalCap": "25000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "550.0" + "cum": "75.0" } }, { "tier": 4.0, "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "50000", + "notionalFloor": "25000", "maintMarginRatio": "0.025", - "cum": "3050.0" + "cum": "200.0" } }, { "tier": 5.0, "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 5000000.0, + "minNotional": 50000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "5000000", - "notionalFloor": "1000000", + "notionalCap": "250000", + "notionalFloor": "50000", "maintMarginRatio": "0.05", - "cum": "28050.0" + "cum": "1450.0" } }, { "tier": 6.0, "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "500000", + "notionalFloor": "250000", "maintMarginRatio": "0.1", - "cum": "278050.0" + "cum": "13950.0" } }, { "tier": 7.0, "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 11000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "11000000", - "notionalFloor": "10000000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "528050.0" + "cum": "26450.0" } }, { "tier": 8.0, "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 11000000.0, - "maxNotional": 12000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "12000000", - "notionalFloor": "11000000", - "maintMarginRatio": "0.25", - "cum": "1903050.0" + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1667", + "cum": "68150.0" } }, { "tier": 9.0, "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 12000000.0, - "maxNotional": 13000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.25", + "cum": "318050.0" + } + }, + { + "tier": 10.0, + "symbol": "SEI/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "13000000", - "notionalFloor": "12000000", + "notionalCap": "8000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "4903050.0" + "cum": "1568050.0" } } ], @@ -47955,6 +56043,420 @@ } } ], + "SHELL/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "SHELL/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": "SHELL/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": "SHELL/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": "SHELL/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": "SHELL/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "23150.0" + } + }, + { + "tier": 6.0, + "symbol": "SHELL/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "116900.0" + } + }, + { + "tier": 7.0, + "symbol": "SHELL/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "491900.0" + } + } + ], + "SIGN/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "SIGN/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": "SIGN/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": "SIGN/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "SIGN/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "200.0" + } + }, + { + "tier": 5.0, + "symbol": "SIGN/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "125000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1450.0" + } + }, + { + "tier": 6.0, + "symbol": "SIGN/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.1", + "cum": "7700.0" + } + }, + { + "tier": 7.0, + "symbol": "SIGN/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "13950.0" + } + }, + { + "tier": 8.0, + "symbol": "SIGN/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "1500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34800.0" + } + }, + { + "tier": 9.0, + "symbol": "SIGN/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.25", + "cum": "159750.0" + } + }, + { + "tier": 10.0, + "symbol": "SIGN/USDT:USDT", + "currency": "USDT", + "minNotional": 2500000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "4000000", + "notionalFloor": "2500000", + "maintMarginRatio": "0.5", + "cum": "784750.0" + } + } + ], + "SIREN/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "SIREN/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": "SIREN/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": "SIREN/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": "SIREN/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": "SIREN/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "23150.0" + } + }, + { + "tier": 6.0, + "symbol": "SIREN/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "116900.0" + } + }, + { + "tier": 7.0, + "symbol": "SIREN/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "491900.0" + } + } + ], "SKL/USDT:USDT": [ { "tier": 1.0, @@ -49600,10 +58102,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -49617,10 +58119,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -49634,10 +58136,10 @@ "minNotional": 10000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 7.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "7", "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -49651,10 +58153,10 @@ "minNotional": 50000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.025", @@ -49668,10 +58170,10 @@ "minNotional": 100000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "500000", "notionalFloor": "100000", "maintMarginRatio": "0.05", @@ -49685,10 +58187,10 @@ "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.1", @@ -49702,10 +58204,10 @@ "minNotional": 1000000.0, "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "1250000", "notionalFloor": "1000000", "maintMarginRatio": "0.125", @@ -49995,15 +58497,15 @@ "symbol": "STMX/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 10.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 8.0, "info": { "bracket": "1", - "initialLeverage": "10", - "notionalCap": "5000", + "initialLeverage": "8", + "notionalCap": "25000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.025", "cum": "0.0" } }, @@ -50011,38 +58513,21 @@ "tier": 2.0, "symbol": "STMX/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": "STMX/USDT:USDT", - "currency": "USDT", "minNotional": 25000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 6.0, "info": { - "bracket": "3", + "bracket": "2", "initialLeverage": "6", "notionalCap": "100000", "notionalFloor": "25000", "maintMarginRatio": "0.05", - "cum": "650.0" + "cum": "625.0" } }, { - "tier": 4.0, + "tier": 3.0, "symbol": "STMX/USDT:USDT", "currency": "USDT", "minNotional": 100000.0, @@ -50050,46 +58535,167 @@ "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "4", + "bracket": "3", "initialLeverage": "5", "notionalCap": "250000", "notionalFloor": "100000", "maintMarginRatio": "0.1", - "cum": "5650.0" + "cum": "5625.0" + } + }, + { + "tier": 4.0, + "symbol": "STMX/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 2.0, + "info": { + "bracket": "4", + "initialLeverage": "2", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.125", + "cum": "11875.0" } }, { "tier": 5.0, "symbol": "STMX/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, + "minNotional": 500000.0, "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 2.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, "info": { "bracket": "5", - "initialLeverage": "2", + "initialLeverage": "1", "notionalCap": "1000000", - "notionalFloor": "250000", + "notionalFloor": "500000", + "maintMarginRatio": "0.5", + "cum": "199375.0" + } + } + ], + "STO/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "STO/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "1", + "initialLeverage": "20", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.025", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "STO/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.033, + "maxLeverage": 15.0, + "info": { + "bracket": "2", + "initialLeverage": "15", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.033", + "cum": "40.0" + } + }, + { + "tier": 3.0, + "symbol": "STO/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": "465.0" + } + }, + { + "tier": 4.0, + "symbol": "STO/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": "5465.0" + } + }, + { + "tier": 5.0, + "symbol": "STO/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": "11900.0" + "cum": "10465.0" } }, { "tier": 6.0, - "symbol": "STMX/USDT:USDT", + "symbol": "STO/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": "72965.0" + } + }, + { + "tier": 7.0, + "symbol": "STO/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 1500000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "1", - "notionalCap": "1500000", + "notionalCap": "2000000", "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "386900.0" + "cum": "322965.0" } } ], @@ -51050,10 +59656,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -51067,10 +59673,10 @@ "minNotional": 5000.0, "maxNotional": 16000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "16000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -51084,10 +59690,10 @@ "minNotional": 16000.0, "maxNotional": 80000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 7.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "7", "notionalCap": "80000", "notionalFloor": "16000", "maintMarginRatio": "0.02", @@ -51101,10 +59707,10 @@ "minNotional": 80000.0, "maxNotional": 160000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "160000", "notionalFloor": "80000", "maintMarginRatio": "0.025", @@ -51118,10 +59724,10 @@ "minNotional": 160000.0, "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "800000", "notionalFloor": "160000", "maintMarginRatio": "0.05", @@ -51135,10 +59741,10 @@ "minNotional": 800000.0, "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1600000", "notionalFloor": "800000", "maintMarginRatio": "0.1", @@ -51152,10 +59758,10 @@ "minNotional": 1600000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "2000000", "notionalFloor": "1600000", "maintMarginRatio": "0.125", @@ -51791,10 +60397,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -51808,10 +60414,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -51825,10 +60431,10 @@ "minNotional": 20000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "8", "notionalCap": "100000", "notionalFloor": "20000", "maintMarginRatio": "0.02", @@ -51842,10 +60448,10 @@ "minNotional": 100000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "7", "notionalCap": "200000", "notionalFloor": "100000", "maintMarginRatio": "0.025", @@ -51859,10 +60465,10 @@ "minNotional": 200000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "1000000", "notionalFloor": "200000", "maintMarginRatio": "0.05", @@ -51908,33 +60514,50 @@ "symbol": "SXP/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, - "maxNotional": 6000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maxNotional": 3750000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "6000000", + "initialLeverage": "3", + "notionalCap": "3750000", "notionalFloor": "2500000", - "maintMarginRatio": "0.25", - "cum": "418150.0" + "maintMarginRatio": "0.1667", + "cum": "209900.0" } }, { "tier": 9.0, "symbol": "SXP/USDT:USDT", "currency": "USDT", - "minNotional": 6000000.0, + "minNotional": 3750000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3750000", + "maintMarginRatio": "0.25", + "cum": "522275.0" + } + }, + { + "tier": 10.0, + "symbol": "SXP/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", "notionalCap": "10000000", - "notionalFloor": "6000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1918150.0" + "cum": "1772275.0" } } ], @@ -52515,10 +61138,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -52532,10 +61155,10 @@ "minNotional": 10000.0, "maxNotional": 40000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "40000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -52549,10 +61172,10 @@ "minNotional": 40000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "200000", "notionalFloor": "40000", "maintMarginRatio": "0.02", @@ -52566,10 +61189,10 @@ "minNotional": 200000.0, "maxNotional": 400000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "400000", "notionalFloor": "200000", "maintMarginRatio": "0.025", @@ -52583,10 +61206,10 @@ "minNotional": 400000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "2000000", "notionalFloor": "400000", "maintMarginRatio": "0.05", @@ -52598,13 +61221,13 @@ "symbol": "THE/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, - "maxNotional": 4000000.0, + "maxNotional": 3500000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", - "notionalCap": "4000000", + "initialLeverage": "4", + "notionalCap": "3500000", "notionalFloor": "2000000", "maintMarginRatio": "0.1", "cum": "111250.0" @@ -52614,51 +61237,51 @@ "tier": 7.0, "symbol": "THE/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 5000000.0, + "minNotional": 3500000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "5000000", - "notionalFloor": "4000000", + "initialLeverage": "3", + "notionalCap": "4000000", + "notionalFloor": "3500000", "maintMarginRatio": "0.125", - "cum": "211250.0" + "cum": "198750.0" } }, { "tier": 8.0, "symbol": "THE/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 4000000.0, + "maxNotional": 4500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "4500000", + "notionalFloor": "4000000", "maintMarginRatio": "0.25", - "cum": "836250.0" + "cum": "698750.0" } }, { "tier": 9.0, "symbol": "THE/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "minNotional": 4500000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "5000000", + "notionalFloor": "4500000", "maintMarginRatio": "0.5", - "cum": "3336250.0" + "cum": "1823750.0" } } ], @@ -53029,13 +61652,13 @@ "symbol": "TIA/USDT:USDT", "currency": "USDT", "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "10000000", + "notionalCap": "6000000", "notionalFloor": "5000000", "maintMarginRatio": "0.1", "cum": "278050.0" @@ -53045,51 +61668,51 @@ "tier": 7.0, "symbol": "TIA/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 12500000.0, + "minNotional": 6000000.0, + "maxNotional": 7000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "12500000", - "notionalFloor": "10000000", + "notionalCap": "7000000", + "notionalFloor": "6000000", "maintMarginRatio": "0.125", - "cum": "528050.0" + "cum": "428050.0" } }, { "tier": 8.0, "symbol": "TIA/USDT:USDT", "currency": "USDT", - "minNotional": 12500000.0, - "maxNotional": 25000000.0, + "minNotional": 7000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "25000000", - "notionalFloor": "12500000", + "notionalCap": "8000000", + "notionalFloor": "7000000", "maintMarginRatio": "0.25", - "cum": "2090550.0" + "cum": "1303050.0" } }, { "tier": 9.0, "symbol": "TIA/USDT:USDT", "currency": "USDT", - "minNotional": 25000000.0, - "maxNotional": 50000000.0, + "minNotional": 8000000.0, + "maxNotional": 9000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "50000000", - "notionalFloor": "25000000", + "notionalCap": "9000000", + "notionalFloor": "8000000", "maintMarginRatio": "0.5", - "cum": "8340550.0" + "cum": "3303050.0" } } ], @@ -53222,10 +61845,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -53239,10 +61862,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -53256,10 +61879,10 @@ "minNotional": 10000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -53273,10 +61896,10 @@ "minNotional": 50000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.025", @@ -53290,10 +61913,10 @@ "minNotional": 100000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "500000", "notionalFloor": "100000", "maintMarginRatio": "0.05", @@ -53307,10 +61930,10 @@ "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.1", @@ -53324,10 +61947,10 @@ "minNotional": 1000000.0, "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "1250000", "notionalFloor": "1000000", "maintMarginRatio": "0.125", @@ -53564,13 +62187,13 @@ "symbol": "TON/USDT:USDT", "currency": "USDT", "minNotional": 800000.0, - "maxNotional": 4000000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "4000000", + "notionalCap": "3000000", "notionalFloor": "800000", "maintMarginRatio": "0.05", "cum": "22450.0" @@ -53580,68 +62203,68 @@ "tier": 6.0, "symbol": "TON/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "8000000", - "notionalFloor": "4000000", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.1", - "cum": "222450.0" + "cum": "172450.0" } }, { "tier": 7.0, "symbol": "TON/USDT:USDT", "currency": "USDT", - "minNotional": 8000000.0, - "maxNotional": 10000000.0, + "minNotional": 5000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "10000000", - "notionalFloor": "8000000", + "notionalCap": "6000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.125", - "cum": "422450.0" + "cum": "297450.0" } }, { "tier": 8.0, "symbol": "TON/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "minNotional": 6000000.0, + "maxNotional": 7000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "7000000", + "notionalFloor": "6000000", "maintMarginRatio": "0.25", - "cum": "1672450.0" + "cum": "1047450.0" } }, { "tier": 9.0, "symbol": "TON/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 40000000.0, + "minNotional": 7000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "40000000", - "notionalFloor": "20000000", + "notionalCap": "8000000", + "notionalFloor": "7000000", "maintMarginRatio": "0.5", - "cum": "6672450.0" + "cum": "2797450.0" } } ], @@ -53652,14 +62275,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 26.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "26", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, @@ -53668,15 +62291,15 @@ "symbol": "TRB/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.02, - "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.02", + "maintMarginRatio": "0.015", "cum": "25.0" } }, @@ -53684,102 +62307,136 @@ "tier": 3.0, "symbol": "TRB/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "100000", - "notionalFloor": "50000", - "maintMarginRatio": "0.025", - "cum": "275.0" + "initialLeverage": "25", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" } }, { "tier": 4.0, "symbol": "TRB/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 400000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "400000", - "notionalFloor": "100000", - "maintMarginRatio": "0.05", - "cum": "2775.0" + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "200.0" } }, { "tier": 5.0, "symbol": "TRB/USDT:USDT", "currency": "USDT", - "minNotional": 400000.0, - "maxNotional": 1000000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 50000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "5", - "initialLeverage": "5", - "notionalCap": "1000000", - "notionalFloor": "400000", - "maintMarginRatio": "0.1", - "cum": "22775.0" + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1450.0" } }, { "tier": 6.0, "symbol": "TRB/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 2000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "6", - "initialLeverage": "4", - "notionalCap": "2000000", - "notionalFloor": "1000000", - "maintMarginRatio": "0.125", - "cum": "47775.0" + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "13950.0" } }, { "tier": 7.0, "symbol": "TRB/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "7", - "initialLeverage": "2", - "notionalCap": "4000000", - "notionalFloor": "2000000", - "maintMarginRatio": "0.25", - "cum": "297775.0" + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "26450.0" } }, { "tier": 8.0, "symbol": "TRB/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 4500000.0, + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1667", + "cum": "68150.0" + } + }, + { + "tier": 9.0, + "symbol": "TRB/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.25", + "cum": "318050.0" + } + }, + { + "tier": 10.0, + "symbol": "TRB/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "4500000", - "notionalFloor": "4000000", + "notionalCap": "8000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1297775.0" + "cum": "1568050.0" } } ], @@ -53946,10 +62603,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -53963,10 +62620,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -53980,10 +62637,10 @@ "minNotional": 10000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -53997,10 +62654,10 @@ "minNotional": 50000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.025", @@ -54014,10 +62671,10 @@ "minNotional": 100000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "500000", "notionalFloor": "100000", "maintMarginRatio": "0.05", @@ -54031,10 +62688,10 @@ "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.1", @@ -54048,10 +62705,10 @@ "minNotional": 1000000.0, "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "1250000", "notionalFloor": "1000000", "maintMarginRatio": "0.125", @@ -54093,18 +62750,18 @@ } } ], - "TRUMP/USDT:USDT": [ + "TRUMP/USDC:USDC": [ { "tier": 1.0, - "symbol": "TRUMP/USDT:USDT", - "currency": "USDT", + "symbol": "TRUMP/USDC:USDC", + "currency": "USDC", "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 50.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", + "initialLeverage": "25", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -54113,15 +62770,15 @@ }, { "tier": 2.0, - "symbol": "TRUMP/USDT:USDT", - "currency": "USDT", + "symbol": "TRUMP/USDC:USDC", + "currency": "USDC", "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 25.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -54130,8 +62787,8 @@ }, { "tier": 3.0, - "symbol": "TRUMP/USDT:USDT", - "currency": "USDT", + "symbol": "TRUMP/USDC:USDC", + "currency": "USDC", "minNotional": 20000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, @@ -54147,8 +62804,8 @@ }, { "tier": 4.0, - "symbol": "TRUMP/USDT:USDT", - "currency": "USDT", + "symbol": "TRUMP/USDC:USDC", + "currency": "USDC", "minNotional": 100000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, @@ -54164,21 +62821,176 @@ }, { "tier": 5.0, - "symbol": "TRUMP/USDT:USDT", - "currency": "USDT", + "symbol": "TRUMP/USDC:USDC", + "currency": "USDC", "minNotional": 200000.0, - "maxNotional": 1000000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 8.0, "info": { "bracket": "5", "initialLeverage": "8", - "notionalCap": "1000000", + "notionalCap": "500000", "notionalFloor": "200000", "maintMarginRatio": "0.05", "cum": "5650.0" } }, + { + "tier": 6.0, + "symbol": "TRUMP/USDC:USDC", + "currency": "USDC", + "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": "30650.0" + } + }, + { + "tier": 7.0, + "symbol": "TRUMP/USDC:USDC", + "currency": "USDC", + "minNotional": 1000000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "1500000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.125", + "cum": "55650.0" + } + }, + { + "tier": 8.0, + "symbol": "TRUMP/USDC:USDC", + "currency": "USDC", + "minNotional": 1500000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "2000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.25", + "cum": "243150.0" + } + }, + { + "tier": 9.0, + "symbol": "TRUMP/USDC:USDC", + "currency": "USDC", + "minNotional": 2000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.5", + "cum": "743150.0" + } + } + ], + "TRUMP/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "TRUMP/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": "TRUMP/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "20000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "TRUMP/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": "125.0" + } + }, + { + "tier": 4.0, + "symbol": "TRUMP/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": "625.0" + } + }, + { + "tier": 5.0, + "symbol": "TRUMP/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": "5625.0" + } + }, { "tier": 6.0, "symbol": "TRUMP/USDT:USDT", @@ -54193,7 +63005,7 @@ "notionalCap": "2000000", "notionalFloor": "1000000", "maintMarginRatio": "0.1", - "cum": "55650.0" + "cum": "55625.0" } }, { @@ -54210,7 +63022,7 @@ "notionalCap": "2500000", "notionalFloor": "2000000", "maintMarginRatio": "0.125", - "cum": "105650.0" + "cum": "105625.0" } }, { @@ -54218,33 +63030,50 @@ "symbol": "TRUMP/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maxNotional": 3750000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "5000000", + "initialLeverage": "3", + "notionalCap": "3750000", "notionalFloor": "2500000", - "maintMarginRatio": "0.25", - "cum": "418150.0" + "maintMarginRatio": "0.1667", + "cum": "209875.0" } }, { "tier": 9.0, "symbol": "TRUMP/USDT:USDT", "currency": "USDT", + "minNotional": 3750000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3750000", + "maintMarginRatio": "0.25", + "cum": "522250.0" + } + }, + { + "tier": 10.0, + "symbol": "TRUMP/USDT:USDT", + "currency": "USDT", "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "maxNotional": 6000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "10000000", + "notionalCap": "6000000", "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1668150.0" + "cum": "1772250.0" } } ], @@ -54420,19 +63249,174 @@ } } ], + "TST/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "TST/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 10.0, + "info": { + "bracket": "1", + "initialLeverage": "10", + "notionalCap": "5000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "TST/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 8.0, + "info": { + "bracket": "2", + "initialLeverage": "8", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "TST/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 7.0, + "info": { + "bracket": "3", + "initialLeverage": "7", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "TST/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 6.0, + "info": { + "bracket": "4", + "initialLeverage": "6", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "TST/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "TST/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "16725.0" + } + }, + { + "tier": 7.0, + "symbol": "TST/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "TST/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "125475.0" + } + }, + { + "tier": 9.0, + "symbol": "TST/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "2000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "500475.0" + } + } + ], "TURBO/USDT:USDT": [ { "tier": 1.0, "symbol": "TURBO/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" @@ -54442,136 +63426,274 @@ "tier": 2.0, "symbol": "TURBO/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": "TURBO/USDT:USDT", "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 300000.0, + "minNotional": 10000.0, + "maxNotional": 25000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "300000", - "notionalFloor": "60000", + "notionalCap": "25000", + "notionalFloor": "10000", "maintMarginRatio": "0.02", - "cum": "350.0" + "cum": "75.0" } }, { "tier": 4.0, "symbol": "TURBO/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 600000.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "600000", - "notionalFloor": "300000", + "notionalCap": "50000", + "notionalFloor": "25000", "maintMarginRatio": "0.025", - "cum": "1850.0" + "cum": "200.0" } }, { "tier": 5.0, "symbol": "TURBO/USDT:USDT", "currency": "USDT", - "minNotional": 600000.0, - "maxNotional": 3000000.0, + "minNotional": 50000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "5", "initialLeverage": "10", - "notionalCap": "3000000", - "notionalFloor": "600000", + "notionalCap": "250000", + "notionalFloor": "50000", "maintMarginRatio": "0.05", - "cum": "16850.0" + "cum": "1450.0" } }, { "tier": 6.0, "symbol": "TURBO/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3500000.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "3500000", - "notionalFloor": "3000000", + "notionalCap": "500000", + "notionalFloor": "250000", "maintMarginRatio": "0.1", - "cum": "166850.0" + "cum": "13950.0" } }, { "tier": 7.0, "symbol": "TURBO/USDT:USDT", "currency": "USDT", - "minNotional": 3500000.0, - "maxNotional": 4000000.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "4000000", - "notionalFloor": "3500000", + "notionalCap": "1000000", + "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "254350.0" + "cum": "26450.0" } }, { "tier": 8.0, "symbol": "TURBO/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "4500000", - "notionalFloor": "4000000", - "maintMarginRatio": "0.25", - "cum": "754350.0" + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1667", + "cum": "68150.0" } }, { "tier": 9.0, "symbol": "TURBO/USDT:USDT", "currency": "USDT", - "minNotional": 4500000.0, + "minNotional": 3000000.0, "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.25", + "cum": "318050.0" + } + }, + { + "tier": 10.0, + "symbol": "TURBO/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "4500000", + "notionalCap": "8000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1879350.0" + "cum": "1568050.0" + } + } + ], + "TUT/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "TUT/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": "TUT/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": "TUT/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 5.0, + "info": { + "bracket": "3", + "initialLeverage": "5", + "notionalCap": "200000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "650.0" + } + }, + { + "tier": 4.0, + "symbol": "TUT/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 4.0, + "info": { + "bracket": "4", + "initialLeverage": "4", + "notionalCap": "500000", + "notionalFloor": "200000", + "maintMarginRatio": "0.1", + "cum": "10650.0" + } + }, + { + "tier": 5.0, + "symbol": "TUT/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 3.0, + "info": { + "bracket": "5", + "initialLeverage": "3", + "notionalCap": "750000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "23150.0" + } + }, + { + "tier": 6.0, + "symbol": "TUT/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "116900.0" + } + }, + { + "tier": 7.0, + "symbol": "TUT/USDT:USDT", + "currency": "USDT", + "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": "491900.0" } } ], @@ -54704,10 +63826,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -54721,10 +63843,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -54738,10 +63860,10 @@ "minNotional": 10000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -54755,10 +63877,10 @@ "minNotional": 50000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.025", @@ -54772,10 +63894,10 @@ "minNotional": 100000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "500000", "notionalFloor": "100000", "maintMarginRatio": "0.05", @@ -54789,10 +63911,10 @@ "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.1", @@ -54806,10 +63928,10 @@ "minNotional": 1000000.0, "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "1250000", "notionalFloor": "1000000", "maintMarginRatio": "0.125", @@ -55392,13 +64514,13 @@ "symbol": "USUAL/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, + "maxNotional": 7000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "25", - "notionalCap": "10000", + "initialLeverage": "20", + "notionalCap": "7000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -55408,136 +64530,153 @@ "tier": 2.0, "symbol": "USUAL/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 30000.0, + "minNotional": 7000.0, + "maxNotional": 18000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "20", - "notionalCap": "30000", - "notionalFloor": "10000", + "initialLeverage": "10", + "notionalCap": "18000", + "notionalFloor": "7000", "maintMarginRatio": "0.015", - "cum": "50.0" + "cum": "35.0" } }, { "tier": 3.0, "symbol": "USUAL/USDT:USDT", "currency": "USDT", - "minNotional": 30000.0, - "maxNotional": 150000.0, + "minNotional": 18000.0, + "maxNotional": 75000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 15.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "15", - "notionalCap": "150000", - "notionalFloor": "30000", + "initialLeverage": "8", + "notionalCap": "75000", + "notionalFloor": "18000", "maintMarginRatio": "0.02", - "cum": "200.0" + "cum": "125.0" } }, { "tier": 4.0, "symbol": "USUAL/USDT:USDT", "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 300000.0, + "minNotional": 75000.0, + "maxNotional": 150000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "300000", - "notionalFloor": "150000", + "initialLeverage": "7", + "notionalCap": "150000", + "notionalFloor": "75000", "maintMarginRatio": "0.025", - "cum": "950.0" + "cum": "500.0" } }, { "tier": 5.0, "symbol": "USUAL/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 1500000.0, + "minNotional": 150000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "8", - "notionalCap": "1500000", - "notionalFloor": "300000", + "initialLeverage": "6", + "notionalCap": "750000", + "notionalFloor": "150000", "maintMarginRatio": "0.05", - "cum": "8450.0" + "cum": "4250.0" } }, { "tier": 6.0, "symbol": "USUAL/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "1500000", + "notionalFloor": "750000", "maintMarginRatio": "0.1", - "cum": "83450.0" + "cum": "41750.0" } }, { "tier": 7.0, "symbol": "USUAL/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3750000.0, + "minNotional": 1500000.0, + "maxNotional": 2100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "3750000", - "notionalFloor": "3000000", + "notionalCap": "2100000", + "notionalFloor": "1500000", "maintMarginRatio": "0.125", - "cum": "158450.0" + "cum": "79250.0" } }, { "tier": 8.0, "symbol": "USUAL/USDT:USDT", "currency": "USDT", - "minNotional": 3750000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 2100000.0, + "maxNotional": 4050000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "3750000", - "maintMarginRatio": "0.25", - "cum": "627200.0" + "initialLeverage": "3", + "notionalCap": "4050000", + "notionalFloor": "2100000", + "maintMarginRatio": "0.1667", + "cum": "166820.0" } }, { "tier": 9.0, "symbol": "USUAL/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 8500000.0, + "minNotional": 4050000.0, + "maxNotional": 6000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "6000000", + "notionalFloor": "4050000", + "maintMarginRatio": "0.25", + "cum": "504185.0" + } + }, + { + "tier": 10.0, + "symbol": "USUAL/USDT:USDT", + "currency": "USDT", + "minNotional": 6000000.0, + "maxNotional": 8200000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "8500000", - "notionalFloor": "7500000", + "notionalCap": "8200000", + "notionalFloor": "6000000", "maintMarginRatio": "0.5", - "cum": "2502200.0" + "cum": "2004185.0" } } ], @@ -55549,10 +64688,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -55566,10 +64705,10 @@ "minNotional": 5000.0, "maxNotional": 16000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "16000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -55583,10 +64722,10 @@ "minNotional": 16000.0, "maxNotional": 80000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 7.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "7", "notionalCap": "80000", "notionalFloor": "16000", "maintMarginRatio": "0.02", @@ -55600,10 +64739,10 @@ "minNotional": 80000.0, "maxNotional": 160000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "160000", "notionalFloor": "80000", "maintMarginRatio": "0.025", @@ -55617,10 +64756,10 @@ "minNotional": 160000.0, "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "800000", "notionalFloor": "160000", "maintMarginRatio": "0.05", @@ -55634,10 +64773,10 @@ "minNotional": 800000.0, "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1600000", "notionalFloor": "800000", "maintMarginRatio": "0.1", @@ -55651,10 +64790,10 @@ "minNotional": 1600000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "2000000", "notionalFloor": "1600000", "maintMarginRatio": "0.125", @@ -55704,10 +64843,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -55721,10 +64860,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -55738,10 +64877,10 @@ "minNotional": 20000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 15.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "15", + "initialLeverage": "8", "notionalCap": "100000", "notionalFloor": "20000", "maintMarginRatio": "0.02", @@ -55755,10 +64894,10 @@ "minNotional": 100000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "10", + "initialLeverage": "7", "notionalCap": "200000", "notionalFloor": "100000", "maintMarginRatio": "0.025", @@ -55772,10 +64911,10 @@ "minNotional": 200000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "8", + "initialLeverage": "6", "notionalCap": "1000000", "notionalFloor": "200000", "maintMarginRatio": "0.05", @@ -55821,33 +64960,50 @@ "symbol": "VANA/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, - "maxNotional": 3000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maxNotional": 2750000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "3000000", + "initialLeverage": "3", + "notionalCap": "2750000", "notionalFloor": "2500000", - "maintMarginRatio": "0.25", - "cum": "418150.0" + "maintMarginRatio": "0.1667", + "cum": "209900.0" } }, { "tier": 9.0, "symbol": "VANA/USDT:USDT", "currency": "USDT", + "minNotional": 2750000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "3000000", + "notionalFloor": "2750000", + "maintMarginRatio": "0.25", + "cum": "438975.0" + } + }, + { + "tier": 10.0, + "symbol": "VANA/USDT:USDT", + "currency": "USDT", "minNotional": 3000000.0, "maxNotional": 3500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", "notionalCap": "3500000", "notionalFloor": "3000000", "maintMarginRatio": "0.5", - "cum": "1168150.0" + "cum": "1188975.0" } } ], @@ -56218,13 +65374,13 @@ "symbol": "VET/USDT:USDT", "currency": "USDT", "minNotional": 400000.0, - "maxNotional": 2000000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "6", "initialLeverage": "10", - "notionalCap": "2000000", + "notionalCap": "1000000", "notionalFloor": "400000", "maintMarginRatio": "0.05", "cum": "11345.0" @@ -56234,68 +65390,223 @@ "tier": 7.0, "symbol": "VET/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, + "minNotional": 1000000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "7", "initialLeverage": "5", - "notionalCap": "4000000", - "notionalFloor": "2000000", + "notionalCap": "1500000", + "notionalFloor": "1000000", "maintMarginRatio": "0.1", - "cum": "111345.0" + "cum": "61345.0" } }, { "tier": 8.0, "symbol": "VET/USDT:USDT", "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 5000000.0, + "minNotional": 1500000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "8", "initialLeverage": "4", - "notionalCap": "5000000", - "notionalFloor": "4000000", + "notionalCap": "2000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.125", - "cum": "211345.0" + "cum": "98845.0" } }, { "tier": 9.0, "symbol": "VET/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.25", - "cum": "836345.0" + "cum": "348845.0" } }, { "tier": 10.0, "symbol": "VET/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "minNotional": 2500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "3000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "3336345.0" + "cum": "973845.0" + } + } + ], + "VIC/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "VIC/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, + "symbol": "VIC/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 15.0, + "info": { + "bracket": "2", + "initialLeverage": "15", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "VIC/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "30000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "VIC/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 6.0, + "info": { + "bracket": "4", + "initialLeverage": "6", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "225.0" + } + }, + { + "tier": 5.0, + "symbol": "VIC/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1725.0" + } + }, + { + "tier": 6.0, + "symbol": "VIC/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "16725.0" + } + }, + { + "tier": 7.0, + "symbol": "VIC/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31725.0" + } + }, + { + "tier": 8.0, + "symbol": "VIC/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": "VIC/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" } } ], @@ -56305,15 +65616,15 @@ "symbol": "VIDT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxNotional": 160000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 7.0, "info": { "bracket": "1", - "initialLeverage": "75", - "notionalCap": "5000", + "initialLeverage": "7", + "notionalCap": "160000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.025", "cum": "0.0" } }, @@ -56321,68 +65632,68 @@ "tier": 2.0, "symbol": "VIDT/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 16000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "minNotional": 160000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, "info": { "bracket": "2", - "initialLeverage": "50", - "notionalCap": "16000", - "notionalFloor": "5000", - "maintMarginRatio": "0.015", - "cum": "25.0" + "initialLeverage": "6", + "notionalCap": "500000", + "notionalFloor": "160000", + "maintMarginRatio": "0.05", + "cum": "4000.0" } }, { "tier": 3.0, "symbol": "VIDT/USDT:USDT", "currency": "USDT", - "minNotional": 16000.0, - "maxNotional": 80000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 500000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "80000", - "notionalFloor": "16000", - "maintMarginRatio": "0.02", - "cum": "105.0" + "initialLeverage": "5", + "notionalCap": "600000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1", + "cum": "29000.0" } }, { "tier": 4.0, "symbol": "VIDT/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 160000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 600000.0, + "maxNotional": 700000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "160000", - "notionalFloor": "80000", - "maintMarginRatio": "0.025", - "cum": "505.0" + "initialLeverage": "4", + "notionalCap": "700000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "44000.0" } }, { "tier": 5.0, "symbol": "VIDT/USDT:USDT", "currency": "USDT", - "minNotional": 160000.0, + "minNotional": 700000.0, "maxNotional": 800000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "2", "notionalCap": "800000", - "notionalFloor": "160000", - "maintMarginRatio": "0.05", - "cum": "4505.0" + "notionalFloor": "700000", + "maintMarginRatio": "0.25", + "cum": "131500.0" } }, { @@ -56390,67 +65701,16 @@ "symbol": "VIDT/USDT:USDT", "currency": "USDT", "minNotional": 800000.0, - "maxNotional": 1600000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "6", - "initialLeverage": "5", - "notionalCap": "1600000", - "notionalFloor": "800000", - "maintMarginRatio": "0.1", - "cum": "44505.0" - } - }, - { - "tier": 7.0, - "symbol": "VIDT/USDT:USDT", - "currency": "USDT", - "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": "VIDT/USDT:USDT", - "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 4000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "8", - "initialLeverage": "2", - "notionalCap": "4000000", - "notionalFloor": "2000000", - "maintMarginRatio": "0.25", - "cum": "334505.0" - } - }, - { - "tier": 9.0, - "symbol": "VIDT/USDT:USDT", - "currency": "USDT", - "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "maxNotional": 900000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "8000000", - "notionalFloor": "4000000", + "notionalCap": "900000", + "notionalFloor": "800000", "maintMarginRatio": "0.5", - "cum": "1334505.0" + "cum": "331500.0" } } ], @@ -56581,13 +65841,13 @@ "symbol": "VIRTUAL/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, + "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 25.0, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "25", - "notionalCap": "10000", + "initialLeverage": "75", + "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -56597,17 +65857,17 @@ "tier": 2.0, "symbol": "VIRTUAL/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, + "minNotional": 5000.0, "maxNotional": 40000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 20.0, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "50", "notionalCap": "40000", - "notionalFloor": "10000", + "notionalFloor": "5000", "maintMarginRatio": "0.015", - "cum": "50.0" + "cum": "25.0" } }, { @@ -56617,14 +65877,14 @@ "minNotional": 40000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 15.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "15", + "initialLeverage": "10", "notionalCap": "200000", "notionalFloor": "40000", "maintMarginRatio": "0.02", - "cum": "250.0" + "cum": "225.0" } }, { @@ -56634,14 +65894,14 @@ "minNotional": 200000.0, "maxNotional": 400000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "400000", "notionalFloor": "200000", "maintMarginRatio": "0.025", - "cum": "1250.0" + "cum": "1225.0" } }, { @@ -56651,14 +65911,14 @@ "minNotional": 400000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "8", + "initialLeverage": "5", "notionalCap": "2000000", "notionalFloor": "400000", "maintMarginRatio": "0.05", - "cum": "11250.0" + "cum": "11225.0" } }, { @@ -56668,14 +65928,14 @@ "minNotional": 2000000.0, "maxNotional": 4000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "4000000", "notionalFloor": "2000000", "maintMarginRatio": "0.1", - "cum": "111250.0" + "cum": "111225.0" } }, { @@ -56685,14 +65945,14 @@ "minNotional": 4000000.0, "maxNotional": 5000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "5000000", "notionalFloor": "4000000", "maintMarginRatio": "0.125", - "cum": "211250.0" + "cum": "211225.0" } }, { @@ -56709,7 +65969,7 @@ "notionalCap": "10000000", "notionalFloor": "5000000", "maintMarginRatio": "0.25", - "cum": "836250.0" + "cum": "836225.0" } }, { @@ -56726,7 +65986,7 @@ "notionalCap": "11000000", "notionalFloor": "10000000", "maintMarginRatio": "0.5", - "cum": "3336250.0" + "cum": "3336225.0" } } ], @@ -56736,15 +65996,15 @@ "symbol": "VOXEL/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 15.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "15", + "notionalCap": "20000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -56752,72 +66012,55 @@ "tier": 2.0, "symbol": "VOXEL/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 20000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "20000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "initialLeverage": "10", + "notionalCap": "25000", + "notionalFloor": "20000", + "maintMarginRatio": "0.025", + "cum": "100.0" } }, { "tier": 3.0, "symbol": "VOXEL/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 25000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "20000", - "maintMarginRatio": "0.025", - "cum": "125.0" + "initialLeverage": "6", + "notionalCap": "200000", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "725.0" } }, { "tier": 4.0, "symbol": "VOXEL/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": "VOXEL/USDT:USDT", - "currency": "USDT", "minNotional": 200000.0, "maxNotional": 400000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "4", "initialLeverage": "5", "notionalCap": "400000", "notionalFloor": "200000", "maintMarginRatio": "0.1", - "cum": "10750.0" + "cum": "10725.0" } }, { - "tier": 6.0, + "tier": 5.0, "symbol": "VOXEL/USDT:USDT", "currency": "USDT", "minNotional": 400000.0, @@ -56825,19 +66068,36 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "500000", "notionalFloor": "400000", "maintMarginRatio": "0.125", - "cum": "20750.0" + "cum": "20725.0" + } + }, + { + "tier": 6.0, + "symbol": "VOXEL/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "6", + "initialLeverage": "3", + "notionalCap": "750000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "41575.0" } }, { "tier": 7.0, "symbol": "VOXEL/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, + "minNotional": 750000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, @@ -56845,9 +66105,9 @@ "bracket": "7", "initialLeverage": "2", "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalFloor": "750000", "maintMarginRatio": "0.25", - "cum": "83250.0" + "cum": "104050.0" } }, { @@ -56864,7 +66124,7 @@ "notionalCap": "2000000", "notionalFloor": "1000000", "maintMarginRatio": "0.5", - "cum": "333250.0" + "cum": "354050.0" } } ], @@ -57152,10 +66412,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -57169,10 +66429,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -57186,10 +66446,10 @@ "minNotional": 20000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "8", "notionalCap": "100000", "notionalFloor": "20000", "maintMarginRatio": "0.02", @@ -57203,10 +66463,10 @@ "minNotional": 100000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "7", "notionalCap": "200000", "notionalFloor": "100000", "maintMarginRatio": "0.025", @@ -57220,10 +66480,10 @@ "minNotional": 200000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "1000000", "notionalFloor": "200000", "maintMarginRatio": "0.05", @@ -57269,33 +66529,171 @@ "symbol": "W/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maxNotional": 3750000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "5000000", + "initialLeverage": "3", + "notionalCap": "3750000", "notionalFloor": "2500000", - "maintMarginRatio": "0.25", - "cum": "418150.0" + "maintMarginRatio": "0.1667", + "cum": "209900.0" } }, { "tier": 9.0, "symbol": "W/USDT:USDT", "currency": "USDT", + "minNotional": 3750000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3750000", + "maintMarginRatio": "0.25", + "cum": "522275.0" + } + }, + { + "tier": 10.0, + "symbol": "W/USDT:USDT", + "currency": "USDT", "minNotional": 5000000.0, "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", "notionalCap": "10000000", "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1668150.0" + "cum": "1772275.0" + } + } + ], + "WAL/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "WAL/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": "WAL/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": "WAL/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": "WAL/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": "WAL/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "23150.0" + } + }, + { + "tier": 6.0, + "symbol": "WAL/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "116900.0" + } + }, + { + "tier": 7.0, + "symbol": "WAL/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "491900.0" } } ], @@ -57541,6 +66939,161 @@ } } ], + "WCT/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "WCT/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": "WCT/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": "WCT/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": "WCT/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": "WCT/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": "WCT/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": "WCT/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": "WCT/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": "WCT/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" + } + } + ], "WIF/USDC:USDC": [ { "tier": 1.0, @@ -57687,10 +67240,10 @@ "minNotional": 0.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "25", "notionalCap": "20000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -57704,10 +67257,10 @@ "minNotional": 20000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "200000", "notionalFloor": "20000", "maintMarginRatio": "0.015", @@ -57721,10 +67274,10 @@ "minNotional": 200000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 15.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "15", "notionalCap": "1000000", "notionalFloor": "200000", "maintMarginRatio": "0.02", @@ -57738,10 +67291,10 @@ "minNotional": 1000000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "10", "notionalCap": "2000000", "notionalFloor": "1000000", "maintMarginRatio": "0.025", @@ -57753,13 +67306,13 @@ "symbol": "WIF/USDT:USDT", "currency": "USDT", "minNotional": 2000000.0, - "maxNotional": 10000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 8.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "10000000", + "initialLeverage": "8", + "notionalCap": "5000000", "notionalFloor": "2000000", "maintMarginRatio": "0.05", "cum": "56100.0" @@ -57769,68 +67322,68 @@ "tier": 6.0, "symbol": "WIF/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 20000000.0, + "minNotional": 5000000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "20000000", - "notionalFloor": "10000000", + "notionalCap": "7500000", + "notionalFloor": "5000000", "maintMarginRatio": "0.1", - "cum": "556100.0" + "cum": "306100.0" } }, { "tier": 7.0, "symbol": "WIF/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 25000000.0, + "minNotional": 7500000.0, + "maxNotional": 10000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "25000000", - "notionalFloor": "20000000", + "notionalCap": "10000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.125", - "cum": "1056100.0" + "cum": "493600.0" } }, { "tier": 8.0, "symbol": "WIF/USDT:USDT", "currency": "USDT", - "minNotional": 25000000.0, - "maxNotional": 50000000.0, + "minNotional": 10000000.0, + "maxNotional": 12500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "50000000", - "notionalFloor": "25000000", + "notionalCap": "12500000", + "notionalFloor": "10000000", "maintMarginRatio": "0.25", - "cum": "4181100.0" + "cum": "1743600.0" } }, { "tier": 9.0, "symbol": "WIF/USDT:USDT", "currency": "USDT", - "minNotional": 50000000.0, - "maxNotional": 100000000.0, + "minNotional": 12500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "100000000", - "notionalFloor": "50000000", + "notionalCap": "15000000", + "notionalFloor": "12500000", "maintMarginRatio": "0.5", - "cum": "16681100.0" + "cum": "4868600.0" } } ], @@ -57996,14 +67549,14 @@ "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" } }, @@ -58012,152 +67565,152 @@ "symbol": "WLD/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 60000.0, - "maintenanceMarginRate": 0.01, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "60000", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.01", - "cum": "20.0" + "maintMarginRatio": "0.015", + "cum": "25.0" } }, { "tier": 3.0, "symbol": "WLD/USDT:USDT", "currency": "USDT", - "minNotional": 60000.0, - "maxNotional": 160000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 40.0, + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "40", - "notionalCap": "160000", - "notionalFloor": "60000", - "maintMarginRatio": "0.015", - "cum": "320.0" + "initialLeverage": "25", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" } }, { "tier": 4.0, "symbol": "WLD/USDT:USDT", "currency": "USDT", - "minNotional": 160000.0, - "maxNotional": 800000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 25000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "4", - "initialLeverage": "25", - "notionalCap": "800000", - "notionalFloor": "160000", - "maintMarginRatio": "0.02", - "cum": "1120.0" + "initialLeverage": "20", + "notionalCap": "50000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "200.0" } }, { "tier": 5.0, "symbol": "WLD/USDT:USDT", "currency": "USDT", - "minNotional": 800000.0, - "maxNotional": 1600000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 50000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "5", - "initialLeverage": "20", - "notionalCap": "1600000", - "notionalFloor": "800000", - "maintMarginRatio": "0.025", - "cum": "5120.0" + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1450.0" } }, { "tier": 6.0, "symbol": "WLD/USDT:USDT", "currency": "USDT", - "minNotional": 1600000.0, - "maxNotional": 8000000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "6", - "initialLeverage": "10", - "notionalCap": "8000000", - "notionalFloor": "1600000", - "maintMarginRatio": "0.05", - "cum": "45120.0" + "initialLeverage": "5", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "13950.0" } }, { "tier": 7.0, "symbol": "WLD/USDT:USDT", "currency": "USDT", - "minNotional": 8000000.0, - "maxNotional": 16000000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 500000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "7", - "initialLeverage": "5", - "notionalCap": "16000000", - "notionalFloor": "8000000", - "maintMarginRatio": "0.1", - "cum": "445120.0" + "initialLeverage": "4", + "notionalCap": "1000000", + "notionalFloor": "500000", + "maintMarginRatio": "0.125", + "cum": "26450.0" } }, { "tier": 8.0, "symbol": "WLD/USDT:USDT", "currency": "USDT", - "minNotional": 16000000.0, - "maxNotional": 20000000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 1000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "4", - "notionalCap": "20000000", - "notionalFloor": "16000000", - "maintMarginRatio": "0.125", - "cum": "845120.0" + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.1667", + "cum": "68150.0" } }, { "tier": 9.0, "symbol": "WLD/USDT:USDT", "currency": "USDT", - "minNotional": 20000000.0, - "maxNotional": 40000000.0, + "minNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "40000000", - "notionalFloor": "20000000", + "notionalCap": "5000000", + "notionalFloor": "3000000", "maintMarginRatio": "0.25", - "cum": "3345120.0" + "cum": "318050.0" } }, { "tier": 10.0, "symbol": "WLD/USDT:USDT", "currency": "USDT", - "minNotional": 40000000.0, - "maxNotional": 80000000.0, + "minNotional": 5000000.0, + "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "80000000", - "notionalFloor": "40000000", + "notionalCap": "8000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "13345120.0" + "cum": "1568050.0" } } ], @@ -58271,15 +67824,15 @@ "symbol": "XAI/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 4000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 25.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "25", + "notionalCap": "4000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, @@ -58287,72 +67840,89 @@ "tier": 2.0, "symbol": "XAI/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 4000.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "25000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "initialLeverage": "20", + "notionalCap": "5000", + "notionalFloor": "4000", + "maintMarginRatio": "0.015", + "cum": "20.0" } }, { "tier": 3.0, "symbol": "XAI/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 80000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "80000", - "notionalFloor": "25000", - "maintMarginRatio": "0.025", - "cum": "150.0" + "initialLeverage": "10", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.02", + "cum": "45.0" } }, { "tier": 4.0, "symbol": "XAI/USDT:USDT", "currency": "USDT", - "minNotional": 80000.0, - "maxNotional": 800000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 25000.0, + "maxNotional": 80000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "800000", - "notionalFloor": "80000", - "maintMarginRatio": "0.05", - "cum": "2150.0" + "initialLeverage": "7", + "notionalCap": "80000", + "notionalFloor": "25000", + "maintMarginRatio": "0.025", + "cum": "170.0" } }, { "tier": 5.0, "symbol": "XAI/USDT:USDT", "currency": "USDT", + "minNotional": 80000.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 6.0, + "info": { + "bracket": "5", + "initialLeverage": "6", + "notionalCap": "800000", + "notionalFloor": "80000", + "maintMarginRatio": "0.05", + "cum": "2170.0" + } + }, + { + "tier": 6.0, + "symbol": "XAI/USDT:USDT", + "currency": "USDT", "minNotional": 800000.0, "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", "notionalCap": "1600000", "notionalFloor": "800000", "maintMarginRatio": "0.1", - "cum": "42150.0" + "cum": "42170.0" } }, { - "tier": 6.0, + "tier": 7.0, "symbol": "XAI/USDT:USDT", "currency": "USDT", "minNotional": 1600000.0, @@ -58360,46 +67930,184 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", "notionalCap": "2000000", "notionalFloor": "1600000", "maintMarginRatio": "0.125", - "cum": "82150.0" - } - }, - { - "tier": 7.0, - "symbol": "XAI/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" + "cum": "82170.0" } }, { "tier": 8.0, "symbol": "XAI/USDT:USDT", "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "3000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.1667", + "cum": "165570.0" + } + }, + { + "tier": 9.0, + "symbol": "XAI/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "4000000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.25", + "cum": "415470.0" + } + }, + { + "tier": 10.0, + "symbol": "XAI/USDT:USDT", + "currency": "USDT", "minNotional": 4000000.0, "maxNotional": 8000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "10", "initialLeverage": "1", "notionalCap": "8000000", "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "1332150.0" + "cum": "1415470.0" + } + } + ], + "XCN/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "XCN/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "1", + "initialLeverage": "25", + "notionalCap": "30000", + "notionalFloor": "0", + "maintMarginRatio": "0.02", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "XCN/USDT:USDT", + "currency": "USDT", + "minNotional": 30000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "60000", + "notionalFloor": "30000", + "maintMarginRatio": "0.025", + "cum": "150.0" + } + }, + { + "tier": 3.0, + "symbol": "XCN/USDT:USDT", + "currency": "USDT", + "minNotional": 60000.0, + "maxNotional": 300000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "300000", + "notionalFloor": "60000", + "maintMarginRatio": "0.05", + "cum": "1650.0" + } + }, + { + "tier": 4.0, + "symbol": "XCN/USDT:USDT", + "currency": "USDT", + "minNotional": 300000.0, + "maxNotional": 600000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "600000", + "notionalFloor": "300000", + "maintMarginRatio": "0.1", + "cum": "16650.0" + } + }, + { + "tier": 5.0, + "symbol": "XCN/USDT:USDT", + "currency": "USDT", + "minNotional": 600000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "750000", + "notionalFloor": "600000", + "maintMarginRatio": "0.125", + "cum": "31650.0" + } + }, + { + "tier": 6.0, + "symbol": "XCN/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "6", + "initialLeverage": "2", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.25", + "cum": "125400.0" + } + }, + { + "tier": 7.0, + "symbol": "XCN/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "7", + "initialLeverage": "1", + "notionalCap": "3000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.5", + "cum": "500400.0" } } ], @@ -58823,13 +68531,13 @@ "symbol": "XRP/USDC:USDC", "currency": "USDC", "minNotional": 0.0, - "maxNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.005, - "maxLeverage": 50.0, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.005", "cum": "0.0" @@ -58839,51 +68547,51 @@ "tier": 2.0, "symbol": "XRP/USDC:USDC", "currency": "USDC", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.006, - "maxLeverage": 25.0, + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.006", - "cum": "5.0" + "initialLeverage": "50", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.01", + "cum": "50.0" } }, { "tier": 3.0, "symbol": "XRP/USDC:USDC", "currency": "USDC", - "minNotional": 10000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 20.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 40.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "10000", - "maintMarginRatio": "0.01", - "cum": "45.0" + "initialLeverage": "40", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.015", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "XRP/USDC:USDC", "currency": "USDC", - "minNotional": 50000.0, + "minNotional": 100000.0, "maxNotional": 750000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 15.0, + "maxLeverage": 25.0, "info": { "bracket": "4", - "initialLeverage": "15", + "initialLeverage": "25", "notionalCap": "750000", - "notionalFloor": "50000", + "notionalFloor": "100000", "maintMarginRatio": "0.02", - "cum": "545.0" + "cum": "800.0" } }, { @@ -58893,14 +68601,14 @@ "minNotional": 750000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 10.0, + "maxLeverage": 20.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "20", "notionalCap": "1000000", "notionalFloor": "750000", "maintMarginRatio": "0.025", - "cum": "4295.0" + "cum": "4550.0" } }, { @@ -58908,23 +68616,23 @@ "symbol": "XRP/USDC:USDC", "currency": "USDC", "minNotional": 1000000.0, - "maxNotional": 3000000.0, + "maxNotional": 5000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 8.0, + "maxLeverage": 10.0, "info": { "bracket": "6", - "initialLeverage": "8", - "notionalCap": "3000000", + "initialLeverage": "10", + "notionalCap": "5000000", "notionalFloor": "1000000", "maintMarginRatio": "0.05", - "cum": "29295.0" + "cum": "29550.0" } }, { "tier": 7.0, "symbol": "XRP/USDC:USDC", "currency": "USDC", - "minNotional": 3000000.0, + "minNotional": 5000000.0, "maxNotional": 10000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, @@ -58932,9 +68640,9 @@ "bracket": "7", "initialLeverage": "5", "notionalCap": "10000000", - "notionalFloor": "3000000", + "notionalFloor": "5000000", "maintMarginRatio": "0.1", - "cum": "179295.0" + "cum": "279550.0" } }, { @@ -58942,50 +68650,50 @@ "symbol": "XRP/USDC:USDC", "currency": "USDC", "minNotional": 10000000.0, - "maxNotional": 12000000.0, + "maxNotional": 12500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "8", "initialLeverage": "4", - "notionalCap": "12000000", + "notionalCap": "12500000", "notionalFloor": "10000000", "maintMarginRatio": "0.125", - "cum": "429295.0" + "cum": "529550.0" } }, { "tier": 9.0, "symbol": "XRP/USDC:USDC", "currency": "USDC", - "minNotional": 12000000.0, - "maxNotional": 15000000.0, + "minNotional": 12500000.0, + "maxNotional": 25000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "9", "initialLeverage": "2", - "notionalCap": "15000000", - "notionalFloor": "12000000", + "notionalCap": "25000000", + "notionalFloor": "12500000", "maintMarginRatio": "0.25", - "cum": "1929295.0" + "cum": "2092050.0" } }, { "tier": 10.0, "symbol": "XRP/USDC:USDC", "currency": "USDC", - "minNotional": 15000000.0, - "maxNotional": 20000000.0, + "minNotional": 25000000.0, + "maxNotional": 50000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "10", "initialLeverage": "1", - "notionalCap": "20000000", - "notionalFloor": "15000000", + "notionalCap": "50000000", + "notionalFloor": "25000000", "maintMarginRatio": "0.5", - "cum": "5679295.0" + "cum": "8342050.0" } } ], @@ -59235,13 +68943,13 @@ "symbol": "XTZ/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 2000000.0, + "maxNotional": 1500000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "5", "initialLeverage": "5", - "notionalCap": "2000000", + "notionalCap": "1500000", "notionalFloor": "1000000", "maintMarginRatio": "0.1", "cum": "55850.0" @@ -59251,51 +68959,51 @@ "tier": 6.0, "symbol": "XTZ/USDT:USDT", "currency": "USDT", - "minNotional": 2000000.0, - "maxNotional": 5000000.0, + "minNotional": 1500000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "6", "initialLeverage": "4", - "notionalCap": "5000000", - "notionalFloor": "2000000", + "notionalCap": "2000000", + "notionalFloor": "1500000", "maintMarginRatio": "0.125", - "cum": "105850.0" + "cum": "93350.0" } }, { "tier": 7.0, "symbol": "XTZ/USDT:USDT", "currency": "USDT", - "minNotional": 5000000.0, - "maxNotional": 10000000.0, + "minNotional": 2000000.0, + "maxNotional": 2500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "10000000", - "notionalFloor": "5000000", + "notionalCap": "2500000", + "notionalFloor": "2000000", "maintMarginRatio": "0.25", - "cum": "730850.0" + "cum": "343350.0" } }, { "tier": 8.0, "symbol": "XTZ/USDT:USDT", "currency": "USDT", - "minNotional": 10000000.0, - "maxNotional": 15000000.0, + "minNotional": 2500000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "10000000", + "notionalCap": "3000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "3230850.0" + "cum": "968350.0" } } ], @@ -59411,10 +69119,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -59428,10 +69136,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -59445,10 +69153,10 @@ "minNotional": 10000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 7.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "7", "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", @@ -59462,10 +69170,10 @@ "minNotional": 50000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "100000", "notionalFloor": "50000", "maintMarginRatio": "0.025", @@ -59479,10 +69187,10 @@ "minNotional": 100000.0, "maxNotional": 500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "500000", "notionalFloor": "100000", "maintMarginRatio": "0.05", @@ -59496,10 +69204,10 @@ "minNotional": 500000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.1", @@ -59513,10 +69221,10 @@ "minNotional": 1000000.0, "maxNotional": 1250000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "1250000", "notionalFloor": "1000000", "maintMarginRatio": "0.125", @@ -59807,14 +69515,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 50000.0, - "maintenanceMarginRate": 0.015, + "maintenanceMarginRate": 0.02, "maxLeverage": 10.0, "info": { "bracket": "1", "initialLeverage": "10", "notionalCap": "50000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.02", "cum": "0.0" } }, @@ -59832,7 +69540,7 @@ "notionalCap": "150000", "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "500.0" + "cum": "250.0" } }, { @@ -59849,7 +69557,7 @@ "notionalCap": "250000", "notionalFloor": "150000", "maintMarginRatio": "0.05", - "cum": "4250.0" + "cum": "4000.0" } }, { @@ -59866,7 +69574,7 @@ "notionalCap": "500000", "notionalFloor": "250000", "maintMarginRatio": "0.1", - "cum": "16750.0" + "cum": "16500.0" } }, { @@ -59883,7 +69591,7 @@ "notionalCap": "1000000", "notionalFloor": "500000", "maintMarginRatio": "0.125", - "cum": "29250.0" + "cum": "29000.0" } }, { @@ -59891,33 +69599,50 @@ "symbol": "ZEC/USDT:USDT", "currency": "USDT", "minNotional": 1000000.0, - "maxNotional": 2000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "6", - "initialLeverage": "2", - "notionalCap": "2000000", + "initialLeverage": "3", + "notionalCap": "1500000", "notionalFloor": "1000000", - "maintMarginRatio": "0.25", - "cum": "154250.0" + "maintMarginRatio": "0.1667", + "cum": "70700.0" } }, { "tier": 7.0, "symbol": "ZEC/USDT:USDT", "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "2000000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.25", + "cum": "195650.0" + } + }, + { + "tier": 8.0, + "symbol": "ZEC/USDT:USDT", + "currency": "USDT", "minNotional": 2000000.0, "maxNotional": 2500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "1", "notionalCap": "2500000", "notionalFloor": "2000000", "maintMarginRatio": "0.5", - "cum": "654250.0" + "cum": "695650.0" } } ], @@ -59927,13 +69652,13 @@ "symbol": "ZEN/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 10000.0, + "maxNotional": 7000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", - "notionalCap": "10000", + "initialLeverage": "20", + "notionalCap": "7000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -59943,136 +69668,153 @@ "tier": 2.0, "symbol": "ZEN/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 30000.0, + "minNotional": 7000.0, + "maxNotional": 18000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", - "notionalCap": "30000", - "notionalFloor": "10000", + "initialLeverage": "10", + "notionalCap": "18000", + "notionalFloor": "7000", "maintMarginRatio": "0.015", - "cum": "50.0" + "cum": "35.0" } }, { "tier": 3.0, "symbol": "ZEN/USDT:USDT", "currency": "USDT", - "minNotional": 30000.0, - "maxNotional": 150000.0, + "minNotional": 18000.0, + "maxNotional": 75000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "150000", - "notionalFloor": "30000", + "initialLeverage": "8", + "notionalCap": "75000", + "notionalFloor": "18000", "maintMarginRatio": "0.02", - "cum": "200.0" + "cum": "125.0" } }, { "tier": 4.0, "symbol": "ZEN/USDT:USDT", "currency": "USDT", - "minNotional": 150000.0, - "maxNotional": 300000.0, + "minNotional": 75000.0, + "maxNotional": 150000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "300000", - "notionalFloor": "150000", + "initialLeverage": "7", + "notionalCap": "150000", + "notionalFloor": "75000", "maintMarginRatio": "0.025", - "cum": "950.0" + "cum": "500.0" } }, { "tier": 5.0, "symbol": "ZEN/USDT:USDT", "currency": "USDT", - "minNotional": 300000.0, - "maxNotional": 1500000.0, + "minNotional": 150000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "1500000", - "notionalFloor": "300000", + "initialLeverage": "6", + "notionalCap": "750000", + "notionalFloor": "150000", "maintMarginRatio": "0.05", - "cum": "8450.0" + "cum": "4250.0" } }, { "tier": 6.0, "symbol": "ZEN/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 3000000.0, + "minNotional": 750000.0, + "maxNotional": 1100000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "1500000", + "notionalCap": "1100000", + "notionalFloor": "750000", "maintMarginRatio": "0.1", - "cum": "83450.0" + "cum": "41750.0" } }, { "tier": 7.0, "symbol": "ZEN/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 3750000.0, + "minNotional": 1100000.0, + "maxNotional": 1600000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "3750000", - "notionalFloor": "3000000", + "notionalCap": "1600000", + "notionalFloor": "1100000", "maintMarginRatio": "0.125", - "cum": "158450.0" + "cum": "69250.0" } }, { "tier": 8.0, "symbol": "ZEN/USDT:USDT", "currency": "USDT", - "minNotional": 3750000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 1600000.0, + "maxNotional": 2900000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "3750000", - "maintMarginRatio": "0.25", - "cum": "627200.0" + "initialLeverage": "3", + "notionalCap": "2900000", + "notionalFloor": "1600000", + "maintMarginRatio": "0.1667", + "cum": "135970.0" } }, { "tier": 9.0, "symbol": "ZEN/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 15000000.0, + "minNotional": 2900000.0, + "maxNotional": 4200000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "4200000", + "notionalFloor": "2900000", + "maintMarginRatio": "0.25", + "cum": "377540.0" + } + }, + { + "tier": 10.0, + "symbol": "ZEN/USDT:USDT", + "currency": "USDT", + "minNotional": 4200000.0, + "maxNotional": 6200000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "15000000", - "notionalFloor": "7500000", + "notionalCap": "6200000", + "notionalFloor": "4200000", "maintMarginRatio": "0.5", - "cum": "2502200.0" + "cum": "1427540.0" } } ], @@ -60239,10 +69981,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -60256,10 +69998,10 @@ "minNotional": 5000.0, "maxNotional": 16000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "16000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -60273,10 +70015,10 @@ "minNotional": 16000.0, "maxNotional": 80000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "10", "notionalCap": "80000", "notionalFloor": "16000", "maintMarginRatio": "0.02", @@ -60290,10 +70032,10 @@ "minNotional": 80000.0, "maxNotional": 160000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 6.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "6", "notionalCap": "160000", "notionalFloor": "80000", "maintMarginRatio": "0.025", @@ -60307,10 +70049,10 @@ "minNotional": 160000.0, "maxNotional": 800000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "800000", "notionalFloor": "160000", "maintMarginRatio": "0.05", @@ -60324,10 +70066,10 @@ "minNotional": 800000.0, "maxNotional": 1600000.0, "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "1600000", "notionalFloor": "800000", "maintMarginRatio": "0.1", @@ -60341,10 +70083,10 @@ "minNotional": 1600000.0, "maxNotional": 2000000.0, "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "4", + "initialLeverage": "3", "notionalCap": "2000000", "notionalFloor": "1600000", "maintMarginRatio": "0.125", @@ -60373,13 +70115,13 @@ "symbol": "ZETA/USDT:USDT", "currency": "USDT", "minNotional": 4000000.0, - "maxNotional": 8000000.0, + "maxNotional": 4500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "8000000", + "notionalCap": "4500000", "notionalFloor": "4000000", "maintMarginRatio": "0.5", "cum": "1334505.0" @@ -60515,10 +70257,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -60532,10 +70274,10 @@ "minNotional": 10000.0, "maxNotional": 20000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -60549,10 +70291,10 @@ "minNotional": 20000.0, "maxNotional": 100000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "8", "notionalCap": "100000", "notionalFloor": "20000", "maintMarginRatio": "0.02", @@ -60566,10 +70308,10 @@ "minNotional": 100000.0, "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "7", "notionalCap": "200000", "notionalFloor": "100000", "maintMarginRatio": "0.025", @@ -60583,10 +70325,10 @@ "minNotional": 200000.0, "maxNotional": 1000000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "1000000", "notionalFloor": "200000", "maintMarginRatio": "0.05", @@ -60632,33 +70374,50 @@ "symbol": "ZK/USDT:USDT", "currency": "USDT", "minNotional": 2500000.0, - "maxNotional": 5000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maxNotional": 3750000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "5000000", + "initialLeverage": "3", + "notionalCap": "3750000", "notionalFloor": "2500000", - "maintMarginRatio": "0.25", - "cum": "418150.0" + "maintMarginRatio": "0.1667", + "cum": "209900.0" } }, { "tier": 9.0, "symbol": "ZK/USDT:USDT", "currency": "USDT", + "minNotional": 3750000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "3750000", + "maintMarginRatio": "0.25", + "cum": "522275.0" + } + }, + { + "tier": 10.0, + "symbol": "ZK/USDT:USDT", + "currency": "USDT", "minNotional": 5000000.0, "maxNotional": 10000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", "notionalCap": "10000000", "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "1668150.0" + "cum": "1772275.0" } } ], @@ -60670,10 +70429,10 @@ "minNotional": 0.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -60687,10 +70446,10 @@ "minNotional": 10000.0, "maxNotional": 30000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 10.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "10", "notionalCap": "30000", "notionalFloor": "10000", "maintMarginRatio": "0.015", @@ -60704,10 +70463,10 @@ "minNotional": 30000.0, "maxNotional": 150000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 8.0, "info": { "bracket": "3", - "initialLeverage": "25", + "initialLeverage": "8", "notionalCap": "150000", "notionalFloor": "30000", "maintMarginRatio": "0.02", @@ -60721,10 +70480,10 @@ "minNotional": 150000.0, "maxNotional": 300000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "7", "notionalCap": "300000", "notionalFloor": "150000", "maintMarginRatio": "0.025", @@ -60738,10 +70497,10 @@ "minNotional": 300000.0, "maxNotional": 1500000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", + "initialLeverage": "6", "notionalCap": "1500000", "notionalFloor": "300000", "maintMarginRatio": "0.05", @@ -60787,33 +70546,50 @@ "symbol": "ZRO/USDT:USDT", "currency": "USDT", "minNotional": 3750000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maxNotional": 5625000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "7500000", + "initialLeverage": "3", + "notionalCap": "5625000", "notionalFloor": "3750000", - "maintMarginRatio": "0.25", - "cum": "627200.0" + "maintMarginRatio": "0.1667", + "cum": "314825.0" } }, { "tier": 9.0, "symbol": "ZRO/USDT:USDT", "currency": "USDT", + "minNotional": 5625000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "5625000", + "maintMarginRatio": "0.25", + "cum": "783387.5" + } + }, + { + "tier": 10.0, + "symbol": "ZRO/USDT:USDT", + "currency": "USDT", "minNotional": 7500000.0, "maxNotional": 15000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", "notionalCap": "15000000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2502200.0" + "cum": "2658387.5" } } ], @@ -60825,10 +70601,10 @@ "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxLeverage": 20.0, "info": { "bracket": "1", - "initialLeverage": "75", + "initialLeverage": "20", "notionalCap": "5000", "notionalFloor": "0", "maintMarginRatio": "0.01", @@ -60842,10 +70618,10 @@ "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxLeverage": 15.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "15", "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.015", @@ -60857,13 +70633,13 @@ "symbol": "ZRX/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 50000.0, + "maxNotional": 35000.0, "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "50000", + "initialLeverage": "10", + "notionalCap": "35000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -60873,102 +70649,119 @@ "tier": 4.0, "symbol": "ZRX/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, + "minNotional": 35000.0, + "maxNotional": 70000.0, "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxLeverage": 7.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "100000", - "notionalFloor": "50000", + "initialLeverage": "7", + "notionalCap": "70000", + "notionalFloor": "35000", "maintMarginRatio": "0.025", - "cum": "325.0" + "cum": "250.0" } }, { "tier": 5.0, "symbol": "ZRX/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 500000.0, + "minNotional": 70000.0, + "maxNotional": 350000.0, "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxLeverage": 6.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "500000", - "notionalFloor": "100000", + "initialLeverage": "6", + "notionalCap": "350000", + "notionalFloor": "70000", "maintMarginRatio": "0.05", - "cum": "2825.0" + "cum": "2000.0" } }, { "tier": 6.0, "symbol": "ZRX/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 1000000.0, + "minNotional": 350000.0, + "maxNotional": 700000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "6", "initialLeverage": "5", - "notionalCap": "1000000", - "notionalFloor": "500000", + "notionalCap": "700000", + "notionalFloor": "350000", "maintMarginRatio": "0.1", - "cum": "27825.0" + "cum": "19500.0" } }, { "tier": 7.0, "symbol": "ZRX/USDT:USDT", "currency": "USDT", - "minNotional": 1000000.0, - "maxNotional": 1250000.0, + "minNotional": 700000.0, + "maxNotional": 1100000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "7", "initialLeverage": "4", - "notionalCap": "1250000", - "notionalFloor": "1000000", + "notionalCap": "1100000", + "notionalFloor": "700000", "maintMarginRatio": "0.125", - "cum": "52825.0" + "cum": "37000.0" } }, { "tier": 8.0, "symbol": "ZRX/USDT:USDT", "currency": "USDT", - "minNotional": 1250000.0, - "maxNotional": 2500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "minNotional": 1100000.0, + "maxNotional": 2550000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "8", - "initialLeverage": "2", - "notionalCap": "2500000", - "notionalFloor": "1250000", - "maintMarginRatio": "0.25", - "cum": "209075.0" + "initialLeverage": "3", + "notionalCap": "2550000", + "notionalFloor": "1100000", + "maintMarginRatio": "0.1667", + "cum": "82870.0" } }, { "tier": 9.0, "symbol": "ZRX/USDT:USDT", "currency": "USDT", - "minNotional": 2500000.0, - "maxNotional": 5000000.0, + "minNotional": 2550000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "4000000", + "notionalFloor": "2550000", + "maintMarginRatio": "0.25", + "cum": "295285.0" + } + }, + { + "tier": 10.0, + "symbol": "ZRX/USDT:USDT", + "currency": "USDT", + "minNotional": 4000000.0, + "maxNotional": 6800000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "5000000", - "notionalFloor": "2500000", + "notionalCap": "6800000", + "notionalFloor": "4000000", "maintMarginRatio": "0.5", - "cum": "834075.0" + "cum": "1295285.0" } } ] diff --git a/freqtrade/exchange/binance_public_data.py b/freqtrade/exchange/binance_public_data.py index 42eda09bf..f61eb2a53 100644 --- a/freqtrade/exchange/binance_public_data.py +++ b/freqtrade/exchange/binance_public_data.py @@ -1,5 +1,6 @@ """ Fetch daily-archived OHLCV data from https://data.binance.vision/ +Documentation can be found in https://github.com/binance/binance-public-data """ import asyncio @@ -10,9 +11,11 @@ from io import BytesIO from typing import Any import aiohttp +import numpy as np import pandas as pd from pandas import DataFrame +from freqtrade.constants import DEFAULT_TRADES_COLUMNS from freqtrade.enums import CandleType from freqtrade.misc import chunks from freqtrade.util.datetime_helpers import dt_from_ts, dt_now @@ -157,8 +160,8 @@ async def _download_archive_ohlcv( return concat_safe(dfs) else: dfs.append(None) - except BaseException as e: - logger.warning(f"An exception raised: : {e}") + except Exception 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) @@ -212,6 +215,20 @@ def binance_vision_ohlcv_zip_url( return url +def binance_vision_trades_zip_url(symbol: str, candle_type: CandleType, date: date) -> str: + """ + example urls: + https://data.binance.vision/data/spot/daily/aggTrades/BTCUSDT/BTCUSDT-aggTrades-2023-10-27.zip + https://data.binance.vision/data/futures/um/daily/aggTrades/BTCUSDT/BTCUSDT-aggTrades-2023-10-27.zip + """ + asset_type_url_segment = candle_type_to_url_segment(candle_type) + url = ( + f"https://data.binance.vision/data/{asset_type_url_segment}/daily/aggTrades/{symbol}" + f"/{symbol}-aggTrades-{date.strftime('%Y-%m-%d')}.zip" + ) + return url + + async def get_daily_ohlcv( symbol: str, timeframe: str, @@ -268,7 +285,11 @@ async def get_daily_ohlcv( names=["date", "open", "high", "low", "close", "volume"], header=header, ) - df["date"] = pd.to_datetime(df["date"], unit="ms", utc=True) + df["date"] = pd.to_datetime( + np.where(df["date"] > 1e13, df["date"] // 1000, df["date"]), + unit="ms", + utc=True, + ) return df elif resp.status == 404: logger.debug(f"Failed to download {url}") @@ -280,3 +301,203 @@ async def get_daily_ohlcv( if isinstance(e, Http404) or retry > retry_count: logger.debug(f"Failed to get data from {url}: {e}") raise + + +async def download_archive_trades( + candle_type: CandleType, + pair: str, + *, + since_ms: int, + until_ms: int | None, + markets: dict[str, Any], + stop_on_404: bool = True, +) -> tuple[str, list[list]]: + try: + symbol = markets[pair]["id"] + + last_available_date = dt_now() - timedelta(days=2) + + start = dt_from_ts(since_ms) + end = dt_from_ts(until_ms) if until_ms else dt_now() + end = min(end, last_available_date) + if start >= end: + return pair, [] + result_list = await _download_archive_trades( + symbol, pair, candle_type, start, end, stop_on_404 + ) + return pair, result_list + + except Exception as e: + logger.warning( + "An exception occurred during fast trades download from Binance, falling back to " + "the slower REST API, this can take a lot more time.", + exc_info=e, + ) + return pair, [] + + +def parse_trades_from_zip(csvf): + # https://github.com/binance/binance-public-data/issues/283 + first_byte = csvf.read(1)[0] + if chr(first_byte).isdigit(): + # spot + header = None + names = [ + "id", + "price", + "amount", + "first_trade_id", + "last_trade_id", + "timestamp", + "is_buyer_maker", + "is_best_match", + ] + else: + # futures + header = 0 + names = [ + "id", + "price", + "amount", + "first_trade_id", + "last_trade_id", + "timestamp", + "is_buyer_maker", + ] + csvf.seek(0) + + df = pd.read_csv( + csvf, + names=names, + header=header, + ) + df.loc[:, "cost"] = df["price"] * df["amount"] + # Side is reversed intentionally + # based on ccxt parseTrade logic. + df.loc[:, "side"] = np.where(df["is_buyer_maker"], "sell", "buy") + df.loc[:, "type"] = None + # Convert timestamp to ms + df.loc[:, "timestamp"] = np.where( + df["timestamp"] > 1e13, + df["timestamp"] // 1000, + df["timestamp"], + ) + return df.loc[:, DEFAULT_TRADES_COLUMNS].to_records(index=False).tolist() + + +async def get_daily_trades( + symbol: str, + candle_type: CandleType, + date: date, + session: aiohttp.ClientSession, + retry_count: int = 3, + retry_delay: float = 0.0, +) -> list[list]: + """ + Get daily OHLCV from https://data.binance.vision + See https://github.com/binance/binance-public-data + + :symbol: binance symbol name, e.g. BTCUSDT + :candle_type: SPOT or FUTURES + :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 list containing trades in DEFAULT_TRADES_COLUMNS format + """ + + url = binance_vision_trades_zip_url(symbol, candle_type, date) + + logger.debug(f"download trades 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: + return parse_trades_from_zip(csvf) + 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: + logger.info("download Daily_trades raised: %s", e) + retry += 1 + if isinstance(e, Http404) or retry > retry_count: + logger.debug(f"Failed to get data from {url}: {e}") + raise + + +async def _download_archive_trades( + symbol: str, + pair: str, + candle_type: CandleType, + start: date, + end: date, + stop_on_404: bool, +) -> list[list]: + # daily dataframes, `None` indicates missing data in that day (when `stop_on_404` is False) + results: list[list] = [] + # 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)), 30): + tasks = [ + asyncio.create_task(get_daily_trades(symbol, candle_type, date, session)) + for date in dates + ] + for task in tasks: + current_day += 1 + try: + result = 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 results + except Exception 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 results + else: + # Happy case + results.extend(result) + + return results diff --git a/freqtrade/exchange/bybit.py b/freqtrade/exchange/bybit.py index d75aafdc8..1f5c19b2a 100644 --- a/freqtrade/exchange/bybit.py +++ b/freqtrade/exchange/bybit.py @@ -166,15 +166,16 @@ class Bybit(Exchange): PERPETUAL: bybit: https://www.bybithelp.com/HelpCenterKnowledge/bybitHC_Article?language=en_US&id=000001067 + https://www.bybit.com/en/help-center/article/Liquidation-Price-Calculation-under-Isolated-Mode-Unified-Trading-Account#b Long: Liquidation Price = ( - Entry Price * (1 - Initial Margin Rate + Maintenance Margin Rate) - - Extra Margin Added/ Contract) + Entry Price - [(Initial Margin - Maintenance Margin)/Contract Quantity] + - (Extra Margin Added/Contract Quantity)) Short: Liquidation Price = ( - Entry Price * (1 + Initial Margin Rate - Maintenance Margin Rate) - + Extra Margin Added/ Contract) + Entry Price + [(Initial Margin - Maintenance Margin)/Contract Quantity] + + (Extra Margin Added/Contract Quantity)) Implementation Note: Extra margin is currently not used. @@ -184,8 +185,6 @@ class Bybit(Exchange): :param amount: Absolute value of position size incl. leverage (in base currency) :param stake_amount: Stake amount - Collateral in settle currency. :param leverage: Leverage used for this position. - :param trading_mode: SPOT, MARGIN, FUTURES, etc. - :param margin_mode: Either ISOLATED or CROSS :param wallet_balance: Amount of margin_mode in the wallet being used to trade Cross-Margin Mode: crossWalletBalance Isolated-Margin Mode: isolatedWalletBalance @@ -198,13 +197,16 @@ class Bybit(Exchange): if self.trading_mode == TradingMode.FUTURES and self.margin_mode == MarginMode.ISOLATED: if market["inverse"]: raise OperationalException("Freqtrade does not yet support inverse contracts") - initial_margin_rate = 1 / leverage + position_value = amount * open_rate + initial_margin = position_value / leverage + maintenance_margin = position_value * mm_ratio + margin_diff_per_contract = (initial_margin - maintenance_margin) / amount # See docstring - ignores extra margin! if is_short: - return open_rate * (1 + initial_margin_rate - mm_ratio) + return open_rate + margin_diff_per_contract else: - return open_rate * (1 - initial_margin_rate + mm_ratio) + return open_rate - margin_diff_per_contract else: raise OperationalException( diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index aaf5f2225..9072d5948 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -148,6 +148,7 @@ class Exchange: "trades_has_history": False, "l2_limit_range": None, "l2_limit_range_required": True, # Allow Empty L2 limit (kucoin) + "l2_limit_upper": None, # Upper limit for L2 limit "mark_ohlcv_price": "mark", "mark_ohlcv_timeframe": "8h", "funding_fee_timeframe": "8h", @@ -960,7 +961,7 @@ class Exchange: return 1 / pow(10, precision) def get_min_pair_stake_amount( - self, pair: str, price: float, stoploss: float, leverage: float | None = 1.0 + self, pair: str, price: float, stoploss: float, leverage: float = 1.0 ) -> float | None: return self._get_stake_amount_limit(pair, price, stoploss, "min", leverage) @@ -979,7 +980,7 @@ class Exchange: price: float, stoploss: float, limit: Literal["min", "max"], - leverage: float | None = 1.0, + leverage: float = 1.0, ) -> float | None: isMin = limit == "min" @@ -988,6 +989,8 @@ class Exchange: except KeyError: raise ValueError(f"Can't get market information for symbol {pair}") + stake_limits = [] + limits = market["limits"] if isMin: # reserve some percent defined in config (5% default) + stoploss margin_reserve: float = 1.0 + self._config.get( @@ -997,11 +1000,12 @@ class Exchange: # it should not be more than 50% stoploss_reserve = max(min(stoploss_reserve, 1.5), 1) else: + # is_max margin_reserve = 1.0 stoploss_reserve = 1.0 + if max_from_tiers := self._get_max_notional_from_tiers(pair, leverage=leverage): + stake_limits.append(max_from_tiers) - stake_limits = [] - limits = market["limits"] if limits["cost"][limit] is not None: stake_limits.append( self._contracts_to_amount(pair, limits["cost"][limit]) * stoploss_reserve @@ -1365,8 +1369,8 @@ class Exchange: ordertype = available_order_Types[user_order_type] else: # Otherwise pick only one available - ordertype = list(available_order_Types.values())[0] - user_order_type = list(available_order_Types.keys())[0] + ordertype = next(iter(available_order_Types.values())) + user_order_type = next(iter(available_order_Types.keys())) return ordertype, user_order_type def _get_stop_limit_rate(self, stop_price: float, order_types: dict, side: str) -> float: @@ -1955,14 +1959,18 @@ class Exchange: @staticmethod def get_next_limit_in_list( - limit: int, limit_range: list[int] | None, range_required: bool = True + limit: int, + limit_range: list[int] | None, + range_required: bool = True, + upper_limit: int | None = None, ): """ Get next greater value in the list. Used by fetch_l2_order_book if the api only supports a limited range + if both limit_range and upper_limit is provided, limit_range wins. """ if not limit_range: - return limit + return min(limit, upper_limit) if upper_limit else limit result = min([x for x in limit_range if limit <= x] + [max(limit_range)]) if not range_required and limit > result: @@ -1979,7 +1987,10 @@ class Exchange: {'asks': [price, volume], 'bids': [price, volume]} """ limit1 = self.get_next_limit_in_list( - limit, self._ft_has["l2_limit_range"], self._ft_has["l2_limit_range_required"] + limit, + self._ft_has["l2_limit_range"], + self._ft_has["l2_limit_range_required"], + self._ft_has["l2_limit_upper"], ) try: return self._api.fetch_l2_order_book(pair, limit1) @@ -2351,6 +2362,7 @@ class Exchange: since_ms=since_ms, until_ms=until_ms, candle_type=candle_type, + raise_=True, ) ) logger.debug(f"Downloaded data for {pair} from ccxt with length {len(data)}.") @@ -2391,7 +2403,7 @@ class Exchange: if isinstance(res, BaseException): logger.warning(f"Async code raised an exception: {repr(res)}") if raise_: - raise + raise res continue else: # Deconstruct tuple if it's not an exception @@ -2440,8 +2452,8 @@ class Exchange: return self._exchange_ws.get_ohlcv(pair, timeframe, candle_type, candle_ts) logger.info( - f"Failed to reuse watch {pair}, {timeframe}, {candle_ts < last_refresh_time}," - f" {candle_ts}, {last_refresh_time}, " + f"Couldn't reuse watch for {pair}, {timeframe}, falling back to REST api. " + f"{candle_ts < last_refresh_time}, {candle_ts}, {last_refresh_time}, " f"{format_ms_time(candle_ts)}, {format_ms_time(last_refresh_time)} " ) @@ -2789,7 +2801,7 @@ class Exchange: pair, timeframe, candle_type = pairwt since_ms = None new_ticks: list = [] - all_stored_ticks_df = DataFrame(columns=DEFAULT_TRADES_COLUMNS + ["date"]) + all_stored_ticks_df = DataFrame(columns=[*DEFAULT_TRADES_COLUMNS, "date"]) first_candle_ms = self.needed_candle_for_trades_ms(timeframe, candle_type) # refresh, if # a. not in _trades @@ -2834,7 +2846,7 @@ class Exchange: else: # Skip cache, it's too old all_stored_ticks_df = DataFrame( - columns=DEFAULT_TRADES_COLUMNS + ["date"] + columns=[*DEFAULT_TRADES_COLUMNS, "date"] ) # from_id overrules with exchange set to id paginate @@ -3352,42 +3364,22 @@ class Exchange: pair_tiers = self._leverage_tiers[pair] if stake_amount == 0: - return self._leverage_tiers[pair][0]["maxLeverage"] # Max lev for lowest amount + return pair_tiers[0]["maxLeverage"] # Max lev for lowest amount - for tier_index in range(len(pair_tiers)): - tier = pair_tiers[tier_index] - lev = tier["maxLeverage"] + # Find the appropriate tier based on stake_amount + prior_max_lev = None + for tier in pair_tiers: + min_stake = tier["minNotional"] / (prior_max_lev or tier["maxLeverage"]) + max_stake = tier["maxNotional"] / tier["maxLeverage"] + prior_max_lev = tier["maxLeverage"] + # Adjust notional by leverage to do a proper comparison + if min_stake <= stake_amount <= max_stake: + return tier["maxLeverage"] - if tier_index < len(pair_tiers) - 1: - next_tier = pair_tiers[tier_index + 1] - next_floor = next_tier["minNotional"] / next_tier["maxLeverage"] - if next_floor > stake_amount: # Next tier min too high for stake amount - return min((tier["maxNotional"] / stake_amount), lev) - # - # With the two leverage tiers below, - # - a stake amount of 150 would mean a max leverage of (10000 / 150) = 66.66 - # - stakes below 133.33 = max_lev of 75 - # - stakes between 133.33-200 = max_lev of 10000/stake = 50.01-74.99 - # - stakes from 200 + 1000 = max_lev of 50 - # - # { - # "min": 0, # stake = 0.0 - # "max": 10000, # max_stake@75 = 10000/75 = 133.33333333333334 - # "lev": 75, - # }, - # { - # "min": 10000, # stake = 200.0 - # "max": 50000, # max_stake@50 = 50000/50 = 1000.0 - # "lev": 50, - # } - # - - else: # if on the last tier - if stake_amount > tier["maxNotional"]: - # If stake is > than max tradeable amount - raise InvalidOrderException(f"Amount {stake_amount} too high for {pair}") - else: - return tier["maxLeverage"] + # else: # if on the last tier + if stake_amount > max_stake: + # If stake is > than max tradeable amount + raise InvalidOrderException(f"Amount {stake_amount} too high for {pair}") raise OperationalException( "Looped through all tiers without finding a max leverage. Should never be reached" @@ -3402,6 +3394,23 @@ class Exchange: else: return 1.0 + def _get_max_notional_from_tiers(self, pair: str, leverage: float) -> float | None: + """ + get max_notional from leverage_tiers + :param pair: The base/quote currency pair being traded + :param leverage: The leverage to be used + :return: The maximum notional value for the given leverage or None if not found + """ + if self.trading_mode != TradingMode.FUTURES: + return None + if pair not in self._leverage_tiers: + return None + pair_tiers = self._leverage_tiers[pair] + for tier in reversed(pair_tiers): + if leverage <= tier["maxLeverage"]: + return tier["maxNotional"] + return None + @retrier def _set_leverage( self, @@ -3687,12 +3696,12 @@ class Exchange: def dry_run_liquidation_price( self, pair: str, - open_rate: float, # Entry price of position + open_rate: float, is_short: bool, amount: float, stake_amount: float, leverage: float, - wallet_balance: float, # Or margin balance + wallet_balance: float, open_trades: list, ) -> float | None: """ @@ -3713,8 +3722,6 @@ class Exchange: :param amount: Absolute value of position size incl. leverage (in base currency) :param stake_amount: Stake amount - Collateral in settle currency. :param leverage: Leverage used for this position. - :param trading_mode: SPOT, MARGIN, FUTURES, etc. - :param margin_mode: Either ISOLATED or CROSS :param wallet_balance: Amount of margin_mode in the wallet being used to trade Cross-Margin Mode: crossWalletBalance Isolated-Margin Mode: isolatedWalletBalance diff --git a/freqtrade/exchange/exchange_types.py b/freqtrade/exchange/exchange_types.py index 9687057bd..fed6bff70 100644 --- a/freqtrade/exchange/exchange_types.py +++ b/freqtrade/exchange/exchange_types.py @@ -37,6 +37,7 @@ class FtHas(TypedDict, total=False): # Orderbook l2_limit_range: list[int] | None l2_limit_range_required: bool + l2_limit_upper: int | None # Futures ccxt_futures_name: str # usually swap mark_ohlcv_price: str @@ -44,6 +45,7 @@ class FtHas(TypedDict, total=False): funding_fee_timeframe: str funding_fee_candle_limit: int floor_leverage: bool + uses_leverage_tiers: bool needs_trading_fees: bool order_props_in_contracts: list[Literal["amount", "cost", "filled", "remaining"]] diff --git a/freqtrade/exchange/exchange_utils.py b/freqtrade/exchange/exchange_utils.py index d20ff13f9..ad92033fb 100644 --- a/freqtrade/exchange/exchange_utils.py +++ b/freqtrade/exchange/exchange_utils.py @@ -4,7 +4,7 @@ Exchange support utils import inspect from datetime import datetime, timedelta, timezone -from math import ceil, floor +from math import ceil, floor, isnan from typing import Any import ccxt @@ -305,7 +305,7 @@ def price_to_precision( :param rounding_mode: rounding mode to use. Defaults to ROUND :return: price rounded up to the precision the Exchange accepts """ - if price_precision is not None and precisionMode is not None: + if price_precision is not None and precisionMode is not None and not isnan(price): if rounding_mode not in (ROUND_UP, ROUND_DOWN): # Use CCXT code where possible. return float( diff --git a/freqtrade/exchange/exchange_ws.py b/freqtrade/exchange/exchange_ws.py index e1fc37ff3..cbc9772a3 100644 --- a/freqtrade/exchange/exchange_ws.py +++ b/freqtrade/exchange/exchange_ws.py @@ -84,6 +84,7 @@ class ExchangeWS: Remove history for a pair/timeframe combination from ccxt cache """ self._ccxt_object.ohlcvs.get(paircomb[0], {}).pop(paircomb[1], None) + self.klines_last_refresh.pop(paircomb, None) @retrier(retries=3) def ohlcvs(self, pair: str, timeframe: str) -> list[list]: @@ -138,6 +139,15 @@ class ExchangeWS: ) ) + async def _unwatch_ohlcv(self, pair: str, timeframe: str, candle_type: CandleType) -> None: + try: + await self._ccxt_object.un_watch_ohlcv_for_symbols([[pair, timeframe]]) + except ccxt.NotSupported as e: + logger.debug("un_watch_ohlcv_for_symbols not supported: %s", e) + pass + except Exception: + logger.exception("Exception in _unwatch_ohlcv") + def _continuous_stopped( self, task: asyncio.Task, pair: str, timeframe: str, candle_type: CandleType ): @@ -150,6 +160,10 @@ class ExchangeWS: result = str(result1) logger.info(f"{pair}, {timeframe}, {candle_type} - Task finished - {result}") + asyncio.run_coroutine_threadsafe( + self._unwatch_ohlcv(pair, timeframe, candle_type), loop=self._loop + ) + self._klines_scheduled.discard((pair, timeframe, candle_type)) self._pop_history((pair, timeframe, candle_type)) diff --git a/freqtrade/exchange/gate.py b/freqtrade/exchange/gate.py index 95e1a00ca..49f0ee74b 100644 --- a/freqtrade/exchange/gate.py +++ b/freqtrade/exchange/gate.py @@ -35,6 +35,7 @@ class Gate(Exchange): "stoploss_order_types": {"limit": "limit"}, "stop_price_param": "stopPrice", "stop_price_prop": "stopPrice", + "l2_limit_upper": 1000, "marketOrderRequiresPrice": True, "trades_has_history": False, # Endpoint would support this - but ccxt doesn't. } @@ -44,6 +45,7 @@ class Gate(Exchange): "marketOrderRequiresPrice": False, "funding_fee_candle_limit": 90, "stop_price_type_field": "price_type", + "l2_limit_upper": 300, "stop_price_type_value_mapping": { PriceType.LAST: 0, PriceType.MARK: 1, diff --git a/freqtrade/exchange/hyperliquid.py b/freqtrade/exchange/hyperliquid.py index a75a77892..b6ec23942 100644 --- a/freqtrade/exchange/hyperliquid.py +++ b/freqtrade/exchange/hyperliquid.py @@ -35,6 +35,7 @@ class Hyperliquid(Exchange): "stop_price_prop": "stopPrice", "funding_fee_timeframe": "1h", "funding_fee_candle_limit": 500, + "uses_leverage_tiers": False, } _supported_trading_mode_margin_pairs: list[tuple[TradingMode, MarginMode]] = [ diff --git a/freqtrade/exchange/kraken.py b/freqtrade/exchange/kraken.py index 03c97569a..d82725bbb 100644 --- a/freqtrade/exchange/kraken.py +++ b/freqtrade/exchange/kraken.py @@ -69,7 +69,7 @@ class Kraken(Exchange): consolidated: CcxtBalances = {} for currency, balance in balances.items(): base_currency = currency[:-2] if currency.endswith(".F") else currency - base_currency = self._api.commonCurrencies.get(base_currency, base_currency) + if base_currency in consolidated: consolidated[base_currency]["free"] += balance["free"] consolidated[base_currency]["used"] += balance["used"] diff --git a/freqtrade/freqai/RL/BaseEnvironment.py b/freqtrade/freqai/RL/BaseEnvironment.py index d9142046c..d33cf1393 100644 --- a/freqtrade/freqai/RL/BaseEnvironment.py +++ b/freqtrade/freqai/RL/BaseEnvironment.py @@ -46,19 +46,20 @@ class BaseEnvironment(gym.Env): def __init__( self, - df: DataFrame = DataFrame(), - prices: DataFrame = DataFrame(), - reward_kwargs: dict = {}, + *, + df: DataFrame, + prices: DataFrame, + reward_kwargs: dict, window_size=10, starting_point=True, id: str = "baseenv-1", # noqa: A002 seed: int = 1, - config: dict = {}, + config: dict, live: bool = False, fee: float = 0.0015, can_short: bool = False, pair: str = "", - df_raw: DataFrame = DataFrame(), + df_raw: DataFrame, ): """ Initializes the training/eval environment. diff --git a/freqtrade/freqai/RL/BaseReinforcementLearningModel.py b/freqtrade/freqai/RL/BaseReinforcementLearningModel.py index ffa1fe2e3..70fd2d3b2 100644 --- a/freqtrade/freqai/RL/BaseReinforcementLearningModel.py +++ b/freqtrade/freqai/RL/BaseReinforcementLearningModel.py @@ -488,7 +488,7 @@ def make_env( seed: int, train_df: DataFrame, price: DataFrame, - env_info: dict[str, Any] = {}, + env_info: dict[str, Any], ) -> Callable: """ Utility function for multiprocessed env. diff --git a/freqtrade/freqai/data_drawer.py b/freqtrade/freqai/data_drawer.py index 4ab13440a..cf3e828bf 100644 --- a/freqtrade/freqai/data_drawer.py +++ b/freqtrade/freqai/data_drawer.py @@ -33,6 +33,8 @@ LABEL_PIPELINE = "label_pipeline" TRAINDF = "trained_df" METADATA = "metadata" +METADATA_NUMBER_MODE = rapidjson.NM_NATIVE | rapidjson.NM_NAN + class pair_info(TypedDict): model_filename: str @@ -495,7 +497,7 @@ class FreqaiDataDrawer: dk.data["label_list"] = dk.label_list with (save_path / f"{dk.model_filename}_{METADATA}.json").open("w") as fp: - rapidjson.dump(dk.data, fp, default=self.np_encoder, number_mode=rapidjson.NM_NATIVE) + rapidjson.dump(dk.data, fp, default=self.np_encoder, number_mode=METADATA_NUMBER_MODE) return @@ -526,7 +528,7 @@ class FreqaiDataDrawer: dk.data["label_list"] = dk.label_list # store the metadata with (save_path / f"{dk.model_filename}_{METADATA}.json").open("w") as fp: - rapidjson.dump(dk.data, fp, default=self.np_encoder, number_mode=rapidjson.NM_NATIVE) + rapidjson.dump(dk.data, fp, default=self.np_encoder, number_mode=METADATA_NUMBER_MODE) # save the pipelines to pickle files with (save_path / f"{dk.model_filename}_{FEATURE_PIPELINE}.pkl").open("wb") as fp: @@ -563,11 +565,11 @@ class FreqaiDataDrawer: presaved backtesting (prediction file loading). """ with (dk.data_path / f"{dk.model_filename}_{METADATA}.json").open("r") as fp: - dk.data = rapidjson.load(fp, number_mode=rapidjson.NM_NATIVE) + dk.data = rapidjson.load(fp, number_mode=METADATA_NUMBER_MODE) dk.training_features_list = dk.data["training_features_list"] dk.label_list = dk.data["label_list"] - def load_data(self, coin: str, dk: FreqaiDataKitchen) -> Any: # noqa: C901 + def load_data(self, coin: str, dk: FreqaiDataKitchen) -> Any: """ loads all data required to make a prediction on a sub-train time range :returns: @@ -587,7 +589,7 @@ class FreqaiDataDrawer: dk.label_pipeline = self.meta_data_dictionary[coin][LABEL_PIPELINE] else: with (dk.data_path / f"{dk.model_filename}_{METADATA}.json").open("r") as fp: - dk.data = rapidjson.load(fp, number_mode=rapidjson.NM_NATIVE) + dk.data = rapidjson.load(fp, number_mode=METADATA_NUMBER_MODE) with (dk.data_path / f"{dk.model_filename}_{FEATURE_PIPELINE}.pkl").open("rb") as fp: dk.feature_pipeline = cloudpickle.load(fp) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index cac76ece5..c03dbb276 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -16,7 +16,7 @@ from pandas import DataFrame from sklearn.model_selection import train_test_split from freqtrade.configuration import TimeRange -from freqtrade.constants import DOCS_LINK, Config +from freqtrade.constants import DOCS_LINK, ORDERFLOW_ADDED_COLUMNS, Config from freqtrade.data.converter import reduce_dataframe_footprint from freqtrade.exceptions import OperationalException from freqtrade.exchange import timeframe_to_seconds @@ -214,7 +214,7 @@ class FreqaiDataKitchen: self, unfiltered_df: DataFrame, training_feature_list: list, - label_list: list = list(), + label_list: list | None = None, training_filter: bool = True, ) -> tuple[DataFrame, DataFrame]: """ @@ -244,7 +244,7 @@ class FreqaiDataKitchen: # we don't care about total row number (total no. datapoints) in training, we only care # about removing any row with NaNs # if labels has multiple columns (user wants to train multiple modelEs), we detect here - labels = unfiltered_df.filter(label_list, axis=1) + labels = unfiltered_df.filter(label_list or [], axis=1) drop_index_labels = pd.isnull(labels).any(axis=1) drop_index_labels = ( drop_index_labels.replace(True, 1).replace(False, 0).infer_objects(copy=False) @@ -654,8 +654,8 @@ class FreqaiDataKitchen: pair: str, tf: str, strategy: IStrategy, - corr_dataframes: dict = {}, - base_dataframes: dict = {}, + corr_dataframes: dict, + base_dataframes: dict, is_corr_pairs: bool = False, ) -> DataFrame: """ @@ -709,6 +709,11 @@ class FreqaiDataKitchen: skip_columns = [ (f"{s}_{suffix}") for s in ["date", "open", "high", "low", "close", "volume"] ] + + for s in ORDERFLOW_ADDED_COLUMNS: + if s in dataframe.columns and f"{s}_{suffix}" in dataframe.columns: + skip_columns.append(f"{s}_{suffix}") + dataframe = dataframe.drop(columns=skip_columns) return dataframe @@ -773,10 +778,10 @@ class FreqaiDataKitchen: def use_strategy_to_populate_indicators( # noqa: C901 self, strategy: IStrategy, - corr_dataframes: dict = {}, - base_dataframes: dict = {}, + corr_dataframes: dict[str, DataFrame] | None = None, + base_dataframes: dict[str, dict[str, DataFrame]] | None = None, pair: str = "", - prediction_dataframe: DataFrame = pd.DataFrame(), + prediction_dataframe: DataFrame | None = None, do_corr_pairs: bool = True, ) -> DataFrame: """ @@ -793,6 +798,10 @@ class FreqaiDataKitchen: :return: dataframe: DataFrame = dataframe containing populated indicators """ + if not corr_dataframes: + corr_dataframes = {} + if not base_dataframes: + base_dataframes = {} # check if the user is using the deprecated populate_any_indicators function new_version = inspect.getsource(strategy.populate_any_indicators) == ( @@ -822,7 +831,7 @@ class FreqaiDataKitchen: if tf not in corr_dataframes[p]: corr_dataframes[p][tf] = pd.DataFrame() - if not prediction_dataframe.empty: + if prediction_dataframe is not None and not prediction_dataframe.empty: dataframe = prediction_dataframe.copy() base_dataframes[self.config["timeframe"]] = dataframe.copy() else: diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index 939039094..7b9de5ce2 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -618,7 +618,7 @@ class IFreqaiModel(ABC): ) unfiltered_dataframe = dk.use_strategy_to_populate_indicators( - strategy, corr_dataframes, base_dataframes, pair + strategy, corr_dataframes=corr_dataframes, base_dataframes=base_dataframes, pair=pair ) trained_timestamp = new_trained_timerange.stopts diff --git a/freqtrade/freqai/prediction_models/XGBoostRegressorMultiTarget.py b/freqtrade/freqai/prediction_models/XGBoostRegressorMultiTarget.py index 0586882b9..5cee0148d 100644 --- a/freqtrade/freqai/prediction_models/XGBoostRegressorMultiTarget.py +++ b/freqtrade/freqai/prediction_models/XGBoostRegressorMultiTarget.py @@ -4,8 +4,8 @@ from typing import Any from xgboost import XGBRegressor from freqtrade.freqai.base_models.BaseRegressionModel import BaseRegressionModel -from freqtrade.freqai.base_models.FreqaiMultiOutputRegressor import FreqaiMultiOutputRegressor from freqtrade.freqai.data_kitchen import FreqaiDataKitchen +from freqtrade.freqai.tensorboard import TBCallback logger = logging.getLogger(__name__) @@ -19,6 +19,7 @@ class XGBoostRegressorMultiTarget(BaseRegressionModel): `predict()` methods to add their custom data handling tools or change various aspects of the training that cannot be configured via the top level config.json file. + This is an exact copy of XGBoostRegressor kept for compatibility reasons. """ def fit(self, data_dictionary: dict, dk: FreqaiDataKitchen, **kwargs) -> Any: @@ -29,45 +30,32 @@ class XGBoostRegressorMultiTarget(BaseRegressionModel): :param dk: The datakitchen object for the current coin/model """ - xgb = XGBRegressor(**self.model_training_parameters) - X = data_dictionary["train_features"] y = data_dictionary["train_labels"] + + if self.freqai_info.get("data_split_parameters", {}).get("test_size", 0.1) == 0: + eval_set = None + eval_weights = None + else: + eval_set = [(data_dictionary["test_features"], data_dictionary["test_labels"]), (X, y)] + eval_weights = [data_dictionary["test_weights"], data_dictionary["train_weights"]] + sample_weight = data_dictionary["train_weights"] - eval_weights = None - eval_sets = [None] * y.shape[1] + xgb_model = self.get_init_model(dk.pair) - if self.freqai_info.get("data_split_parameters", {}).get("test_size", 0.1) != 0: - eval_weights = [data_dictionary["test_weights"]] - for i in range(data_dictionary["test_labels"].shape[1]): - eval_sets[i] = [ # type: ignore - ( - data_dictionary["test_features"], - data_dictionary["test_labels"].iloc[:, i], - ) - ] + model = XGBRegressor(**self.model_training_parameters) - init_model = self.get_init_model(dk.pair) - if init_model: - init_models = init_model.estimators_ - else: - init_models = [None] * y.shape[1] - - fit_params = [] - for i in range(len(eval_sets)): - fit_params.append( - { - "eval_set": eval_sets[i], - "sample_weight_eval_set": eval_weights, - "xgb_model": init_models[i], - } - ) - - model = FreqaiMultiOutputRegressor(estimator=xgb) - thread_training = self.freqai_info.get("multitarget_parallel_training", False) - if thread_training: - model.n_jobs = y.shape[1] - model.fit(X=X, y=y, sample_weight=sample_weight, fit_params=fit_params) + model.set_params(callbacks=[TBCallback(dk.data_path)]) + model.fit( + X=X, + y=y, + sample_weight=sample_weight, + eval_set=eval_set, + sample_weight_eval_set=eval_weights, + xgb_model=xgb_model, + ) + # set the callbacks to empty so that we can serialize to disk later + model.set_params(callbacks=[]) return model diff --git a/freqtrade/freqai/torch/PyTorchModelTrainer.py b/freqtrade/freqai/torch/PyTorchModelTrainer.py index 8682cff69..92e9effdd 100644 --- a/freqtrade/freqai/torch/PyTorchModelTrainer.py +++ b/freqtrade/freqai/torch/PyTorchModelTrainer.py @@ -25,7 +25,7 @@ class PyTorchModelTrainer(PyTorchTrainerInterface): criterion: nn.Module, device: str, data_convertor: PyTorchDataConvertor, - model_meta_data: dict[str, Any] = {}, + model_meta_data: dict[str, Any] | None = None, window_size: int = 1, tb_logger: Any = None, **kwargs, @@ -45,6 +45,8 @@ class PyTorchModelTrainer(PyTorchTrainerInterface): :param n_epochs: The maximum number batches to use for evaluation. :param batch_size: The size of the batches to use during training. """ + if model_meta_data is None: + model_meta_data = {} self.model = model self.optimizer = optimizer self.criterion = criterion diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 7d70c6336..8ee65e2dd 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -64,7 +64,7 @@ from freqtrade.rpc.rpc_types import ( ) from freqtrade.strategy.interface import IStrategy from freqtrade.strategy.strategy_wrapper import strategy_safe_wrapper -from freqtrade.util import FtPrecise, MeasureTime, dt_from_ts +from freqtrade.util import FtPrecise, MeasureTime, PeriodicCache, dt_from_ts, dt_now from freqtrade.util.migrations.binance_mig import migrate_binance_futures_names from freqtrade.wallets import Wallets @@ -145,7 +145,11 @@ class FreqtradeBot(LoggingMixin): else None ) - self.active_pair_whitelist = self._refresh_active_whitelist() + logger.info("Starting initial pairlist refresh") + with MeasureTime( + lambda duration, _: logger.info(f"Initial Pairlist refresh took {duration:.2f}s"), 0 + ): + self.active_pair_whitelist = self._refresh_active_whitelist() # Set initial bot state from config initial_state = self.config.get("initial_state") @@ -154,6 +158,7 @@ class FreqtradeBot(LoggingMixin): # Protect exit-logic from forcesell and vice versa self._exit_lock = Lock() timeframe_secs = timeframe_to_seconds(self.strategy.timeframe) + self._exit_reason_cache = PeriodicCache(100, ttl=timeframe_secs) LoggingMixin.__init__(self, logger, timeframe_secs) self._schedule = Scheduler() @@ -288,6 +293,7 @@ class FreqtradeBot(LoggingMixin): trades = Trade.get_open_trades() # First process current opened trades (positions) self.exit_positions(trades) + Trade.commit() # Check if we need to adjust our current positions before attempting to enter new trades. if self.strategy.position_adjustment_enable: @@ -295,7 +301,7 @@ class FreqtradeBot(LoggingMixin): self.process_open_trade_positions() # Then looking for entry opportunities - if self.get_free_open_trades(): + if self.state == State.RUNNING and self.get_free_open_trades(): self.enter_positions() self._schedule.run_pending() Trade.commit() @@ -754,12 +760,14 @@ class FreqtradeBot(LoggingMixin): current_exit_profit = trade.calc_profit_ratio(current_exit_rate) min_entry_stake = self.exchange.get_min_pair_stake_amount( - trade.pair, current_entry_rate, 0.0 + trade.pair, current_entry_rate, 0.0, trade.leverage ) min_exit_stake = self.exchange.get_min_pair_stake_amount( - trade.pair, current_exit_rate, self.strategy.stoploss + trade.pair, current_exit_rate, self.strategy.stoploss, trade.leverage + ) + max_entry_stake = self.exchange.get_max_pair_stake_amount( + trade.pair, current_entry_rate, trade.leverage ) - max_entry_stake = self.exchange.get_max_pair_stake_amount(trade.pair, current_entry_rate) stake_available = self.wallets.get_available_stake_amount() logger.debug(f"Calling adjust_trade_position for pair {trade.pair}") stake_amount, order_tag = self.strategy._adjust_trade_position_internal( @@ -776,6 +784,10 @@ class FreqtradeBot(LoggingMixin): ) if stake_amount is not None and stake_amount > 0.0: + if self.state == State.PAUSED: + logger.debug("Position adjustment aborted because the bot is in PAUSED state") + return + # We should increase our position if self.strategy.max_entry_position_adjustment > -1: count_of_entries = trade.nr_of_successful_entries @@ -784,6 +796,7 @@ class FreqtradeBot(LoggingMixin): return else: logger.debug("Max adjustment entries is set to unlimited.") + self.execute_entry( trade.pair, stake_amount, @@ -898,14 +911,14 @@ class FreqtradeBot(LoggingMixin): msg = ( f"Position adjust: about to create a new order for {pair} with stake_amount: " - f"{stake_amount} for {trade}" + f"{stake_amount} and price: {enter_limit_requested} for {trade}" if mode == "pos_adjust" else ( f"Replacing {side} order: about create a new order for {pair} with stake_amount: " - f"{stake_amount} ..." + f"{stake_amount} and price: {enter_limit_requested} ..." if mode == "replace" else f"{name} signal found: about create a new trade for {pair} with stake_amount: " - f"{stake_amount} ..." + f"{stake_amount} and price: {enter_limit_requested} ..." ) ) logger.info(msg) @@ -1374,6 +1387,15 @@ class FreqtradeBot(LoggingMixin): for should_exit in exits: if should_exit.exit_flag: exit_tag1 = exit_tag if should_exit.exit_type == ExitType.EXIT_SIGNAL else None + if trade.has_open_orders: + if prev_eval := self._exit_reason_cache.get( + f"{trade.pair}_{trade.id}_{exit_tag1 or should_exit.exit_reason}", None + ): + logger.debug( + f"Exit reason already seen this candle, first seen at {prev_eval}" + ) + continue + logger.info( f"Exit for {trade.pair} detected. Reason: {should_exit.exit_type}" f"{f' Tag: {exit_tag1}' if exit_tag1 is not None else ''}" @@ -1593,27 +1615,29 @@ class FreqtradeBot(LoggingMixin): self.replace_order(order, open_order, trade) def handle_cancel_order( - self, order: CcxtOrder, order_obj: Order, trade: Trade, reason: str - ) -> None: + self, order: CcxtOrder, order_obj: Order, trade: Trade, reason: str, replacing: bool = False + ) -> bool: """ Check if current analyzed order timed out and cancel if necessary. :param order: Order dict grabbed with exchange.fetch_order() :param order_obj: Order object from the database. :param trade: Trade object. - :return: None + :return: True if the order was canceled, False otherwise. """ if order["side"] == trade.entry_side: - self.handle_cancel_enter(trade, order, order_obj, reason) + return self.handle_cancel_enter(trade, order, order_obj, reason, replacing) else: canceled = self.handle_cancel_exit(trade, order, order_obj, reason) - canceled_count = trade.get_canceled_exit_order_count() - max_timeouts = self.config.get("unfilledtimeout", {}).get("exit_timeout_count", 0) - if canceled and max_timeouts > 0 and canceled_count >= max_timeouts: - logger.warning( - f"Emergency exiting trade {trade}, as the exit order " - f"timed out {max_timeouts} times. force selling {order['amount']}." - ) - self.emergency_exit(trade, order["price"], order["amount"]) + if not replacing: + canceled_count = trade.get_canceled_exit_order_count() + max_timeouts = self.config.get("unfilledtimeout", {}).get("exit_timeout_count", 0) + if canceled and max_timeouts > 0 and canceled_count >= max_timeouts: + logger.warning( + f"Emergency exiting trade {trade}, as the exit order " + f"timed out {max_timeouts} times. force selling {order['amount']}." + ) + self.emergency_exit(trade, order["price"], order["amount"]) + return canceled def emergency_exit( self, trade: Trade, price: float, sub_trade_amt: float | None = None @@ -1649,9 +1673,9 @@ class FreqtradeBot(LoggingMixin): 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 - To maintain existing order adjust_entry_price() should return order_obj.price - To replace existing order adjust_entry_price() should return desired price for limit order + To simply cancel the existing order(no replacement) adjust_order_price() should return None + To maintain existing order adjust_order_price() should return order_obj.price + To replace existing order adjust_order_price() should return desired price for limit order :param order: Order dict grabbed with exchange.fetch_order() :param order_obj: Order object. :param trade: Trade object. @@ -1665,17 +1689,17 @@ class FreqtradeBot(LoggingMixin): self.strategy.timeframe, latest_candle_open_date ) # Check if new candle - if ( - order_obj - and order_obj.side == trade.entry_side - and latest_candle_close_date > order_obj.order_date_utc - ): + if order_obj and latest_candle_close_date > order_obj.order_date_utc: + is_entry = order_obj.side == trade.entry_side # New candle proposed_rate = self.exchange.get_rate( - trade.pair, side="entry", is_short=trade.is_short, refresh=True + trade.pair, + side="entry" if is_entry else "exit", + is_short=trade.is_short, + refresh=True, ) - adjusted_entry_price = strategy_safe_wrapper( - self.strategy.adjust_entry_price, default_retval=order_obj.safe_placement_price + adjusted_price = strategy_safe_wrapper( + self.strategy.adjust_order_price, default_retval=order_obj.safe_placement_price )( trade=trade, order=order_obj, @@ -1685,42 +1709,78 @@ class FreqtradeBot(LoggingMixin): current_order_rate=order_obj.safe_placement_price, entry_tag=trade.enter_tag, side=trade.trade_direction, + is_entry=is_entry, ) replacing = True cancel_reason = constants.CANCEL_REASON["REPLACE"] - if not adjusted_entry_price: + if not adjusted_price: replacing = False cancel_reason = constants.CANCEL_REASON["USER_CANCEL"] - if order_obj.safe_placement_price != adjusted_entry_price: - # cancel existing order if new price is supplied or None - res = self.handle_cancel_enter( - trade, order, order_obj, cancel_reason, replacing=replacing + + if order_obj.safe_placement_price != adjusted_price: + self.handle_replace_order( + order, + order_obj, + trade, + adjusted_price, + is_entry, + cancel_reason, + replacing=replacing, ) - if not res: - self.replace_order_failed( - trade, f"Could not fully cancel order for {trade}, therefore not replacing." + + def handle_replace_order( + self, + order: CcxtOrder | None, + order_obj: Order, + trade: Trade, + new_order_price: float | None, + is_entry: bool, + cancel_reason: str, + replacing: bool = False, + ) -> None: + """ + Cancel existing order if new price is supplied, and if the cancel is successful, + places a new order with the remaining capital. + """ + if not order: + order = self.exchange.fetch_order(order_obj.order_id, trade.pair) + res = self.handle_cancel_order(order, order_obj, trade, cancel_reason, replacing=replacing) + if not res: + self.replace_order_failed( + trade, f"Could not fully cancel order for {trade}, therefore not replacing." + ) + return + if new_order_price: + # place new order only if new price is supplied + try: + if is_entry: + succeeded = self.execute_entry( + pair=trade.pair, + stake_amount=( + order_obj.safe_remaining * order_obj.safe_price / trade.leverage + ), + price=new_order_price, + trade=trade, + is_short=trade.is_short, + mode="replace", ) - return - if adjusted_entry_price: - # place new order only if new price is supplied - try: - if not self.execute_entry( - pair=trade.pair, - stake_amount=( - order_obj.safe_remaining * order_obj.safe_price / trade.leverage - ), - price=adjusted_entry_price, - trade=trade, - is_short=trade.is_short, - mode="replace", - ): - self.replace_order_failed( - trade, f"Could not replace order for {trade}." - ) - except DependencyException as exception: - logger.warning(f"Unable to replace order for {trade.pair}: {exception}") - self.replace_order_failed(trade, f"Could not replace order for {trade}.") + else: + succeeded = self.execute_trade_exit( + trade, + new_order_price, + exit_check=ExitCheckTuple( + exit_type=ExitType.CUSTOM_EXIT, + exit_reason=order_obj.ft_order_tag or "order_replaced", + ), + ordertype="limit", + sub_trade_amt=order_obj.safe_remaining, + ) + if not succeeded: + self.replace_order_failed(trade, f"Could not replace order for {trade}.") + except DependencyException as exception: + logger.warning(f"Unable to replace order for {trade.pair}: {exception}") + self.replace_order_failed(trade, f"Could not replace order for {trade}.") def cancel_open_orders_of_trade( self, trade: Trade, sides: list[str], reason: str, replacing: bool = False @@ -1774,7 +1834,7 @@ class FreqtradeBot(LoggingMixin): if trade.has_open_orders: oo = trade.select_order(side, True) if oo is not None: - if (price == oo.price) and (side == oo.side) and (amount == oo.amount): + if price == oo.price and side == oo.side and amount == oo.amount: logger.info( f"A similar open order was found for {trade.pair}. " f"Keeping existing {trade.exit_side} order. {price=}, {amount=}" @@ -1870,7 +1930,10 @@ class FreqtradeBot(LoggingMixin): # to the trade object self.update_trade_state(trade, order_id, corder) - logger.info(f"Partial {trade.entry_side} order timeout for {trade}.") + logger.info( + f"Partial {trade.entry_side} order timeout for {trade}. Filled: {filled_amount}, " + f"total: {order_obj.ft_amount}" + ) order_obj.ft_cancel_reason += f", {constants.CANCEL_REASON['PARTIALLY_FILLED']}" self.wallets.update() @@ -2092,6 +2155,7 @@ class FreqtradeBot(LoggingMixin): self.handle_insufficient_funds(trade) return False + self._exit_reason_cache[f"{trade.pair}_{trade.id}_{exit_reason}"] = dt_now() order_obj = Order.parse_from_ccxt_object(order, trade.pair, trade.exit_side, amount, limit) order_obj.ft_order_tag = exit_reason trade.orders.append(order_obj) @@ -2555,4 +2619,15 @@ class FreqtradeBot(LoggingMixin): max_custom_price_allowed = proposed_price + (proposed_price * cust_p_max_dist_r) # Bracket between min_custom_price_allowed and max_custom_price_allowed - return max(min(valid_custom_price, max_custom_price_allowed), min_custom_price_allowed) + final_price = max( + min(valid_custom_price, max_custom_price_allowed), min_custom_price_allowed + ) + + # Log a warning if the custom price was adjusted by clamping. + if final_price != valid_custom_price: + logger.info( + f"Custom price adjusted from {valid_custom_price} to {final_price} based on " + "custom_price_max_distance_ratio of {cust_p_max_dist_r}." + ) + + return final_price diff --git a/freqtrade/ft_types/__init__.py b/freqtrade/ft_types/__init__.py index 5ef97ed32..6cd74f7b2 100644 --- a/freqtrade/ft_types/__init__.py +++ b/freqtrade/ft_types/__init__.py @@ -1,5 +1,7 @@ # flake8: noqa: F401 from freqtrade.ft_types.backtest_result_type import ( + BacktestContentType, + BacktestContentTypeIcomplete, BacktestHistoryEntryType, BacktestMetadataType, BacktestResultType, diff --git a/freqtrade/ft_types/backtest_result_type.py b/freqtrade/ft_types/backtest_result_type.py index 27cdb6126..b253231a1 100644 --- a/freqtrade/ft_types/backtest_result_type.py +++ b/freqtrade/ft_types/backtest_result_type.py @@ -1,7 +1,11 @@ -from typing import Any +from copy import deepcopy +from typing import Any, cast +from pandas import DataFrame from typing_extensions import TypedDict +from freqtrade.constants import Config + class BacktestMetadataType(TypedDict): run_id: str @@ -15,11 +19,16 @@ class BacktestResultType(TypedDict): def get_BacktestResultType_default() -> BacktestResultType: - return { - "metadata": {}, - "strategy": {}, - "strategy_comparison": [], - } + return cast( + BacktestResultType, + deepcopy( + { + "metadata": {}, + "strategy": {}, + "strategy_comparison": [], + } + ), + ) class BacktestHistoryEntryType(BacktestMetadataType): @@ -30,3 +39,23 @@ class BacktestHistoryEntryType(BacktestMetadataType): backtest_end_ts: int | None timeframe: str | None timeframe_detail: str | None + + +class BacktestContentTypeIcomplete(TypedDict, total=False): + results: DataFrame + config: Config + locks: Any + rejected_signals: int + timedout_entry_orders: int + timedout_exit_orders: int + canceled_trade_entries: int + canceled_entry_orders: int + replaced_entry_orders: int + final_balance: float + backtest_start_time: int + backtest_end_time: int + run_id: str + + +class BacktestContentType(BacktestContentTypeIcomplete, total=True): + pass diff --git a/freqtrade/loggers/__init__.py b/freqtrade/loggers/__init__.py index e6e2dd18f..e54097bc2 100644 --- a/freqtrade/loggers/__init__.py +++ b/freqtrade/loggers/__init__.py @@ -1,15 +1,16 @@ import logging +import logging.config +import os +from copy import deepcopy from logging import Formatter -from logging.handlers import RotatingFileHandler, SysLogHandler from pathlib import Path - -from rich.console import Console +from typing import Any from freqtrade.constants import Config from freqtrade.exceptions import OperationalException from freqtrade.loggers.buffering_handler import FTBufferingHandler from freqtrade.loggers.ft_rich_handler import FtRichHandler -from freqtrade.loggers.set_log_levels import set_loggers +from freqtrade.loggers.rich_console import get_rich_console # from freqtrade.loggers.std_err_stream_handler import FTStdErrStreamHandler @@ -22,7 +23,8 @@ LOGFORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" bufferHandler = FTBufferingHandler(1000) bufferHandler.setFormatter(Formatter(LOGFORMAT)) -error_console = Console(stderr=True, color_system=None) + +error_console = get_rich_console(stderr=True, color_system=None) def get_existing_handlers(handlertype): @@ -53,66 +55,140 @@ def setup_logging_pre() -> None: ) -def setup_logging(config: Config) -> None: - """ - Process -v/--verbose, --logfile options - """ - # Log level - verbosity = config["verbosity"] - logging.root.addHandler(bufferHandler) - if config.get("print_colorized", True): - logger.info("Enabling colorized output.") - error_console._color_system = error_console._detect_color_system() +FT_LOGGING_CONFIG = { + "version": 1, + # "incremental": True, + # "disable_existing_loggers": False, + "formatters": { + "basic": {"format": "%(message)s"}, + "standard": { + "format": LOGFORMAT, + }, + }, + "handlers": { + "console": { + "class": "freqtrade.loggers.ft_rich_handler.FtRichHandler", + "formatter": "basic", + }, + }, + "root": { + "handlers": [ + "console", + # "file", + ], + "level": "INFO", + }, +} - logfile = config.get("logfile") - if logfile: +def _set_log_levels( + log_config: dict[str, Any], verbosity: int = 0, api_verbosity: str = "info" +) -> None: + """ + Set the logging level for the different loggers + """ + if "loggers" not in log_config: + log_config["loggers"] = {} + + # Set default levels for third party libraries + third_party_loggers = { + "freqtrade": logging.INFO if verbosity <= 1 else logging.DEBUG, + "requests": logging.INFO if verbosity <= 1 else logging.DEBUG, + "urllib3": logging.INFO if verbosity <= 1 else logging.DEBUG, + "httpcore": logging.INFO if verbosity <= 1 else logging.DEBUG, + "ccxt.base.exchange": logging.INFO if verbosity <= 2 else logging.DEBUG, + "telegram": logging.INFO, + "httpx": logging.WARNING, + "werkzeug": logging.ERROR if api_verbosity == "error" else logging.INFO, + } + + # Add third party loggers to the configuration + for logger_name, level in third_party_loggers.items(): + if logger_name not in log_config["loggers"]: + log_config["loggers"][logger_name] = { + "level": logging.getLevelName(level), + "propagate": True, + } + + +def _add_root_handler(log_config: dict[str, Any], handler_name: str): + if handler_name not in log_config["root"]["handlers"]: + log_config["root"]["handlers"].append(handler_name) + + +def _add_formatter(log_config: dict[str, Any], format_name: str, format_: str): + if format_name not in log_config["formatters"]: + log_config["formatters"][format_name] = {"format": format_} + + +def _create_log_config(config: Config) -> dict[str, Any]: + # Get log_config from user config or use default + log_config = deepcopy(config.get("log_config", FT_LOGGING_CONFIG)) + + if logfile := config.get("logfile"): s = logfile.split(":") if s[0] == "syslog": - # Address can be either a string (socket filename) for Unix domain socket or - # a tuple (hostname, port) for UDP socket. - # Address can be omitted (i.e. simple 'syslog' used as the value of - # config['logfilename']), which defaults to '/dev/log', applicable for most - # of the systems. - address = (s[1], int(s[2])) if len(s) > 2 else s[1] if len(s) > 1 else "/dev/log" - handler_sl = get_existing_handlers(SysLogHandler) - if handler_sl: - logging.root.removeHandler(handler_sl) - handler_sl = SysLogHandler(address=address) - # No datetime field for logging into syslog, to allow syslog - # to perform reduction of repeating messages if this is set in the - # syslog config. The messages should be equal for this. - handler_sl.setFormatter(Formatter("%(name)s - %(levelname)s - %(message)s")) - logging.root.addHandler(handler_sl) + logger.warning( + "DEPRECATED: Configuring syslog logging via command line is deprecated." + "Please use the log_config option in the configuration file instead." + ) + # Add syslog handler to the config + log_config["handlers"]["syslog"] = { + "class": "logging.handlers.SysLogHandler", + "formatter": "syslog_format", + "address": (s[1], int(s[2])) if len(s) > 2 else s[1] if len(s) > 1 else "/dev/log", + } + + _add_formatter(log_config, "syslog_format", "%(name)s - %(levelname)s - %(message)s") + _add_root_handler(log_config, "syslog") + elif s[0] == "journald": # pragma: no cover + # Check if we have the module available + logger.warning( + "DEPRECATED: Configuring Journald logging via command line is deprecated." + "Please use the log_config option in the configuration file instead." + ) try: - from cysystemd.journal import JournaldLogHandler + from cysystemd.journal import JournaldLogHandler # noqa: F401 except ImportError: raise OperationalException( "You need the cysystemd python package be installed in " "order to use logging to journald." ) - handler_jd = get_existing_handlers(JournaldLogHandler) - if handler_jd: - logging.root.removeHandler(handler_jd) - handler_jd = JournaldLogHandler() - # No datetime field for logging into journald, to allow syslog - # to perform reduction of repeating messages if this is set in the - # syslog config. The messages should be equal for this. - handler_jd.setFormatter(Formatter("%(name)s - %(levelname)s - %(message)s")) - logging.root.addHandler(handler_jd) + + # Add journald handler to the config + log_config["handlers"]["journald"] = { + "class": "cysystemd.journal.JournaldLogHandler", + "formatter": "journald_format", + } + + _add_formatter(log_config, "journald_format", "%(name)s - %(levelname)s - %(message)s") + _add_root_handler(log_config, "journald") + else: - handler_rf = get_existing_handlers(RotatingFileHandler) - if handler_rf: - logging.root.removeHandler(handler_rf) + # Regular file logging + # Update existing file handler configuration + if "file" in log_config["handlers"]: + log_config["handlers"]["file"]["filename"] = logfile + else: + log_config["handlers"]["file"] = { + "class": "logging.handlers.RotatingFileHandler", + "formatter": "standard", + "filename": logfile, + "maxBytes": 1024 * 1024 * 10, # 10Mb + "backupCount": 10, + } + _add_root_handler(log_config, "file") + + # Dynamically update some handlers + for handler_config in log_config.get("handlers", {}).values(): + if handler_config.get("class") == "freqtrade.loggers.ft_rich_handler.FtRichHandler": + handler_config["console"] = error_console + elif handler_config.get("class") == "logging.handlers.RotatingFileHandler": + logfile_path = Path(handler_config["filename"]) try: - logfile_path = Path(logfile) + # Create parent for filehandler logfile_path.parent.mkdir(parents=True, exist_ok=True) - handler_rf = RotatingFileHandler( - logfile_path, - maxBytes=1024 * 1024 * 10, # 10Mb - backupCount=10, - ) except PermissionError: raise OperationalException( f'Failed to create or access log file "{logfile_path.absolute()}". ' @@ -122,10 +198,34 @@ def setup_logging(config: Config) -> None: "non-root user, delete and recreate the directories you need, and then try " "again." ) - handler_rf.setFormatter(Formatter(LOGFORMAT)) - logging.root.addHandler(handler_rf) + return log_config + +def setup_logging(config: Config) -> None: + """ + Process -v/--verbose, --logfile options + """ + verbosity = config["verbosity"] + if os.environ.get("PYTEST_VERSION") is None or config.get("ft_tests_force_logging"): + log_config = _create_log_config(config) + _set_log_levels( + log_config, verbosity, config.get("api_server", {}).get("verbosity", "info") + ) + + logging.config.dictConfig(log_config) + + # Add buffer handler to root logger + if bufferHandler not in logging.root.handlers: + logging.root.addHandler(bufferHandler) + + # Set color system for console output + if config.get("print_colorized", True): + logger.info("Enabling colorized output.") + error_console._color_system = error_console._detect_color_system() + + logging.info("Logfile configured") + + # Set verbosity levels logging.root.setLevel(logging.INFO if verbosity < 1 else logging.DEBUG) - set_loggers(verbosity, config.get("api_server", {}).get("verbosity", "info")) logger.info("Verbosity set to %s", verbosity) diff --git a/freqtrade/loggers/json_formatter.py b/freqtrade/loggers/json_formatter.py new file mode 100644 index 000000000..a74922a41 --- /dev/null +++ b/freqtrade/loggers/json_formatter.py @@ -0,0 +1,74 @@ +import json +import logging + + +class JsonFormatter(logging.Formatter): + """ + Formatter that outputs JSON strings after parsing the LogRecord. + + @param dict fmt_dict: Key: logging format attribute pairs. Defaults to {"message": "message"}. + @param str time_format: time.strftime() format string. Default: "%Y-%m-%dT%H:%M:%S" + @param str msec_format: Microsecond formatting. Appended at the end. Default: "%s.%03dZ" + """ + + def __init__( + self, + fmt_dict: dict | None = None, + time_format: str = "%Y-%m-%dT%H:%M:%S", + msec_format: str = "%s.%03dZ", + ): + self.fmt_dict = ( + fmt_dict + if fmt_dict is not None + else { + "timestamp": "asctime", + "level": "levelname", + "logger": "name", + "message": "message", + } + ) + self.default_time_format = time_format + self.default_msec_format = msec_format + self.datefmt = None + + def usesTime(self) -> bool: + """ + Look for the attribute in the format dict values instead of the fmt string. + """ + return "asctime" in self.fmt_dict.values() + + def formatMessage(self, record) -> str: + raise NotImplementedError() + + def formatMessageDict(self, record) -> dict: + """ + Return a dictionary of the relevant LogRecord attributes instead of a string. + KeyError is raised if an unknown attribute is provided in the fmt_dict. + """ + return {fmt_key: record.__dict__[fmt_val] for fmt_key, fmt_val in self.fmt_dict.items()} + + def format(self, record) -> str: + """ + Mostly the same as the parent's class method, the difference being that a dict is + manipulated and dumped as JSON instead of a string. + """ + record.message = record.getMessage() + + if self.usesTime(): + record.asctime = self.formatTime(record, self.datefmt) + + message_dict = self.formatMessageDict(record) + + if record.exc_info: + # Cache the traceback text to avoid converting it multiple times + # (it's constant anyway) + if not record.exc_text: + record.exc_text = self.formatException(record.exc_info) + + if record.exc_text: + message_dict["exc_info"] = record.exc_text + + if record.stack_info: + message_dict["stack_info"] = self.formatStack(record.stack_info) + + return json.dumps(message_dict, default=str) diff --git a/freqtrade/loggers/rich_console.py b/freqtrade/loggers/rich_console.py new file mode 100644 index 000000000..f3ecd5556 --- /dev/null +++ b/freqtrade/loggers/rich_console.py @@ -0,0 +1,26 @@ +import sys +from shutil import get_terminal_size + +from rich.console import Console + + +def console_width() -> int | None: + """ + Get the width of the console + """ + if any(module in ["pytest", "ipykernel"] for module in sys.modules): + return 200 + + width, _ = get_terminal_size((1, 24)) + # Fall back to 200 if terminal size is not available. + # This is determined by assuming an insane width of 1char, which is unlikely. + w = None if width > 1 else 200 + return w + + +def get_rich_console(**kwargs) -> Console: + """ + Get a rich console with default settings + """ + kwargs["width"] = kwargs.get("width", console_width()) + return Console(**kwargs) diff --git a/freqtrade/loggers/set_log_levels.py b/freqtrade/loggers/set_log_levels.py index 24f26ffd6..d794c5ebc 100644 --- a/freqtrade/loggers/set_log_levels.py +++ b/freqtrade/loggers/set_log_levels.py @@ -4,25 +4,6 @@ import logging logger = logging.getLogger(__name__) -def set_loggers(verbosity: int = 0, api_verbosity: str = "info") -> None: - """ - Set the logging level for third party libraries - :param verbosity: Verbosity level. amount of `-v` passed to the command line - :return: None - """ - for logger_name in ("requests", "urllib3", "httpcore"): - logging.getLogger(logger_name).setLevel(logging.INFO if verbosity <= 1 else logging.DEBUG) - logging.getLogger("ccxt.base.exchange").setLevel( - logging.INFO if verbosity <= 2 else logging.DEBUG - ) - logging.getLogger("telegram").setLevel(logging.INFO) - logging.getLogger("httpx").setLevel(logging.WARNING) - - logging.getLogger("werkzeug").setLevel( - logging.ERROR if api_verbosity == "error" else logging.INFO - ) - - __BIAS_TESTER_LOGGERS = [ "freqtrade.resolvers", "freqtrade.strategy.hyper", diff --git a/freqtrade/mixins/logging_mixin.py b/freqtrade/mixins/logging_mixin.py index 58399e738..91ad2c25e 100644 --- a/freqtrade/mixins/logging_mixin.py +++ b/freqtrade/mixins/logging_mixin.py @@ -20,12 +20,13 @@ class LoggingMixin: self.refresh_period = refresh_period self._log_cache: TTLCache = TTLCache(maxsize=1024, ttl=self.refresh_period) - def log_once(self, message: str, logmethod: Callable) -> None: + def log_once(self, message: str, logmethod: Callable, force_show: bool = False) -> None: """ Logs message - not more often than "refresh_period" to avoid log spamming Logs the log-message as debug as well to simplify debugging. :param message: String containing the message to be sent to the function. :param logmethod: Function that'll be called. Most likely `logger.info`. + :param force_show: If True, sends the message regardless of show_output value. :return: None. """ @@ -35,6 +36,7 @@ class LoggingMixin: # Log as debug first self.logger.debug(message) - # Call hidden function. - if self.show_output: + + # Call hidden function if show_output is True or force_show is True + if self.show_output or force_show: _log_once(message) diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index d3f1bc63b..f7eedbdf8 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -8,7 +8,6 @@ import logging from collections import defaultdict from copy import deepcopy from datetime import datetime, timedelta -from typing import Any from numpy import nan from pandas import DataFrame @@ -37,7 +36,12 @@ from freqtrade.exchange import ( timeframe_to_seconds, ) from freqtrade.exchange.exchange import Exchange -from freqtrade.ft_types import BacktestResultType, get_BacktestResultType_default +from freqtrade.ft_types import ( + BacktestContentType, + BacktestContentTypeIcomplete, + BacktestResultType, + get_BacktestResultType_default, +) from freqtrade.leverage.liquidation_price import update_liquidation_prices from freqtrade.mixins import LoggingMixin from freqtrade.optimize.backtest_caching import get_strategy_run_id @@ -119,7 +123,7 @@ class Backtesting: config["dry_run"] = True self.run_ids: dict[str, str] = {} self.strategylist: list[IStrategy] = [] - self.all_results: dict[str, dict] = {} + self.all_bt_content: dict[str, BacktestContentType] = {} self.analysis_results: dict[str, dict[str, DataFrame]] = { "signals": {}, "rejected": {}, @@ -360,8 +364,9 @@ class Backtesting: ) # Combine data to avoid combining the data per trade. unavailable_pairs = [] + uses_leverage_tiers = self.exchange.get_option("uses_leverage_tiers", True) for pair in self.pairlists.whitelist: - if pair not in self.exchange._leverage_tiers: + if uses_leverage_tiers and pair not in self.exchange._leverage_tiers: unavailable_pairs.append(pair) continue @@ -396,6 +401,8 @@ class Backtesting: self.canceled_trade_entries = 0 self.canceled_entry_orders = 0 self.replaced_entry_orders = 0 + self.canceled_exit_orders = 0 + self.replaced_exit_orders = 0 self.dataprovider.clear_cache() if enable_protections: self._load_protections(self.strategy) @@ -601,7 +608,7 @@ class Backtesting: # This should not be reached... return row[OPEN_IDX] - def _get_adjust_trade_entry_for_candle( + def _check_adjust_trade_for_candle( self, trade: LocalTrade, row: tuple, current_time: datetime ) -> LocalTrade: current_rate: float = row[OPEN_IDX] @@ -712,7 +719,7 @@ class Backtesting: exchange=self.exchange, wallets=self.wallets, stake_currency=self.config["stake_currency"], - dry_run=self.config["dry_run"], + dry_run=True, ) if not (order.ft_order_side == trade.exit_side and order.safe_amount == trade.amount): self._call_adjust_stop(current_date, trade, order.ft_price) @@ -869,7 +876,7 @@ class Backtesting: # Check if we need to adjust our current positions if self.strategy.position_adjustment_enable: - trade = self._get_adjust_trade_entry_for_candle(trade, row, current_time) + trade = self._check_adjust_trade_for_candle(trade, row, current_time) if trade.is_open: enter = row[SHORT_IDX] if trade.is_short else row[LONG_IDX] @@ -1234,8 +1241,8 @@ class Backtesting: for order in [o for o in trade.orders if o.ft_is_open]: if order.side == trade.entry_side: self.canceled_entry_orders += 1 - # elif order.side == trade.exit_side: - # self.canceled_exit_orders += 1 + elif order.side == trade.exit_side: + self.canceled_exit_orders += 1 # canceled orders are removed from the trade del trade.orders[trade.orders.index(order)] @@ -1299,9 +1306,10 @@ class Backtesting: Returns True if the trade should be deleted. """ # only check on new candles for open entry orders - if order.side == trade.entry_side and current_time > order.order_date_utc: + if current_time > order.order_date_utc: + is_entry = order.side == trade.entry_side requested_rate = strategy_safe_wrapper( - self.strategy.adjust_entry_price, default_retval=order.ft_price + self.strategy.adjust_order_price, default_retval=order.ft_price )( trade=trade, # type: ignore[arg-type] order=order, @@ -1311,6 +1319,7 @@ class Backtesting: current_order_rate=order.ft_price, entry_tag=trade.enter_tag, side=trade.trade_direction, + is_entry=is_entry, ) # default value is current order price # cancel existing order whenever a new rate is requested (or None) @@ -1319,22 +1328,35 @@ class Backtesting: return False else: del trade.orders[trade.orders.index(order)] - self.canceled_entry_orders += 1 + if is_entry: + self.canceled_entry_orders += 1 + else: + self.canceled_exit_orders += 1 # place new order if result was not None if requested_rate: - self._enter_trade( - pair=trade.pair, - row=row, - trade=trade, - requested_rate=requested_rate, - requested_stake=(order.safe_remaining * order.ft_price / trade.leverage), - direction="short" if trade.is_short else "long", - ) + if is_entry: + self._enter_trade( + pair=trade.pair, + row=row, + trade=trade, + requested_rate=requested_rate, + requested_stake=(order.safe_remaining * order.ft_price / trade.leverage), + direction="short" if trade.is_short else "long", + ) + self.replaced_entry_orders += 1 + else: + self._exit_trade( + trade=trade, + sell_row=row, + close_rate=requested_rate, + amount=order.safe_remaining, + exit_reason=order.ft_order_tag, + ) + self.replaced_exit_orders += 1 # Delete trade if no successful entries happened (if placing the new order failed) - if not trade.has_open_orders and trade.nr_of_successful_entries == 0: + if not trade.has_open_orders and is_entry and trade.nr_of_successful_entries == 0: return True - self.replaced_entry_orders += 1 else: # assumption: there can't be multiple open entry orders at any given time return trade.nr_of_successful_entries == 0 @@ -1535,7 +1557,9 @@ class Backtesting: row_index += 1 indexes[pair] = row_index is_last_row = current_time == end_date - self.dataprovider._set_dataframe_max_index(self.required_startup + row_index) + self.dataprovider._set_dataframe_max_index( + pair, self.required_startup + row_index + ) trade_dir = self.check_for_trade_entry(row) pair_tradedir_cache[pair] = trade_dir @@ -1591,7 +1615,9 @@ class Backtesting: yield current_time_det, pair, row, is_last_row, trade_dir self.progress.increment() - def backtest(self, processed: dict, start_date: datetime, end_date: datetime) -> dict[str, Any]: + def backtest( + self, processed: dict, start_date: datetime, end_date: datetime + ) -> BacktestContentTypeIcomplete: """ Implement backtesting functionality @@ -1691,7 +1717,7 @@ class Backtesting: "backtest_end_time": int(backtest_end_time.timestamp()), } ) - self.all_results[strategy_name] = results + self.all_bt_content[strategy_name] = results if ( self.config.get("export", "none") == "signals" @@ -1754,9 +1780,9 @@ class Backtesting: min_date, max_date = self.backtest_one_strategy(strat, data, timerange) # Update old results with new ones. - if len(self.all_results) > 0: + if len(self.all_bt_content) > 0: results = generate_backtest_stats( - data, self.all_results, min_date=min_date, max_date=max_date + data, self.all_bt_content, min_date=min_date, max_date=max_date ) if self.results: self.results["metadata"].update(results["metadata"]) @@ -1773,6 +1799,7 @@ class Backtesting: dt_appendix, market_change_data=combined_res, analysis_results=self.analysis_results, + strategy_files={s.get_strategy_name(): s.__file__ for s in self.strategylist}, ) # Results may be mixed up now. Sort them so they follow --strategy-list order. diff --git a/freqtrade/optimize/hyperopt/hyperopt_optimizer.py b/freqtrade/optimize/hyperopt/hyperopt_optimizer.py index 9e4995aca..d46859ee7 100644 --- a/freqtrade/optimize/hyperopt/hyperopt_optimizer.py +++ b/freqtrade/optimize/hyperopt/hyperopt_optimizer.py @@ -19,6 +19,7 @@ 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.ft_types import BacktestContentType from freqtrade.misc import deep_merge_dicts from freqtrade.optimize.backtesting import Backtesting @@ -324,7 +325,7 @@ class HyperOptimizer: def _get_results_dict( self, - backtesting_results: dict[str, Any], + backtesting_results: BacktestContentType, min_date: datetime, max_date: datetime, params_dict: dict[str, Any], diff --git a/freqtrade/optimize/hyperopt_loss/hyperopt_loss_max_drawdown_per_pair.py b/freqtrade/optimize/hyperopt_loss/hyperopt_loss_max_drawdown_per_pair.py new file mode 100644 index 000000000..19ce29455 --- /dev/null +++ b/freqtrade/optimize/hyperopt_loss/hyperopt_loss_max_drawdown_per_pair.py @@ -0,0 +1,59 @@ +""" +MaxDrawDownPerPairHyperOptLoss + +This module defines the alternative HyperOptLoss class which can be used for +Hyperoptimization. +""" + +from typing import Any + +from freqtrade.optimize.hyperopt import IHyperOptLoss + + +class MaxDrawDownPerPairHyperOptLoss(IHyperOptLoss): + """ + Defines the loss function for hyperopt. + + This implementation calculates the profit/drawdown ratio per pair and + returns the worst result as objective, forcing hyperopt to optimize + the parameters for all pairs in the pairlist. + + This way, we prevent one or more pairs with good results from inflating + the metrics, while the rest of the pairs with poor results are not + represented and therefore not optimized. + """ + + @staticmethod + def hyperopt_loss_function(backtest_stats: dict[str, Any], *args, **kwargs) -> float: + """ + Objective function, returns smaller number for better results. + """ + + ############################################## + # Configurable parameters + ############################################## + # Minimum acceptable profit/drawdown per pair + min_acceptable_profit_dd = 1.0 + # Penalty when acceptable minimum are not met + penalty = 20 + ############################################## + + score_per_pair = [] + for p in backtest_stats["results_per_pair"]: + if p["key"] != "TOTAL": + profit = p.get("profit_total_abs", 0) + drawdown = p.get("max_drawdown_abs", 0) + + if drawdown != 0 and profit != 0: + profit_dd = profit / drawdown + else: + profit_dd = profit + + if profit_dd < min_acceptable_profit_dd: + score = profit_dd - penalty + else: + score = profit_dd + + score_per_pair.append(score) + + return -min(score_per_pair) diff --git a/freqtrade/optimize/optimize_reports/bt_output.py b/freqtrade/optimize/optimize_reports/bt_output.py index 914498092..cc179410a 100644 --- a/freqtrade/optimize/optimize_reports/bt_output.py +++ b/freqtrade/optimize/optimize_reports/bt_output.py @@ -102,7 +102,9 @@ def text_table_tags( [ *( ( - (t["key"] if isinstance(t["key"], list) else [t["key"], ""]) + list(t["key"]) + if isinstance(t["key"], list | tuple) + else [t["key"], ""] if is_list else [t["key"]] ) @@ -132,18 +134,18 @@ def text_table_periodic_breakdown( """ headers = [ period.capitalize(), + "Trades", f"Tot Profit {stake_currency}", - "Wins", - "Draws", - "Losses", + "Profit Factor", + "Win Draw Loss Win%", ] output = [ [ d["date"], + d.get("trades", "N/A"), fmt_coin(d["profit_abs"], stake_currency, False), - d["wins"], - d["draws"], - d["loses"], + round(d["profit_factor"], 2) if "profit_factor" in d else "N/A", + generate_wins_draws_losses(d["wins"], d["draws"], d.get("losses", d.get("loses", 0))), ] for d in days_breakdown_stats ] @@ -312,6 +314,7 @@ def text_table_add_metrics(strat_results: dict) -> None: ("Sortino", f"{strat_results['sortino']:.2f}" if "sortino" in strat_results else "N/A"), ("Sharpe", f"{strat_results['sharpe']:.2f}" if "sharpe" in strat_results else "N/A"), ("Calmar", f"{strat_results['calmar']:.2f}" if "calmar" in strat_results else "N/A"), + ("SQN", f"{strat_results['sqn']:.2f}" if "sqn" in strat_results else "N/A"), ( "Profit factor", ( diff --git a/freqtrade/optimize/optimize_reports/bt_storage.py b/freqtrade/optimize/optimize_reports/bt_storage.py index d0c5d7fb7..1e6a67e81 100644 --- a/freqtrade/optimize/optimize_reports/bt_storage.py +++ b/freqtrade/optimize/optimize_reports/bt_storage.py @@ -6,6 +6,7 @@ from zipfile import ZIP_DEFLATED, ZipFile from pandas import DataFrame +from freqtrade.configuration import sanitize_config from freqtrade.constants import LAST_BT_RESULT_FN from freqtrade.enums.runmode import RunMode from freqtrade.ft_types import BacktestResultType @@ -52,6 +53,7 @@ def store_backtest_results( *, market_change_data: DataFrame | None = None, analysis_results: dict[str, dict[str, DataFrame]] | None = None, + strategy_files: dict[str, str] | None = None, ) -> Path: """ Stores backtest results and analysis data in a zip file, with metadata stored separately @@ -85,6 +87,32 @@ def store_backtest_results( dump_json_to_file(stats_buf, stats_copy) zipf.writestr(json_filename.name, stats_buf.getvalue()) + config_buf = StringIO() + dump_json_to_file(config_buf, sanitize_config(config["original_config"])) + zipf.writestr(f"{base_filename.stem}_config.json", config_buf.getvalue()) + + for strategy_name, strategy_file in (strategy_files or {}).items(): + # Store the strategy file and its parameters + strategy_buf = BytesIO() + strategy_path = Path(strategy_file) + if not strategy_path.is_file(): + logger.warning(f"Strategy file '{strategy_path}' does not exist. Skipping.") + continue + with strategy_path.open("rb") as strategy_file_obj: + strategy_buf.write(strategy_file_obj.read()) + strategy_buf.seek(0) + zipf.writestr(f"{base_filename.stem}_{strategy_name}.py", strategy_buf.getvalue()) + strategy_params = strategy_path.with_suffix(".json") + if strategy_params.is_file(): + strategy_params_buf = BytesIO() + with strategy_params.open("rb") as strategy_params_obj: + strategy_params_buf.write(strategy_params_obj.read()) + strategy_params_buf.seek(0) + zipf.writestr( + f"{base_filename.stem}_{strategy_name}.json", + strategy_params_buf.getvalue(), + ) + # Add market change data if present if market_change_data is not None: market_change_name = f"{base_filename.stem}_market_change.feather" diff --git a/freqtrade/optimize/optimize_reports/optimize_reports.py b/freqtrade/optimize/optimize_reports/optimize_reports.py index 32ef864e2..1478ee2be 100644 --- a/freqtrade/optimize/optimize_reports/optimize_reports.py +++ b/freqtrade/optimize/optimize_reports/optimize_reports.py @@ -16,8 +16,13 @@ from freqtrade.data.metrics import ( calculate_max_drawdown, calculate_sharpe, calculate_sortino, + calculate_sqn, +) +from freqtrade.ft_types import ( + BacktestContentType, + BacktestResultType, + get_BacktestResultType_default, ) -from freqtrade.ft_types import BacktestResultType from freqtrade.util import decimals_per_coin, fmt_coin, get_dry_run_wallet @@ -25,7 +30,7 @@ logger = logging.getLogger(__name__) def generate_trade_signal_candles( - preprocessed_df: dict[str, DataFrame], bt_results: dict[str, Any], date_col: str + preprocessed_df: dict[str, DataFrame], bt_results: BacktestContentType, date_col: str ) -> dict[str, DataFrame]: signal_candles_only = {} for pair in preprocessed_df.keys(): @@ -69,7 +74,11 @@ def generate_rejected_signals( def _generate_result_line( - result: DataFrame, starting_balance: float, first_column: str | list[str] + result: DataFrame, + min_date: datetime, + max_date: datetime, + starting_balance: float, + first_column: str | list[str], ) -> dict: """ Generate one result dict, with "first_column" as key. @@ -77,6 +86,20 @@ def _generate_result_line( profit_sum = result["profit_ratio"].sum() # (end-capital - starting capital) / starting capital profit_total = result["profit_abs"].sum() / starting_balance + backtest_days = (max_date - min_date).days or 1 + final_balance = starting_balance + result["profit_abs"].sum() + expectancy, expectancy_ratio = calculate_expectancy(result) + winning_profit = result.loc[result["profit_abs"] > 0, "profit_abs"].sum() + losing_profit = result.loc[result["profit_abs"] < 0, "profit_abs"].sum() + profit_factor = winning_profit / abs(losing_profit) if losing_profit else 0.0 + + try: + drawdown = calculate_max_drawdown( + result, value_col="profit_abs", starting_balance=starting_balance + ) + + except ValueError: + drawdown = None return { "key": first_column, @@ -105,6 +128,16 @@ def _generate_result_line( "draws": len(result[result["profit_abs"] == 0]), "losses": len(result[result["profit_abs"] < 0]), "winrate": len(result[result["profit_abs"] > 0]) / len(result) if len(result) else 0.0, + "cagr": calculate_cagr(backtest_days, starting_balance, final_balance), + "expectancy": expectancy, + "expectancy_ratio": expectancy_ratio, + "sortino": calculate_sortino(result, min_date, max_date, starting_balance), + "sharpe": calculate_sharpe(result, min_date, max_date, starting_balance), + "calmar": calculate_calmar(result, min_date, max_date, starting_balance), + "sqn": calculate_sqn(result, starting_balance), + "profit_factor": profit_factor, + "max_drawdown_account": drawdown.relative_account_drawdown if drawdown else 0.0, + "max_drawdown_abs": drawdown.drawdown_abs if drawdown else 0.0, } @@ -120,6 +153,8 @@ def generate_pair_metrics( # stake_currency: str, starting_balance: float, results: DataFrame, + min_date: datetime, + max_date: datetime, skip_nan: bool = False, ) -> list[dict]: """ @@ -139,13 +174,18 @@ def generate_pair_metrics( # if skip_nan and result["profit_abs"].isnull().all(): continue - tabular_data.append(_generate_result_line(result, starting_balance, pair)) + tabular_data.append( + _generate_result_line(result, min_date, max_date, starting_balance, pair) + ) # Sort by total profit %: tabular_data = sorted(tabular_data, key=lambda k: k["profit_total_abs"], reverse=True) # Append Total - tabular_data.append(_generate_result_line(results, starting_balance, "TOTAL")) + tabular_data.append( + _generate_result_line(results, min_date, max_date, starting_balance, "TOTAL") + ) + return tabular_data @@ -153,6 +193,8 @@ def generate_tag_metrics( tag_type: Literal["enter_tag", "exit_reason"] | list[Literal["enter_tag", "exit_reason"]], starting_balance: float, results: DataFrame, + min_date: datetime, + max_date: datetime, skip_nan: bool = False, ) -> list[dict]: """ @@ -172,13 +214,17 @@ def generate_tag_metrics( if skip_nan and group["profit_abs"].isnull().all(): continue - tabular_data.append(_generate_result_line(group, starting_balance, tags)) + tabular_data.append( + _generate_result_line(group, min_date, max_date, starting_balance, tags) + ) # Sort by total profit %: tabular_data = sorted(tabular_data, key=lambda k: k["profit_total_abs"], reverse=True) # Append Total - tabular_data.append(_generate_result_line(results, starting_balance, "TOTAL")) + tabular_data.append( + _generate_result_line(results, min_date, max_date, starting_balance, "TOTAL") + ) return tabular_data else: return [] @@ -211,6 +257,8 @@ def _get_resample_from_period(period: str) -> str: return "1W-MON" if period == "month": return "1ME" + if period == "year": + return "1YE" raise ValueError(f"Period {period} is not supported.") @@ -228,8 +276,11 @@ def generate_periodic_breakdown_stats( profit_abs = day["profit_abs"].sum().round(10) wins = sum(day["profit_abs"] > 0) draws = sum(day["profit_abs"] == 0) - loses = sum(day["profit_abs"] < 0) - trades = wins + draws + loses + losses = sum(day["profit_abs"] < 0) + trades = wins + draws + losses + winning_profit = day.loc[day["profit_abs"] > 0, "profit_abs"].sum() + losing_profit = day.loc[day["profit_abs"] < 0, "profit_abs"].sum() + profit_factor = winning_profit / abs(losing_profit) if losing_profit else 0.0 stats.append( { "date": name.strftime("%d/%m/%Y"), @@ -237,8 +288,9 @@ def generate_periodic_breakdown_stats( "profit_abs": profit_abs, "wins": wins, "draws": draws, - "loses": loses, - "winrate": wins / trades if trades else 0.0, + "losses": losses, + "trades": trades, + "profit_factor": round(profit_factor, 8), } ) return stats @@ -359,7 +411,7 @@ def generate_daily_stats(results: DataFrame) -> dict[str, Any]: def generate_strategy_stats( pairlist: list[str], strategy: str, - content: dict[str, Any], + content: BacktestContentType, min_date: datetime, max_date: datetime, market_change: float, @@ -388,19 +440,33 @@ def generate_strategy_stats( stake_currency=stake_currency, starting_balance=start_balance, results=results, + min_date=min_date, + max_date=max_date, skip_nan=False, ) enter_tag_stats = generate_tag_metrics( - "enter_tag", starting_balance=start_balance, results=results, skip_nan=False + "enter_tag", + starting_balance=start_balance, + results=results, + min_date=min_date, + max_date=max_date, + skip_nan=False, ) exit_reason_stats = generate_tag_metrics( - "exit_reason", starting_balance=start_balance, results=results, skip_nan=False + "exit_reason", + starting_balance=start_balance, + results=results, + min_date=min_date, + max_date=max_date, + skip_nan=False, ) mix_tag_stats = generate_tag_metrics( ["enter_tag", "exit_reason"], starting_balance=start_balance, results=results, + min_date=min_date, + max_date=max_date, skip_nan=False, ) left_open_results = generate_pair_metrics( @@ -408,6 +474,8 @@ def generate_strategy_stats( stake_currency=stake_currency, starting_balance=start_balance, results=results.loc[results["exit_reason"] == "force_exit"], + min_date=min_date, + max_date=max_date, skip_nan=True, ) @@ -468,6 +536,7 @@ def generate_strategy_stats( "sortino": calculate_sortino(results, min_date, max_date, start_balance), "sharpe": calculate_sharpe(results, min_date, max_date, start_balance), "calmar": calculate_calmar(results, min_date, max_date, start_balance), + "sqn": calculate_sqn(results, start_balance), "profit_factor": profit_factor, "backtest_start": min_date.strftime(DATETIME_PRINT_FORMAT), "backtest_start_ts": int(min_date.timestamp() * 1000), @@ -567,7 +636,7 @@ def generate_strategy_stats( def generate_backtest_stats( btdata: dict[str, DataFrame], - all_results: dict[str, dict[str, DataFrame | dict]], + all_results: dict[str, BacktestContentType], min_date: datetime, max_date: datetime, ) -> BacktestResultType: @@ -579,12 +648,8 @@ def generate_backtest_stats( :param max_date: Backtest end date :return: Dictionary containing results per strategy and a strategy summary. """ - result: BacktestResultType = { - "metadata": {}, - "strategy": {}, - "strategy_comparison": [], - } - market_change = calculate_market_change(btdata, "close") + result: BacktestResultType = get_BacktestResultType_default() + market_change = calculate_market_change(btdata, "close", min_date=min_date) metadata = {} pairlist = list(btdata.keys()) for strategy, content in all_results.items(): diff --git a/freqtrade/persistence/key_value_store.py b/freqtrade/persistence/key_value_store.py index e7b782ac4..814748da6 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 +from typing import ClassVar, Literal from sqlalchemy import String from sqlalchemy.orm import Mapped, mapped_column @@ -18,9 +18,11 @@ class ValueTypesEnum(str, Enum): INT = "int" -class KeyStoreKeys(str, Enum): - BOT_START_TIME = "bot_start_time" - STARTUP_TIME = "startup_time" +KeyStoreKeys = Literal[ + "bot_start_time", + "startup_time", + "binance_migration", +] class _KeyValueStoreModel(ModelBase): @@ -192,7 +194,7 @@ class KeyValueStore: return kv.int_value -def set_startup_time(): +def set_startup_time() -> None: """ sets bot_start_time to the first trade open date - or "now" on new databases. sets startup_time to "now" diff --git a/freqtrade/persistence/migrations.py b/freqtrade/persistence/migrations.py index 7a88c61c0..59d717d57 100644 --- a/freqtrade/persistence/migrations.py +++ b/freqtrade/persistence/migrations.py @@ -1,6 +1,6 @@ import logging -from sqlalchemy import inspect, select, text, update +from sqlalchemy import Engine, inspect, select, text, update from freqtrade.exceptions import OperationalException from freqtrade.persistence.trade_model import Order, Trade @@ -9,7 +9,7 @@ from freqtrade.persistence.trade_model import Order, Trade logger = logging.getLogger(__name__) -def get_table_names_for_table(inspector, tabletype) -> list[str]: +def get_table_names_for_table(inspector, tabletype: str) -> list[str]: return [t for t in inspector.get_table_names() if t.startswith(tabletype)] @@ -124,6 +124,7 @@ def migrate_trades_and_orders_table( funding_fees = get_column_def(cols, "funding_fees", "0.0") funding_fee_running = get_column_def(cols, "funding_fee_running", "null") max_stake_amount = get_column_def(cols, "max_stake_amount", "stake_amount") + record_version = get_column_def(cols, "record_version", "1") # If ticker-interval existed use that, else null. if has_column(cols, "ticker_interval"): @@ -180,7 +181,7 @@ def migrate_trades_and_orders_table( trading_mode, leverage, liquidation_price, is_short, interest_rate, funding_fees, funding_fee_running, realized_profit, amount_precision, price_precision, precision_mode, precision_mode_price, contract_size, - max_stake_amount + max_stake_amount, record_version ) select id, lower(exchange), pair, {base_currency} base_currency, {stake_currency} stake_currency, @@ -210,7 +211,8 @@ def migrate_trades_and_orders_table( {realized_profit} realized_profit, {amount_precision} amount_precision, {price_precision} price_precision, {precision_mode} precision_mode, {precision_mode_price} precision_mode_price, - {contract_size} contract_size, {max_stake_amount} max_stake_amount + {contract_size} contract_size, {max_stake_amount} max_stake_amount, + {record_version} record_version from {trade_back_name} """ ) @@ -329,7 +331,26 @@ def fix_old_dry_orders(engine): connection.execute(stmt) -def check_migrate(engine, decl_base, previous_tables) -> None: +def fix_wrong_max_stake_amount(engine): + """ + Fix max_stake_amount for leveraged closed trades + This caused record_version to be bumped to 2. + """ + with engine.begin() as connection: + stmt = ( + update(Trade) + .where( + Trade.record_version < 2, + Trade.leverage > 1, + Trade.is_open.is_(False), + Trade.max_stake_amount != 0, + ) + .values(max_stake_amount=Trade.max_stake_amount / Trade.leverage, record_version=2) + ) + connection.execute(stmt) + + +def check_migrate(engine: Engine, decl_base, previous_tables: list[str]) -> None: """ Checks if migration is necessary and migrates if necessary """ @@ -350,7 +371,7 @@ def check_migrate(engine, decl_base, previous_tables) -> None: # if ('orders' not in previous_tables # or not has_column(cols_orders, 'funding_fee')): migrating = False - if not has_column(cols_trades, "precision_mode_price"): + if not has_column(cols_trades, "record_version"): # if not has_column(cols_orders, "ft_order_tag"): migrating = True logger.info( @@ -383,6 +404,7 @@ def check_migrate(engine, decl_base, previous_tables) -> None: set_sqlite_to_wal(engine) fix_old_dry_orders(engine) + fix_wrong_max_stake_amount(engine) if migrating: logger.info("Database migration finished.") diff --git a/freqtrade/persistence/trade_model.py b/freqtrade/persistence/trade_model.py index c08dcb13b..6ac60cde0 100644 --- a/freqtrade/persistence/trade_model.py +++ b/freqtrade/persistence/trade_model.py @@ -464,6 +464,8 @@ class LocalTrade: # Used to keep running funding fees - between the last filled order and now # Shall not be used for calculations! funding_fee_running: float | None = None + # v 2 -> correct max_stake_amount calculation for leveraged trades + record_version: int = 2 @property def stoploss_or_liquidation(self) -> float: @@ -1025,12 +1027,12 @@ class LocalTrade: Calculate the open_rate including open_fee. :return: Price in of the open trade incl. Fees """ - open_trade = FtPrecise(amount) * FtPrecise(open_rate) - fees = open_trade * FtPrecise(self.fee_open) + open_value = FtPrecise(amount) * FtPrecise(open_rate) + fees = open_value * FtPrecise(self.fee_open) if self.is_short: - return float(open_trade - fees) + return float(open_value - fees) else: - return float(open_trade + fees) + return float(open_value + fees) def recalc_open_trade_value(self) -> None: """ @@ -1060,13 +1062,13 @@ class LocalTrade: return interest(exchange_name=self.exchange, borrowed=borrowed, rate=rate, hours=hours) 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) + close_value = amount * FtPrecise(rate) + fees = close_value * FtPrecise(fee or 0.0) if self.is_short: - return close_trade + fees + return close_value + fees else: - return close_trade - fees + return close_value - fees def calc_close_trade_value(self, rate: float, amount: float | None = None) -> float: """ @@ -1153,18 +1155,21 @@ class LocalTrade: profit_ratio = 0.0 total_profit_abs = profit_abs + self.realized_profit - total_profit_ratio = ( - (total_profit_abs / self.max_stake_amount) * self.leverage - if self.max_stake_amount - else 0.0 - ) - total_profit_ratio = float(f"{total_profit_ratio:.8f}") + if self.max_stake_amount: + max_stake = self.max_stake_amount * ( + (1 - self.fee_open) if self.is_short else (1 + self.fee_open) + ) + total_profit_ratio = total_profit_abs / max_stake + total_profit_ratio = float(f"{total_profit_ratio:.8f}") + else: + total_profit_ratio = 0.0 profit_abs = float(f"{profit_abs:.8f}") + total_profit_abs = float(f"{total_profit_abs:.8f}") return ProfitStruct( profit_abs=profit_abs, profit_ratio=profit_ratio, - total_profit=profit_abs + self.realized_profit, + total_profit=total_profit_abs, total_profit_ratio=total_profit_ratio, ) @@ -1243,7 +1248,7 @@ class LocalTrade: total_stake += self._calc_open_trade_value(tmp_amount, price) max_stake_amount += tmp_amount * price self.funding_fees = funding_fees - self.max_stake_amount = float(max_stake_amount) + self.max_stake_amount = float(max_stake_amount) / (self.leverage or 1.0) if close_profit: self.close_profit = close_profit @@ -1351,8 +1356,10 @@ class LocalTrade: def get_custom_data(self, key: str, default: Any = None) -> Any: """ - Get custom data for this trade + Get custom data for this trade. + :param key: key of the custom data + :param default: value to return if no data is found """ data = CustomDataWrapper.get_custom_data(trade_id=self.id, key=key) if data: @@ -1535,45 +1542,47 @@ class LocalTrade: :param json_str: json string to parse :return: Trade instance """ + from uuid import uuid4 + import rapidjson data = rapidjson.loads(json_str) trade = cls( __FROM_JSON=True, - id=data["trade_id"], + id=data.get("trade_id"), pair=data["pair"], - base_currency=data["base_currency"], - stake_currency=data["quote_currency"], + base_currency=data.get("base_currency"), + stake_currency=data.get("quote_currency"), is_open=data["is_open"], - exchange=data["exchange"], + exchange=data.get("exchange", "import"), amount=data["amount"], - amount_requested=data["amount_requested"], + amount_requested=data.get("amount_requested", data["amount"]), stake_amount=data["stake_amount"], - strategy=data["strategy"], + strategy=data.get("strategy"), enter_tag=data["enter_tag"], - timeframe=data["timeframe"], + timeframe=data.get("timeframe"), fee_open=data["fee_open"], - fee_open_cost=data["fee_open_cost"], - fee_open_currency=data["fee_open_currency"], + fee_open_cost=data.get("fee_open_cost"), + fee_open_currency=data.get("fee_open_currency"), fee_close=data["fee_close"], - fee_close_cost=data["fee_close_cost"], - fee_close_currency=data["fee_close_currency"], + fee_close_cost=data.get("fee_close_cost"), + fee_close_currency=data.get("fee_close_currency"), open_date=datetime.fromtimestamp(data["open_timestamp"] // 1000, tz=timezone.utc), open_rate=data["open_rate"], - open_rate_requested=data["open_rate_requested"], - open_trade_value=data["open_trade_value"], + open_rate_requested=data.get("open_rate_requested", data["open_rate"]), + open_trade_value=data.get("open_trade_value"), close_date=( datetime.fromtimestamp(data["close_timestamp"] // 1000, tz=timezone.utc) if data["close_timestamp"] else None ), - realized_profit=data["realized_profit"], + realized_profit=data.get("realized_profit", 0), close_rate=data["close_rate"], - close_rate_requested=data["close_rate_requested"], - close_profit=data["close_profit"], - close_profit_abs=data["close_profit_abs"], + close_rate_requested=data.get("close_rate_requested", data["close_rate"]), + close_profit=data.get("close_profit", data.get("profit_ratio")), + close_profit_abs=data.get("close_profit_abs", data.get("profit_abs")), exit_reason=data["exit_reason"], - exit_order_status=data["exit_order_status"], + exit_order_status=data.get("exit_order_status"), stop_loss=data["stop_loss_abs"], stop_loss_pct=data["stop_loss_ratio"], initial_stop_loss=data["initial_stop_loss_abs"], @@ -1581,11 +1590,11 @@ class LocalTrade: min_rate=data["min_rate"], max_rate=data["max_rate"], leverage=data["leverage"], - interest_rate=data["interest_rate"], - liquidation_price=data["liquidation_price"], + interest_rate=data.get("interest_rate"), + liquidation_price=data.get("liquidation_price"), is_short=data["is_short"], - trading_mode=data["trading_mode"], - funding_fees=data["funding_fees"], + trading_mode=data.get("trading_mode"), + funding_fees=data.get("funding_fees"), amount_precision=data.get("amount_precision", None), price_precision=data.get("price_precision", None), precision_mode=data.get("precision_mode", None), @@ -1597,23 +1606,25 @@ class LocalTrade: amount=order["amount"], ft_amount=order["amount"], ft_order_side=order["ft_order_side"], - ft_pair=order["pair"], - ft_is_open=order["is_open"], - order_id=order["order_id"], - status=order["status"], - average=order["average"], + ft_pair=order.get("pair", data["pair"]), + ft_is_open=order.get("is_open", False), + order_id=order.get("order_id", uuid4().hex), + status=order.get("status"), + average=order.get("average", order.get("safe_price")), cost=order["cost"], - filled=order["filled"], - order_date=datetime.strptime(order["order_date"], DATETIME_PRINT_FORMAT), + filled=order.get("filled", order["amount"]), + order_date=datetime.strptime(order["order_date"], DATETIME_PRINT_FORMAT) + if order.get("order_date") + else None, order_filled_date=( datetime.fromtimestamp(order["order_filled_timestamp"] // 1000, tz=timezone.utc) if order["order_filled_timestamp"] else None ), - order_type=order["order_type"], - price=order["price"], - ft_price=order["price"], - remaining=order["remaining"], + order_type=order.get("order_type"), + price=order.get("price", order.get("safe_price")), + ft_price=order.get("price", order.get("safe_price")), + remaining=order.get("remaining", 0.0), funding_fee=order.get("funding_fee", None), ft_order_tag=order.get("ft_order_tag", None), ) @@ -1748,6 +1759,8 @@ class Trade(ModelBase, LocalTrade): Float(), nullable=True, default=None ) + record_version: Mapped[int] = mapped_column(Integer, nullable=False, default=2) # type: ignore + def __init__(self, **kwargs): from_json = kwargs.pop("__FROM_JSON", None) super().__init__(**kwargs) diff --git a/freqtrade/plot/plotting.py b/freqtrade/plot/plotting.py index 4f486d8a1..6419ab0c2 100644 --- a/freqtrade/plot/plotting.py +++ b/freqtrade/plot/plotting.py @@ -460,7 +460,7 @@ def generate_candlestick_graph( rows=rows, cols=1, shared_xaxes=True, - row_width=row_widths + [1, 4], + row_width=[*row_widths, 1, 4], vertical_spacing=0.0001, ) fig["layout"].update(title=pair) diff --git a/freqtrade/plugins/pairlist/IPairList.py b/freqtrade/plugins/pairlist/IPairList.py index 89a9e68cd..9cb5d7744 100644 --- a/freqtrade/plugins/pairlist/IPairList.py +++ b/freqtrade/plugins/pairlist/IPairList.py @@ -251,6 +251,7 @@ class IPairList(LoggingMixin, ABC): f"Pair {pair} is not compatible with exchange " f"{self._exchange.name}. Removing it from whitelist..", logger.warning, + True, ) continue @@ -258,6 +259,7 @@ class IPairList(LoggingMixin, ABC): self.log_once( f"Pair {pair} is not tradable with Freqtrade. Removing it from whitelist..", logger.warning, + True, ) continue @@ -266,13 +268,18 @@ class IPairList(LoggingMixin, ABC): f"Pair {pair} is not compatible with your stake currency " f"{self._config['stake_currency']}. Removing it from whitelist..", logger.warning, + True, ) continue # Check if market is active market = markets[pair] if not market_is_active(market): - self.log_once(f"Ignoring {pair} from whitelist. Market is not active.", logger.info) + self.log_once( + f"Ignoring {pair} from whitelist. Market is not active.", + logger.info, + True, + ) continue if pair not in sanitized_whitelist: sanitized_whitelist.append(pair) diff --git a/freqtrade/resolvers/strategy_resolver.py b/freqtrade/resolvers/strategy_resolver.py index a3ec03e2b..b56ed8e11 100644 --- a/freqtrade/resolvers/strategy_resolver.py +++ b/freqtrade/resolvers/strategy_resolver.py @@ -242,6 +242,14 @@ class StrategyResolver(IResolver): if has_after_fill: strategy._ft_stop_uses_after_fill = True + if check_override(strategy, IStrategy, "adjust_order_price") and ( + check_override(strategy, IStrategy, "adjust_entry_price") + or check_override(strategy, IStrategy, "adjust_exit_price") + ): + raise OperationalException( + "If you implement `adjust_order_price`, `adjust_entry_price` and " + "`adjust_exit_price` will not be used. Please pick one approach for your strategy." + ) return strategy @staticmethod diff --git a/freqtrade/rpc/api_server/api_backtest.py b/freqtrade/rpc/api_server/api_backtest.py index 278922b7d..07d1076bd 100644 --- a/freqtrade/rpc/api_server/api_backtest.py +++ b/freqtrade/rpc/api_server/api_backtest.py @@ -96,7 +96,10 @@ def __run_backtest_bg(btconfig: Config): ) ApiBG.bt["bt"].results = generate_backtest_stats( - ApiBG.bt["data"], ApiBG.bt["bt"].all_results, min_date=min_date, max_date=max_date + ApiBG.bt["data"], + ApiBG.bt["bt"].all_bt_content, + min_date=min_date, + max_date=max_date, ) if btconfig.get("export", "none") == "trades": @@ -108,6 +111,9 @@ def __run_backtest_bg(btconfig: Config): ApiBG.bt["bt"].results, datetime.now().strftime("%Y-%m-%d_%H-%M-%S"), market_change_data=combined_res, + strategy_files={ + s.get_strategy_name(): s.__file__ for s in ApiBG.bt["bt"].strategylist + }, ) ApiBG.bt["bt"].results["metadata"][strategy_name]["filename"] = str(fn.stem) ApiBG.bt["bt"].results["metadata"][strategy_name]["strategy"] = strategy_name diff --git a/freqtrade/rpc/api_server/api_pairlists.py b/freqtrade/rpc/api_server/api_pairlists.py index 75467c28b..727798566 100644 --- a/freqtrade/rpc/api_server/api_pairlists.py +++ b/freqtrade/rpc/api_server/api_pairlists.py @@ -110,13 +110,17 @@ def handleExchangePayload(payload: ExchangeModePayloadMixin, config_loc: Config) Handle exchange and trading mode payload. Updates the configuration with the payload values. """ + from freqtrade.configuration.directory_operations import create_datadir + if payload.exchange: config_loc["exchange"]["name"] = payload.exchange + config_loc.update({"datadir": create_datadir(config_loc, None)}) if payload.trading_mode: config_loc["trading_mode"] = payload.trading_mode config_loc["candle_type_def"] = CandleType.get_default( config_loc.get("trading_mode", "spot") or "spot" ) + if payload.margin_mode: config_loc["margin_mode"] = payload.margin_mode diff --git a/freqtrade/rpc/api_server/api_schemas.py b/freqtrade/rpc/api_server/api_schemas.py index 881719931..bb5dfafa7 100644 --- a/freqtrade/rpc/api_server/api_schemas.py +++ b/freqtrade/rpc/api_server/api_schemas.py @@ -638,3 +638,16 @@ class Health(BaseModel): bot_start_ts: int | None = None bot_startup: datetime | None = None bot_startup_ts: int | None = None + + +class CustomDataEntry(BaseModel): + key: str + type: str + value: Any + created_at: datetime + updated_at: datetime | None = None + + +class ListCustomData(BaseModel): + trade_id: int + custom_data: list[CustomDataEntry] diff --git a/freqtrade/rpc/api_server/api_v1.py b/freqtrade/rpc/api_server/api_v1.py index 8aafa04c6..348ffd7a3 100644 --- a/freqtrade/rpc/api_server/api_v1.py +++ b/freqtrade/rpc/api_server/api_v1.py @@ -29,6 +29,7 @@ from freqtrade.rpc.api_server.api_schemas import ( FreqAIModelListResponse, Health, HyperoptLossListResponse, + ListCustomData, Locks, LocksPayload, Logs, @@ -153,21 +154,33 @@ def stats(rpc: RPC = Depends(get_rpc)): @router.get("/daily", response_model=DailyWeeklyMonthly, tags=["info"]) -def daily(timescale: int = 7, rpc: RPC = Depends(get_rpc), config=Depends(get_config)): +def daily( + timescale: int = Query(7, ge=1, description="Number of days to fetch data for"), + rpc: RPC = Depends(get_rpc), + config=Depends(get_config), +): return rpc._rpc_timeunit_profit( timescale, config["stake_currency"], config.get("fiat_display_currency", "") ) @router.get("/weekly", response_model=DailyWeeklyMonthly, tags=["info"]) -def weekly(timescale: int = 4, rpc: RPC = Depends(get_rpc), config=Depends(get_config)): +def weekly( + timescale: int = Query(4, ge=1, description="Number of weeks to fetch data for"), + rpc: RPC = Depends(get_rpc), + config=Depends(get_config), +): return rpc._rpc_timeunit_profit( timescale, config["stake_currency"], config.get("fiat_display_currency", ""), "weeks" ) @router.get("/monthly", response_model=DailyWeeklyMonthly, tags=["info"]) -def monthly(timescale: int = 3, rpc: RPC = Depends(get_rpc), config=Depends(get_config)): +def monthly( + timescale: int = Query(3, ge=1, description="Number of months to fetch data for"), + rpc: RPC = Depends(get_rpc), + config=Depends(get_config), +): return rpc._rpc_timeunit_profit( timescale, config["stake_currency"], config.get("fiat_display_currency", ""), "months" ) @@ -184,8 +197,15 @@ def status(rpc: RPC = Depends(get_rpc)): # Using the responsemodel here will cause a ~100% increase in response time (from 1s to 2s) # on big databases. Correct response model: response_model=TradeResponse, @router.get("/trades", tags=["info", "trading"]) -def trades(limit: int = 500, offset: int = 0, rpc: RPC = Depends(get_rpc)): - return rpc._rpc_trade_history(limit, offset=offset, order_by_id=True) +def trades( + limit: int = Query(500, ge=1, description="Maximum number of different trades to return data"), + offset: int = Query(0, ge=0, description="Number of trades to skip for pagination"), + order_by_id: bool = Query( + True, description="Sort trades by id (default: True). If False, sorts by latest timestamp" + ), + rpc: RPC = Depends(get_rpc), +): + return rpc._rpc_trade_history(limit, offset=offset, order_by_id=order_by_id) @router.get("/trade/{tradeid}", response_model=OpenTradeSchema, tags=["info", "trading"]) @@ -213,6 +233,36 @@ def trade_reload(tradeid: int, rpc: RPC = Depends(get_rpc)): return rpc._rpc_trade_status([tradeid])[0] +@router.get("/trades/open/custom-data", response_model=list[ListCustomData], tags=["trading"]) +def list_open_trades_custom_data( + key: str | None = Query(None, description="Optional key to filter data"), + limit: int = Query(100, ge=1, description="Maximum number of different trades to return data"), + offset: int = Query(0, ge=0, description="Number of trades to skip for pagination"), + rpc: RPC = Depends(get_rpc), +): + """ + Fetch custom data for all open trades. + If a key is provided, it will be used to filter data accordingly. + Pagination is implemented via the `limit` and `offset` parameters. + """ + try: + return rpc._rpc_list_custom_data(key=key, limit=limit, offset=offset) + except RPCException as e: + raise HTTPException(status_code=404, detail=str(e)) + + +@router.get("/trades/{trade_id}/custom-data", response_model=list[ListCustomData], tags=["trading"]) +def list_custom_data(trade_id: int, key: str | None = Query(None), rpc: RPC = Depends(get_rpc)): + """ + Fetch custom data for a specific trade. + If a key is provided, it will be used to filter data accordingly. + """ + try: + return rpc._rpc_list_custom_data(trade_id, key=key) + except RPCException as e: + raise HTTPException(status_code=404, detail=str(e)) + + # TODO: Missing response model @router.get("/edge", tags=["info"]) def edge(rpc: RPC = Depends(get_rpc)): @@ -322,10 +372,11 @@ def stop(rpc: RPC = Depends(get_rpc)): return rpc._rpc_stop() +@router.post("/pause", response_model=StatusMsg, tags=["botcontrol"]) @router.post("/stopentry", response_model=StatusMsg, tags=["botcontrol"]) @router.post("/stopbuy", response_model=StatusMsg, tags=["botcontrol"]) -def stop_buy(rpc: RPC = Depends(get_rpc)): - return rpc._rpc_stopentry() +def pause(rpc: RPC = Depends(get_rpc)): + return rpc._rpc_pause() @router.post("/reload_config", response_model=StatusMsg, tags=["botcontrol"]) diff --git a/freqtrade/rpc/api_server/uvicorn_threaded.py b/freqtrade/rpc/api_server/uvicorn_threaded.py index 07faaff53..d765472f6 100644 --- a/freqtrade/rpc/api_server/uvicorn_threaded.py +++ b/freqtrade/rpc/api_server/uvicorn_threaded.py @@ -41,7 +41,7 @@ class UvicornServer(uvicorn.Server): but we need to create uvloop event loop manually """ try: - import uvloop # noqa + import uvloop except ImportError: # pragma: no cover asyncio_setup() else: diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index 8abe0146e..696fec7b7 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -6,13 +6,12 @@ import logging from abc import abstractmethod from collections.abc import Generator, Sequence from datetime import date, datetime, timedelta, timezone -from math import isnan from typing import TYPE_CHECKING, Any import psutil from dateutil.relativedelta import relativedelta from dateutil.tz import tzlocal -from numpy import inf, int64, mean, nan +from numpy import inf, int64, isnan, mean, nan from pandas import DataFrame, NaT from sqlalchemy import func, select @@ -35,7 +34,7 @@ from freqtrade.exchange import Exchange, timeframe_to_minutes, timeframe_to_msec from freqtrade.exchange.exchange_utils import price_to_precision from freqtrade.ft_types import AnnotationType from freqtrade.loggers import bufferHandler -from freqtrade.persistence import KeyStoreKeys, KeyValueStore, PairLocks, Trade +from freqtrade.persistence import CustomDataWrapper, 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 @@ -637,7 +636,7 @@ class RPC: first_date = trades[0].open_date_utc if trades else None last_date = trades[-1].open_date_utc if trades else None num = float(len(durations) or 1) - bot_start = KeyValueStore.get_datetime_value(KeyStoreKeys.BOT_START_TIME) + bot_start = KeyValueStore.get_datetime_value("bot_start_time") return { "profit_closed_coin": profit_closed_coin_sum, "profit_closed_percent_mean": round(profit_closed_ratio_mean * 100, 2), @@ -840,7 +839,7 @@ class RPC: def _rpc_stop(self) -> dict[str, str]: """Handler for stop""" - if self._freqtrade.state == State.RUNNING: + if self._freqtrade.state != State.STOPPED: self._freqtrade.state = State.STOPPED return {"status": "stopping trader ..."} @@ -851,16 +850,25 @@ class RPC: self._freqtrade.state = State.RELOAD_CONFIG return {"status": "Reloading config ..."} - def _rpc_stopentry(self) -> dict[str, str]: + def _rpc_pause(self) -> dict[str, str]: """ - Handler to stop buying, but handle open trades gracefully. + Handler to pause trading (stop entering new trades), but handle open trades gracefully. """ if self._freqtrade.state == State.RUNNING: - # Set 'max_open_trades' to 0 - self._freqtrade.config["max_open_trades"] = 0 - self._freqtrade.strategy.max_open_trades = 0 + self._freqtrade.state = State.PAUSED - return {"status": "No more entries will occur from now. Run /reload_config to reset."} + if self._freqtrade.state == State.STOPPED: + self._freqtrade.state = State.PAUSED + return { + "status": ( + "starting bot with trader in paused state, no entries will occur. " + "Run /start to enable entries." + ) + } + + return { + "status": "paused, no more entries will occur from now. Run /start to enable entries." + } def _rpc_reload_trade_from_exchange(self, trade_id: int) -> dict[str, str]: """ @@ -932,7 +940,7 @@ class RPC: Sells the given trade at current price """ - if self._freqtrade.state != State.RUNNING: + if self._freqtrade.state == State.STOPPED: raise RPCException("trader is not running") with self._freqtrade._exit_lock: @@ -1048,7 +1056,7 @@ class RPC: raise RPCException(f"Failed to enter position for {pair}.") def _rpc_cancel_open_order(self, trade_id: int): - if self._freqtrade.state != State.RUNNING: + if self._freqtrade.state == State.STOPPED: raise RPCException("trader is not running") with self._freqtrade._exit_lock: # Query for trade @@ -1117,31 +1125,70 @@ class RPC: "cancel_order_count": c_count, } - 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: - return [] - # Query custom_data - custom_data = [] - if key: - data = trade.get_custom_data(key=key) - if data: - custom_data = [data] + def _rpc_list_custom_data( + self, trade_id: int | None = None, key: str | None = None, limit: int = 100, offset: int = 0 + ) -> list[dict[str, Any]]: + """ + Fetch custom data for a specific trade, or all open trades if `trade_id` is not provided. + Pagination is applied via `limit` and `offset`. + + Returns an array of dictionaries, each containing: + - "trade_id": the ID of the trade (int) + - "custom_data": a list of custom data dicts, each with the fields: + "id", "key", "type", "value", "created_at", "updated_at" + """ + trades: Sequence[Trade] + if trade_id is None: + # Get all open trades + trades = Trade.session.scalars( + Trade.get_trades_query([Trade.is_open.is_(True)]) + .order_by(Trade.id) + .limit(limit) + .offset(offset) + ).all() else: - custom_data = trade.get_all_custom_data() - return [ - { - "id": data_entry.id, - "ft_trade_id": data_entry.ft_trade_id, - "cd_key": data_entry.cd_key, - "cd_type": data_entry.cd_type, - "cd_value": data_entry.cd_value, - "created_at": data_entry.created_at, - "updated_at": data_entry.updated_at, - } - for data_entry in custom_data - ] + trades = Trade.get_trades(trade_filter=[Trade.id == trade_id]).all() + + if not trades: + raise RPCException( + f"No trade found for trade_id: {trade_id}" if trade_id else "No open trades found." + ) + + results = [] + for trade in trades: + # Depending on whether a specific key is provided, retrieve custom data accordingly. + if key: + data = trade.get_custom_data_entry(key=key) + # If data exists, wrap it in a list so the output remains consistent. + custom_data = [data] if data else [] + else: + custom_data = trade.get_all_custom_data() + + # Format and Append result for the trade if any custom data was found. + if custom_data: + formatted_custom_data = [ + { + "key": data_entry.cd_key, + "type": data_entry.cd_type, + "value": CustomDataWrapper._convert_custom_data(data_entry).value, + "created_at": data_entry.created_at, + "updated_at": data_entry.updated_at, + } + for data_entry in custom_data + ] + results.append({"trade_id": trade.id, "custom_data": formatted_custom_data}) + + # Handle case when there is no custom data found across trades. + if not results: + message_details = "" + if key: + message_details += f"with key '{key}' " + message_details += ( + f"found for Trade ID: {trade_id}." if trade_id else "found for any open trades." + ) + raise RPCException(f"No custom-data {message_details}") + + return results def _rpc_performance(self) -> list[dict[str, Any]]: """ @@ -1177,7 +1224,7 @@ class RPC: def _rpc_count(self) -> dict[str, float]: """Returns the number of trades running""" - if self._freqtrade.state != State.RUNNING: + if self._freqtrade.state == State.STOPPED: raise RPCException("trader is not running") trades = Trade.get_open_trades() @@ -1569,7 +1616,7 @@ class RPC: } ) - if bot_start := KeyValueStore.get_datetime_value(KeyStoreKeys.BOT_START_TIME): + if bot_start := KeyValueStore.get_datetime_value("bot_start_time"): res.update( { "bot_start": str(bot_start), @@ -1577,7 +1624,7 @@ class RPC: "bot_start_ts": int(bot_start.timestamp()), } ) - if bot_startup := KeyValueStore.get_datetime_value(KeyStoreKeys.STARTUP_TIME): + if bot_startup := KeyValueStore.get_datetime_value("startup_time"): res.update( { "bot_startup": str(bot_startup), diff --git a/freqtrade/rpc/telegram.py b/freqtrade/rpc/telegram.py index 5b4982346..f3f4a4196 100644 --- a/freqtrade/rpc/telegram.py +++ b/freqtrade/rpc/telegram.py @@ -25,6 +25,7 @@ from telegram import ( InlineKeyboardButton, InlineKeyboardMarkup, KeyboardButton, + Message, ReplyKeyboardMarkup, Update, ) @@ -96,17 +97,17 @@ def authorized_only(command_handler: Callable[..., Coroutine[Any, Any, None]]): """ @wraps(command_handler) - async def wrapper(self, *args, **kwargs): + async def wrapper(self, *args, **kwargs) -> None: """Decorator logic""" update = kwargs.get("update") or args[0] # 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 + message: Message = ( + update.message if update.callback_query is None else update.callback_query.message + ) + cchat_id: int = int(message.chat_id) + ctopic_id: int | None = message.message_thread_id + from_user_id: str = str(update.effective_user.id if update.effective_user else "") chat_id = int(self._config["telegram"]["chat_id"]) if cchat_id != chat_id: @@ -118,6 +119,10 @@ def authorized_only(command_handler: Callable[..., Coroutine[Any, Any, None]]): logger.debug(f"Rejected message from wrong channel: {cchat_id}, {ctopic_id}") return None + authorized = self._config["telegram"].get("authorized_users", None) + if authorized is not None and from_user_id not in authorized: + logger.info(f"Unauthorized user tried to control the bot: {from_user_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) @@ -173,6 +178,7 @@ class Telegram(RPCHandler): # problem in _help()). valid_keys: list[str] = [ r"/start$", + r"/pause$", r"/stop$", r"/status$", r"/status table$", @@ -288,7 +294,7 @@ class Telegram(RPCHandler): CommandHandler(["unlock", "delete_locks"], self._delete_locks), CommandHandler(["reload_config", "reload_conf"], self._reload_config), CommandHandler(["show_config", "show_conf"], self._show_config), - CommandHandler(["stopbuy", "stopentry"], self._stopentry), + CommandHandler(["stopbuy", "stopentry", "pause"], self._pause), CommandHandler("whitelist", self._whitelist), CommandHandler("blacklist", self._blacklist), CommandHandler(["blacklist_delete", "bl_delete"], self._blacklist_delete), @@ -1264,15 +1270,15 @@ class Telegram(RPCHandler): await self._send_msg(f"Status: `{msg['status']}`") @authorized_only - async def _stopentry(self, update: Update, context: CallbackContext) -> None: + async def _pause(self, update: Update, context: CallbackContext) -> None: """ - Handler for /stop_buy. - Sets max_open_trades to 0 and gracefully sells all open trades + Handler for /stop_buy /stop_entry and /pause. + Sets bot state to paused :param bot: telegram bot :param update: message update :return: None """ - msg = self._rpc._rpc_stopentry() + msg = self._rpc._rpc_pause() await self._send_msg(f"Status: `{msg['status']}`") @authorized_only @@ -1824,6 +1830,7 @@ class Telegram(RPCHandler): "_Bot Control_\n" "------------\n" "*/start:* `Starts the trader`\n" + "*/pause:* `Pause the new entries for trader, but handles open trades gracefully`\n" "*/stop:* `Stops the trader`\n" "*/stopentry:* `Stops entering, but handles open trades gracefully` \n" "*/forceexit |all:* `Instantly exits the given trade or all trades, " @@ -1976,16 +1983,17 @@ class Telegram(RPCHandler): results = self._rpc._rpc_list_custom_data(trade_id, key) messages = [] if len(results) > 0: - messages.append("Found custom-data entr" + ("ies: " if len(results) > 1 else "y: ")) - for result in results: + trade_custom_data = results[0]["custom_data"] + messages.append( + "Found custom-data entr" + ("ies: " if len(trade_custom_data) > 1 else "y: ") + ) + for custom_data in trade_custom_data: lines = [ - f"*Key:* `{result['cd_key']}`", - f"*ID:* `{result['id']}`", - f"*Trade ID:* `{result['ft_trade_id']}`", - f"*Type:* `{result['cd_type']}`", - f"*Value:* `{result['cd_value']}`", - f"*Create Date:* `{format_date(result['created_at'])}`", - f"*Update Date:* `{format_date(result['updated_at'])}`", + f"*Key:* `{custom_data['key']}`", + f"*Type:* `{custom_data['type']}`", + f"*Value:* `{custom_data['value']}`", + f"*Create Date:* `{format_date(custom_data['created_at'])}`", + f"*Update Date:* `{format_date(custom_data['updated_at'])}`", ] # Filter empty lines using list-comprehension messages.append("\n".join([line for line in lines if line])) @@ -2153,6 +2161,9 @@ class Telegram(RPCHandler): return chat_id = update.message.chat_id topic_id = update.message.message_thread_id + user_id = ( + update.effective_user.id if topic_id is not None and update.effective_user else None + ) msg = f"""Freqtrade Bot Info: ```json @@ -2160,7 +2171,8 @@ class Telegram(RPCHandler): "enabled": true, "token": "********", "chat_id": "{chat_id}", - {f'"topic_id": "{topic_id}"' if topic_id else ""} + {f'"topic_id": "{topic_id}",' if topic_id else ""} + {f'//"authorized_users": ["{user_id}"]' if topic_id and user_id else ""} }} ``` """ diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index 7a2d101fc..6217b1c39 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -12,6 +12,7 @@ from pandas import DataFrame from freqtrade.constants import CUSTOM_TAG_MAX_LENGTH, Config, IntOrInf, ListPairsWithTimeframes from freqtrade.data.converter import populate_dataframe_with_trades +from freqtrade.data.converter.converter import reduce_dataframe_footprint from freqtrade.data.dataprovider import DataProvider from freqtrade.enums import ( CandleType, @@ -133,6 +134,7 @@ class IStrategy(ABC, HyperStrategyMixin): stake_currency: str # container variable for strategy source code __source__: str = "" + __file__: str = "" # Definition of plot_config. See plotting documentation for more details. plot_config: dict = {} @@ -665,7 +667,7 @@ class IStrategy(ABC, HyperStrategyMixin): entry_tag: str | None, side: str, **kwargs, - ) -> float: + ) -> float | None: """ 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) @@ -686,11 +688,109 @@ class IStrategy(ABC, HyperStrategyMixin): :param entry_tag: Optional entry_tag (buy_tag) if provided with the buy signal. :param side: 'long' or 'short' - indicating the direction of the proposed trade :param **kwargs: Ensure to keep this here so updates to this won't break your strategy. - :return float: New entry price value if provided + :return float or None: New entry price value if provided """ return current_order_rate + def adjust_exit_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 | None: + """ + Exit 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) + and not timed out on subsequent candles after entry trigger. + + For full documentation please go to https://www.freqtrade.io/en/latest/strategy-callbacks/ + + When not implemented by a strategy, returns current_order_rate as default. + If current_order_rate is returned then the existing order is maintained. + If None is returned then order gets canceled but not replaced by a new one. + + :param pair: Pair that's currently analyzed + :param trade: Trade object. + :param order: Order object + :param current_time: datetime object, containing the current datetime + :param proposed_rate: Rate, calculated based on pricing settings in entry_pricing. + :param current_order_rate: Rate of the existing order in place. + :param entry_tag: Optional entry_tag (buy_tag) if provided with the buy signal. + :param side: 'long' or 'short' - indicating the direction of the proposed trade + :param **kwargs: Ensure to keep this here so updates to this won't break your strategy. + :return float or None: New exit price value if provided + + """ + return current_order_rate + + def adjust_order_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, + is_entry: bool, + **kwargs, + ) -> float | None: + """ + Exit and entry order 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) + and not timed out on subsequent candles after entry trigger. + + For full documentation please go to https://www.freqtrade.io/en/latest/strategy-callbacks/ + + When not implemented by a strategy, returns current_order_rate as default. + If current_order_rate is returned then the existing order is maintained. + If None is returned then order gets canceled but not replaced by a new one. + + :param pair: Pair that's currently analyzed + :param trade: Trade object. + :param order: Order object + :param current_time: datetime object, containing the current datetime + :param proposed_rate: Rate, calculated based on pricing settings in entry_pricing. + :param current_order_rate: Rate of the existing order in place. + :param entry_tag: Optional entry_tag (buy_tag) if provided with the buy signal. + :param side: 'long' or 'short' - indicating the direction of the proposed trade + :param is_entry: True if the order is an entry order, False if it's an exit order. + :param **kwargs: Ensure to keep this here so updates to this won't break your strategy. + :return float or None: New entry price value if provided + """ + if is_entry: + return self.adjust_entry_price( + trade=trade, + order=order, + pair=pair, + current_time=current_time, + proposed_rate=proposed_rate, + current_order_rate=current_order_rate, + entry_tag=entry_tag, + side=side, + **kwargs, + ) + else: + return self.adjust_exit_price( + trade=trade, + order=order, + pair=pair, + current_time=current_time, + proposed_rate=proposed_rate, + current_order_rate=current_order_rate, + entry_tag=entry_tag, + side=side, + **kwargs, + ) + def leverage( self, pair: str, @@ -1618,12 +1718,12 @@ class IStrategy(ABC, HyperStrategyMixin): dataframe = self.advise_exit(dataframe, metadata) return dataframe - def _if_enabled_populate_trades(self, dataframe: DataFrame, metadata: dict): + def _if_enabled_populate_trades(self, dataframe: DataFrame, metadata: dict) -> DataFrame: use_public_trades = self.config.get("exchange", {}).get("use_public_trades", False) if use_public_trades: - trades = self.dp.trades(pair=metadata["pair"], copy=False) - pair = metadata["pair"] + trades = self.dp.trades(pair=pair, copy=False) + # TODO: slice trades to size of dataframe for faster backtesting cached_grouped_trades: DataFrame | None = self._cached_grouped_trades_per_pair.get(pair) dataframe, cached_grouped_trades = populate_dataframe_with_trades( @@ -1636,6 +1736,7 @@ class IStrategy(ABC, HyperStrategyMixin): self._cached_grouped_trades_per_pair[pair] = cached_grouped_trades logger.debug("Populated dataframe with trades.") + return dataframe def advise_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: """ @@ -1653,8 +1754,14 @@ class IStrategy(ABC, HyperStrategyMixin): self, dataframe, metadata, inf_data, populate_fn ) - self._if_enabled_populate_trades(dataframe, metadata) - return self.populate_indicators(dataframe, metadata) + dataframe = self._if_enabled_populate_trades(dataframe, metadata) + dataframe = self.populate_indicators(dataframe, metadata) + if self.config.get("reduce_df_footprint", False) and self.config.get("runmode") not in [ + RunMode.DRY_RUN, + RunMode.LIVE, + ]: + dataframe = reduce_dataframe_footprint(dataframe) + return dataframe def advise_entry(self, dataframe: DataFrame, metadata: dict) -> DataFrame: """ diff --git a/freqtrade/strategy/strategyupdater.py b/freqtrade/strategy/strategyupdater.py index 05494537d..998a3aac3 100644 --- a/freqtrade/strategy/strategyupdater.py +++ b/freqtrade/strategy/strategyupdater.py @@ -83,7 +83,7 @@ class StrategyUpdater: return updated_code # function that uses the ast module to update the code - def modify_ast(self, tree): # noqa + def modify_ast(self, tree): # use the visitor to update the names and functions in the AST NameUpdater().visit(tree) diff --git a/freqtrade/templates/base_strategy.py.j2 b/freqtrade/templates/base_strategy.py.j2 index fe577826a..16998ab52 100644 --- a/freqtrade/templates/base_strategy.py.j2 +++ b/freqtrade/templates/base_strategy.py.j2 @@ -33,7 +33,6 @@ from freqtrade.strategy import ( # -------------------------------- # Add your lib to import here import talib.abstract as ta -import pandas_ta as pta from technical import qtpylib diff --git a/freqtrade/templates/strategy_subtemplates/strategy_methods_advanced.j2 b/freqtrade/templates/strategy_subtemplates/strategy_methods_advanced.j2 index 84d7f40c8..dc133c75a 100644 --- a/freqtrade/templates/strategy_subtemplates/strategy_methods_advanced.j2 +++ b/freqtrade/templates/strategy_subtemplates/strategy_methods_advanced.j2 @@ -40,7 +40,7 @@ def custom_entry_price( """ return proposed_rate -def adjust_entry_price( +def adjust_order_price( self, trade: Trade, order: Order | None, @@ -50,10 +50,11 @@ def adjust_entry_price( current_order_rate: float, entry_tag: str | None, side: str, + is_entry: bool, **kwargs, -) -> float: +) -> float | None: """ - Entry price re-adjustment logic, returning the user desired limit price. + Exit and entry order 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) and not timed out on subsequent candles after entry trigger. @@ -71,9 +72,9 @@ def adjust_entry_price( :param current_order_rate: Rate of the existing order in place. :param entry_tag: Optional entry_tag (buy_tag) if provided with the buy signal. :param side: 'long' or 'short' - indicating the direction of the proposed trade + :param is_entry: True if the order is an entry order, False if it's an exit order. :param **kwargs: Ensure to keep this here so updates to this won't break your strategy. - :return float: New entry price value if provided - + :return float or None: New entry price value if provided """ return current_order_rate diff --git a/freqtrade/util/migrations/__init__.py b/freqtrade/util/migrations/__init__.py index 4e81b1c57..8a9f10949 100644 --- a/freqtrade/util/migrations/__init__.py +++ b/freqtrade/util/migrations/__init__.py @@ -4,6 +4,9 @@ from freqtrade.util.migrations.funding_rate_mig import migrate_funding_fee_timef def migrate_data(config, exchange: Exchange | None = None): + """ + Migrate persisted data from old formats to new formats + """ migrate_binance_futures_data(config) migrate_funding_fee_timeframe(config, exchange) diff --git a/freqtrade/util/migrations/binance_mig.py b/freqtrade/util/migrations/binance_mig.py index e5255fa6d..248d5810d 100644 --- a/freqtrade/util/migrations/binance_mig.py +++ b/freqtrade/util/migrations/binance_mig.py @@ -6,8 +6,8 @@ from sqlalchemy import select from freqtrade.constants import DOCS_LINK, Config from freqtrade.enums import TradingMode from freqtrade.exceptions import OperationalException +from freqtrade.persistence import KeyValueStore, Trade from freqtrade.persistence.pairlock import PairLock -from freqtrade.persistence.trade_model import Trade logger = logging.getLogger(__name__) @@ -20,6 +20,9 @@ def migrate_binance_futures_names(config: Config): ): # only act on new futures return + if KeyValueStore.get_int_value("binance_migration"): + # already migrated + return import ccxt if version.parse("2.6.26") > version.parse(ccxt.__version__): @@ -29,10 +32,11 @@ def migrate_binance_futures_names(config: Config): ) _migrate_binance_futures_db(config) migrate_binance_futures_data(config) + KeyValueStore.store_value("binance_migration", 1) def _migrate_binance_futures_db(config: Config): - logger.warning("Migrating binance futures pairs in database.") + logger.info("Migrating binance futures pairs in database.") trades = Trade.get_trades([Trade.exchange == "binance", Trade.trading_mode == "FUTURES"]).all() for trade in trades: if ":" in trade.pair: @@ -52,7 +56,7 @@ def _migrate_binance_futures_db(config: Config): # print(pls) # pls.update({'pair': concat(PairLock.pair,':USDT')}) Trade.commit() - logger.warning("Done migrating binance futures pairs in database.") + logger.info("Done migrating binance futures pairs in database.") def migrate_binance_futures_data(config: Config): diff --git a/freqtrade/util/progress_tracker.py b/freqtrade/util/progress_tracker.py index cc5c79a18..aac1418bc 100644 --- a/freqtrade/util/progress_tracker.py +++ b/freqtrade/util/progress_tracker.py @@ -7,7 +7,6 @@ from rich.progress import ( TimeRemainingColumn, ) -from freqtrade.loggers import error_console from freqtrade.util.rich_progress import CustomProgress @@ -21,6 +20,8 @@ def get_progress_tracker(**kwargs) -> CustomProgress: """ Get progress Bar with custom columns. """ + from freqtrade.loggers import error_console + return CustomProgress( TextColumn("[progress.description]{task.description}"), BarColumn(bar_width=None), diff --git a/freqtrade/util/rich_tables.py b/freqtrade/util/rich_tables.py index ba232ed75..093c73584 100644 --- a/freqtrade/util/rich_tables.py +++ b/freqtrade/util/rich_tables.py @@ -1,12 +1,12 @@ -import sys from collections.abc import Sequence from typing import Any, TypeAlias from pandas import DataFrame -from rich.console import Console from rich.table import Column, Table from rich.text import Text +from freqtrade.loggers.rich_console import get_rich_console + TextOrString: TypeAlias = str | Text @@ -38,11 +38,7 @@ def print_rich_table( 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 - if any(module in ["pytest", "ipykernel"] for module in sys.modules): - width = 200 - - console = Console(width=width) + console = get_rich_console() console.print(table) @@ -74,9 +70,5 @@ def print_df_rich_table( row = [_format_value(x, floatfmt=".3f") for x in value_list] table.add_row(*row) - width = None - if any(module in ["pytest", "ipykernel"] for module in sys.modules): - width = 200 - - console = Console(width=width) + console = get_rich_console() console.print(table) diff --git a/freqtrade/vendor/qtpylib/indicators.py b/freqtrade/vendor/qtpylib/indicators.py index 5b56b2aa6..7c1aec5a4 100644 --- a/freqtrade/vendor/qtpylib/indicators.py +++ b/freqtrade/vendor/qtpylib/indicators.py @@ -32,7 +32,7 @@ warnings.simplefilter(action="ignore", category=RuntimeWarning) def numpy_rolling_window(data, window): shape = data.shape[:-1] + (data.shape[-1] - window + 1, window) - strides = data.strides + (data.strides[-1],) + strides = (*data.strides, data.strides[-1]) return np.lib.stride_tricks.as_strided(data, shape=shape, strides=strides) diff --git a/freqtrade/wallets.py b/freqtrade/wallets.py index c77b27147..cb0887415 100644 --- a/freqtrade/wallets.py +++ b/freqtrade/wallets.py @@ -197,7 +197,7 @@ class Wallets: # Position is not open ... continue size = self._exchange._contracts_to_amount(symbol, position["contracts"]) - collateral = safe_value_fallback(position, "collateral", "initialMargin", 0.0) + collateral = safe_value_fallback(position, "initialMargin", "collateral", 0.0) leverage = position.get("leverage") _parsed_positions[symbol] = PositionWallet( symbol, diff --git a/freqtrade/worker.py b/freqtrade/worker.py index 61d5d9a64..8b754ddc3 100644 --- a/freqtrade/worker.py +++ b/freqtrade/worker.py @@ -96,7 +96,10 @@ class Worker: logger.info( f"Changing state{f' from {old_state.name}' if old_state else ''} to: {state.name}" ) - if state == State.RUNNING: + if state in (State.RUNNING, State.PAUSED) and old_state not in ( + State.RUNNING, + State.PAUSED, + ): self.freqtrade.startup() if state == State.STOPPED: @@ -112,9 +115,10 @@ class Worker: self._throttle(func=self._process_stopped, throttle_secs=self._throttle_secs) - elif state == State.RUNNING: + elif state in (State.RUNNING, State.PAUSED): + state_str = "RUNNING" if state == State.RUNNING else "PAUSED" # Ping systemd watchdog before throttling - self._notify("WATCHDOG=1\nSTATUS=State: RUNNING.") + self._notify(f"WATCHDOG=1\nSTATUS=State: {state_str}.") # Use an offset of 1s to ensure a new candle has been issued self._throttle( @@ -221,7 +225,7 @@ class Worker: # Load and validate config and create new instance of the bot self._init(True) - self.freqtrade.notify_status("config reloaded") + self.freqtrade.notify_status(f"{State(self.freqtrade.state)} after config reloaded") # Tell systemd that we completed reconfiguration self._notify("READY=1") diff --git a/ft_client/freqtrade_client/__init__.py b/ft_client/freqtrade_client/__init__.py index 17ecee98b..d708ab2fb 100644 --- a/ft_client/freqtrade_client/__init__.py +++ b/ft_client/freqtrade_client/__init__.py @@ -1,13 +1,13 @@ from freqtrade_client.ft_rest_client import FtRestClient -__version__ = "2025.2-dev" +__version__ = "2025.5-dev" if "dev" in __version__: from pathlib import Path try: - import subprocess # noqa: S404 + import subprocess # noqa: S404, RUF100 freqtrade_basedir = Path(__file__).parent diff --git a/ft_client/freqtrade_client/ft_rest_client.py b/ft_client/freqtrade_client/ft_rest_client.py index 851583ee0..c3be342f5 100755 --- a/ft_client/freqtrade_client/ft_rest_client.py +++ b/ft_client/freqtrade_client/ft_rest_client.py @@ -23,10 +23,18 @@ PostDataT = dict[str, Any] | list[dict[str, Any]] | None class FtRestClient: def __init__( - self, serverurl, username=None, password=None, *, pool_connections=10, pool_maxsize=10 + self, + serverurl, + username=None, + password=None, + *, + pool_connections=10, + pool_maxsize=10, + timeout=10, ): self._serverurl = serverurl self._session = requests.Session() + self._timeout = timeout # allow configuration of pool adapter = HTTPAdapter(pool_connections=pool_connections, pool_maxsize=pool_maxsize) @@ -50,7 +58,9 @@ class FtRestClient: url = urlunparse((schema, netloc, path, par, query, fragment)) try: - resp = self._session.request(method, url, headers=hd, data=json.dumps(data)) + resp = self._session.request( + method, url, headers=hd, timeout=self._timeout, data=json.dumps(data) + ) # return resp.text return resp.json() except RequestConnectionError: @@ -245,11 +255,12 @@ class FtRestClient: """ return self._get("logs", params={"limit": limit} if limit else {}) - def trades(self, limit=None, offset=None): - """Return trades history, sorted by id + def trades(self, limit=None, offset=None, order_by_id=True): + """Return trades history, sorted by id (or by latest timestamp if order_by_id=False) :param limit: Limits trades to the X last trades. Max 500 trades. :param offset: Offset by this amount of trades. + :param order_by_id: Sort trades by id (default: True). If False, sorts by latest timestamp. :return: json object """ params = {} @@ -257,8 +268,40 @@ class FtRestClient: params["limit"] = limit if offset: params["offset"] = offset + if order_by_id: + params["order_by_id"] = True return self._get("trades", params) + def list_open_trades_custom_data(self, key=None, limit=100, offset=0): + """List open trades custom-data of the running bot. + + :param key: str, optional - Key of the custom-data + :param limit: limit of trades + :param offset: trades offset for pagination + :return: json object + """ + params = {} + params["limit"] = limit + params["offset"] = offset + if key is not None: + params["key"] = key + + return self._get("trades/open/custom-data", params=params) + + def list_custom_data(self, trade_id, key=None): + """List custom-data of the running bot for a specific trade. + + :param trade_id: ID of the trade + :param key: str, optional - Key of the custom-data + :return: JSON object + """ + params = {} + params["trade_id"] = trade_id + if key is not None: + params["key"] = key + + return self._get(f"trades/{trade_id}/custom-data", params=params) + def trade(self, trade_id): """Return specific trade diff --git a/ft_client/test_client/test_rest_client.py b/ft_client/test_client/test_rest_client.py index c1af6ded2..9d5e484aa 100644 --- a/ft_client/test_client/test_rest_client.py +++ b/ft_client/test_client/test_rest_client.py @@ -85,6 +85,8 @@ def test_FtRestClient_call_invalid(caplog): ("trades", [], {}), ("trades", [5], {}), ("trades", [5, 5], {}), # With offset + ("trades", [5, 5, True], {}), # Explicit order_by_id=True + ("trades", [5, 5, False], {}), # order_by_id=False ("trade", [1], {}), ("delete_trade", [1], {}), ("cancel_open_order", [1], {}), @@ -127,6 +129,10 @@ def test_FtRestClient_call_invalid(caplog): ("pair_candles", ["XRP/USDT", "5m", 500], {"columns": ["close_time,close"]}), ("pair_history", ["XRP/USDT", "5m", "SampleStrategy"], {}), ("pair_history", ["XRP/USDT", "5m"], {"strategy": "SampleStrategy"}), + ("trades", [], {"order_by_id": True}), + ("trades", [], {"order_by_id": False}), + ("trades", [5], {"order_by_id": False}), + ("trades", [5, 5], {"order_by_id": True}), ("sysinfo", [], {}), ("health", [], {}), ], diff --git a/pyproject.toml b/pyproject.toml index 9e877e8eb..98d2a6cbd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,7 @@ classifiers = [ dependencies = [ # from requirements.txt - "ccxt>=4.3.24", + "ccxt>=4.4.60", "SQLAlchemy>=2.0.6", "python-telegram-bot>=20.1", "humanize>=4.0.0", @@ -264,7 +264,7 @@ extend-select = [ # "RSE", # flake8-raise # "TCH", # flake8-type-checking "PTH", # flake8-use-pathlib - # "RUF", # ruff + "RUF", # ruff "ASYNC", # flake8-async "NPY", # numpy ] @@ -279,6 +279,9 @@ extend-ignore = [ "S607", # Starting a process with a partial executable path "S608", # Possible SQL injection vector through string-based query construction "NPY002", # Numpy legacy random generator + "RUF010", # Use explicit conversion flag + "RUF012", # mutable-class-default + "RUF022", # unsorted-dunder-all ] [tool.ruff.lint.mccabe] @@ -287,10 +290,8 @@ max-complexity = 12 [tool.ruff.lint.per-file-ignores] "freqtrade/freqai/**/*.py" = [ "S311", # Standard pseudo-random generators are not suitable for cryptographic purposes - "B006", # Bugbear - mutable default argument - "B008", # bugbear - Do not perform function calls in argument defaults ] -"tests/**/*.py" = [ +"tests/**.py" = [ "S101", # allow assert in tests "S104", # Possible binding to all interfaces "S311", # Standard pseudo-random generators are not suitable for cryptographic purposes @@ -299,7 +300,11 @@ max-complexity = 12 "S110", # `try`-`except`-`pass` detected, consider logging the exception ] -"ft_client/test_client/**/*.py" = [ +"freqtrade/templates/**.py" = [ + "RUF100", # Allow unused noqa +] + +"ft_client/test_client/**.py" = [ "S101", # allow assert in tests ] diff --git a/requirements-dev.txt b/requirements-dev.txt index 2ca65ef91..9d978d667 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -7,17 +7,17 @@ -r docs/requirements-docs.txt coveralls==4.0.1 -ruff==0.9.5 -mypy==1.14.1 -pre-commit==4.1.0 -pytest==8.3.4 -pytest-asyncio==0.25.3 -pytest-cov==6.0.0 +ruff==0.11.7 +mypy==1.15.0 +pre-commit==4.2.0 +pytest==8.3.5 +pytest-asyncio==0.26.0 +pytest-cov==6.1.1 pytest-mock==3.14.0 pytest-random-order==1.1.1 pytest-timeout==2.3.1 pytest-xdist==3.6.1 -isort==6.0.0 +isort==6.0.1 # For datetime mocking time-machine==2.16.0 @@ -27,6 +27,6 @@ nbconvert==7.16.6 # mypy types types-cachetools==5.5.0.20240820 types-filelock==3.2.7 -types-requests==2.32.0.20241016 +types-requests==2.32.0.20250328 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 413feec8f..61333c6f9 100644 --- a/requirements-freqai-rl.txt +++ b/requirements-freqai-rl.txt @@ -2,8 +2,7 @@ -r requirements-freqai.txt # Required for freqai-rl -torch==2.2.2; sys_platform == 'darwin' and platform_machine == 'x86_64' -torch==2.6.0; sys_platform != 'darwin' or platform_machine != 'x86_64' +torch==2.7.0; sys_platform != 'darwin' or platform_machine != 'x86_64' gymnasium==0.29.1 # SB3 >=2.5.0 depends on torch 2.3.0 - which implies it dropped support x86 macos stable_baselines3==2.4.1; sys_platform == 'darwin' and platform_machine == 'x86_64' diff --git a/requirements-freqai.txt b/requirements-freqai.txt index c978b63cb..928c83bdb 100644 --- a/requirements-freqai.txt +++ b/requirements-freqai.txt @@ -5,8 +5,8 @@ # Required for freqai scikit-learn==1.6.1 joblib==1.4.2 -catboost==1.2.7; 'arm' not in platform_machine -lightgbm==4.5.0 +catboost==1.2.8; 'arm' not in platform_machine +lightgbm==4.6.0 xgboost==2.1.4 -tensorboard==2.18.0 +tensorboard==2.19.0 datasieve==0.1.7 diff --git a/requirements-hyperopt.txt b/requirements-hyperopt.txt index 6d193bdc7..2a326d654 100644 --- a/requirements-hyperopt.txt +++ b/requirements-hyperopt.txt @@ -2,7 +2,7 @@ -r requirements.txt # Required for hyperopt -scipy==1.15.1 +scipy==1.15.2 scikit-learn==1.6.1 ft-scikit-optimize==0.9.2 -filelock==3.17.0 +filelock==3.18.0 diff --git a/requirements-plot.txt b/requirements-plot.txt index 16a162600..f3d27df41 100644 --- a/requirements-plot.txt +++ b/requirements-plot.txt @@ -1,4 +1,4 @@ # Include all requirements to run the bot. -r requirements.txt -plotly==6.0.0 +plotly==6.0.1 diff --git a/requirements.txt b/requirements.txt index 6f94ba68a..62aa2a80a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,27 +4,27 @@ bottleneck==1.4.2 numexpr==2.10.2 pandas-ta==0.3.14b -ccxt==4.4.52 -cryptography==42.0.8; platform_machine == 'armv7l' -cryptography==44.0.0; platform_machine != 'armv7l' +ccxt==4.4.77 +cryptography==44.0.2 aiohttp==3.9.5 -SQLAlchemy==2.0.37 -python-telegram-bot==21.10 +SQLAlchemy==2.0.40 +python-telegram-bot==22.0 # can't be hard-pinned due to telegram-bot pinning httpx with ~ httpx>=0.24.1 -humanize==4.11.0 -cachetools==5.5.1 +humanize==4.12.2 +cachetools==5.5.2 requests==2.32.3 -urllib3==2.3.0 +urllib3==2.4.0 +certifi==2025.01.31 jsonschema==4.23.0 -TA-Lib==0.4.34 +TA-Lib==0.4.38 technical==1.5.0 tabulate==0.9.0 pycoingecko==3.2.0 -jinja2==3.1.5 +jinja2==3.1.6 joblib==1.4.2 -rich==13.9.4 -pyarrow==19.0.0; platform_machine != 'armv7l' +rich==14.0.0 +pyarrow==20.0.0; platform_machine != 'armv7l' # find first, C search in arrays py_find_1st==1.1.7 @@ -32,32 +32,32 @@ py_find_1st==1.1.7 # Load ticker files 30% faster python-rapidjson==1.20 # Properly format api responses -orjson==3.10.15 +orjson==3.10.16 # Notify systemd sdnotify==0.3.2 # API Server -fastapi==0.115.8 -pydantic==2.10.6 -uvicorn==0.34.0 +fastapi==0.115.12 +pydantic==2.11.3 +uvicorn==0.34.2 pyjwt==2.10.1 aiofiles==24.1.0 -psutil==6.1.1 +psutil==7.0.0 # Building config files interactively questionary==2.1.0 -prompt-toolkit==3.0.50 +prompt-toolkit==3.0.51 # Extensions to datetime library python-dateutil==2.9.0.post0 -pytz==2025.1 +pytz==2025.2 #Futures schedule==1.2.2 #WS Messages -websockets==14.2 +websockets==15.0.1 janus==2.0.0 ast-comments==1.2.2 -packaging==24.2 +packaging==25.0 diff --git a/tests/commands/test_commands.py b/tests/commands/test_commands.py index 65a43b795..9dd5ffebc 100644 --- a/tests/commands/test_commands.py +++ b/tests/commands/test_commands.py @@ -709,18 +709,38 @@ def test_download_and_install_ui(mocker, tmp_path): def test_get_ui_download_url(mocker): response = MagicMock() - response.json = MagicMock( - side_effect=[ - [{"assets_url": "http://whatever.json", "name": "0.0.1"}], - [{"browser_download_url": "http://download.zip"}], - ] - ) + responses = [ + [ + { + # Pre-release is ignored + "assets_url": "http://whatever.json", + "name": "0.0.2", + "created_at": "2024-02-01T00:00:00Z", + "prerelease": True, + }, + { + "assets_url": "http://whatever.json", + "name": "0.0.1", + "created_at": "2024-01-01T00:00:00Z", + "prerelease": False, + }, + ], + [{"browser_download_url": "http://download.zip"}], + ] + response.json = MagicMock(side_effect=responses) get_mock = mocker.patch("freqtrade.commands.deploy_ui.requests.get", return_value=response) - x, last_version = get_ui_download_url() + x, last_version = get_ui_download_url(None, False) assert get_mock.call_count == 2 assert last_version == "0.0.1" assert x == "http://download.zip" + response.json = MagicMock(side_effect=responses) + get_mock.reset_mock() + x, last_version = get_ui_download_url(None, True) + assert get_mock.call_count == 2 + assert last_version == "0.0.2" + assert x == "http://download.zip" + def test_get_ui_download_url_direct(mocker): response = MagicMock() @@ -729,29 +749,33 @@ def test_get_ui_download_url_direct(mocker): { "assets_url": "http://whatever.json", "name": "0.0.2", + "created_at": "2024-02-01T00:00:00Z", + "prerelease": False, "assets": [{"browser_download_url": "http://download22.zip"}], }, { "assets_url": "http://whatever.json", "name": "0.0.1", + "created_at": "2024-01-01T00:00:00Z", + "prerelease": False, "assets": [{"browser_download_url": "http://download1.zip"}], }, ] ) get_mock = mocker.patch("freqtrade.commands.deploy_ui.requests.get", return_value=response) - x, last_version = get_ui_download_url() + x, last_version = get_ui_download_url(None, False) assert get_mock.call_count == 1 assert last_version == "0.0.2" assert x == "http://download22.zip" get_mock.reset_mock() response.json.reset_mock() - x, last_version = get_ui_download_url("0.0.1") + x, last_version = get_ui_download_url("0.0.1", False) assert last_version == "0.0.1" assert x == "http://download1.zip" with pytest.raises(ValueError, match="UI-Version not found."): - x, last_version = get_ui_download_url("0.0.3") + x, last_version = get_ui_download_url("0.0.3", False) def test_download_data_keyboardInterrupt(mocker, markets): diff --git a/tests/commands/test_startup_time.py b/tests/commands/test_startup_time.py index 08856a636..62baab20a 100644 --- a/tests/commands/test_startup_time.py +++ b/tests/commands/test_startup_time.py @@ -1,8 +1,10 @@ -import subprocess +import subprocess # noqa: S404, RUF100 import time +from tests.conftest import is_arm, is_mac -MAXIMUM_STARTUP_TIME = 0.5 + +MAXIMUM_STARTUP_TIME = 0.7 if is_mac() and not is_arm() else 0.5 def test_startup_time(): @@ -14,4 +16,5 @@ def test_startup_time(): elapsed = time.time() - start assert elapsed < MAXIMUM_STARTUP_TIME, ( "The startup time is too long, try to use lazy import in the command entry function" + f" (maximum {MAXIMUM_STARTUP_TIME}s, got {elapsed}s)" ) diff --git a/tests/conftest.py b/tests/conftest.py index ca382f6ae..892b49d8c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -48,7 +48,7 @@ from tests.conftest_trades_usdt import ( logging.getLogger("").setLevel(logging.INFO) -# Do not mask numpy errors as warnings that no one read, raise the exсeption +# Do not mask numpy errors as warnings that no one read, raise the exception np.seterr(all="raise") CURRENT_TEST_STRATEGY = "StrategyTestV3" @@ -165,7 +165,7 @@ def generate_trades_history(n_rows, start_date: datetime | None = None, days=5): ) df["date"] = pd.to_datetime(df["timestamp"], unit="ms", utc=True) df = df.sort_values("timestamp").reset_index(drop=True) - assert list(df.columns) == constants.DEFAULT_TRADES_COLUMNS + ["date"] + assert list(df.columns) == [*constants.DEFAULT_TRADES_COLUMNS, "date"] return df @@ -549,6 +549,14 @@ def user_dir(mocker, tmp_path) -> Path: return user_dir +@pytest.fixture() +def keep_log_config_loggers(mocker): + # Mock the _handle_existing_loggers function to prevent it from disabling all loggers. + # This is necessary to keep all loggers active, and avoid random failures if + # this file is ran before the test_rest_client file. + mocker.patch("logging.config._handle_existing_loggers") + + @pytest.fixture(autouse=True) def patch_coingecko(mocker) -> None: """ @@ -644,6 +652,7 @@ def get_default_conf(testdatadir): "trading_mode": "spot", "margin_mode": "", "candle_type_def": CandleType.SPOT, + "original_config": {}, } return configuration diff --git a/tests/conftest_hyperopt.py b/tests/conftest_hyperopt.py index 315b138cf..3b9638bad 100644 --- a/tests/conftest_hyperopt.py +++ b/tests/conftest_hyperopt.py @@ -34,7 +34,7 @@ def hyperopt_test_result(): "roi_p2": 0.12508730043628782, "roi_p3": 0.27766427921605896, "stoploss": -0.2562930402099556, - }, # noqa: E501 + }, "params_details": { "buy": { "mfi-value": 15, @@ -65,7 +65,7 @@ def hyperopt_test_result(): 2139: 0, }, "stoploss": {"stoploss": -0.2562930402099556}, - }, # noqa: E501 + }, "results_metrics": { "total_trades": 2, "trade_count_long": 2, @@ -82,7 +82,7 @@ def hyperopt_test_result(): "holding_avg": timedelta(minutes=3930.0), "stake_currency": "BTC", "strategy_name": "SampleStrategy", - }, # noqa: E501 + }, "results_explanation": " 2 trades. Avg profit -1.25%. Total profit -0.00125625 BTC ( -2.51Σ%). Avg duration 3930.0 min.", # noqa: E501 "total_profit": -0.00125625, "current_epoch": 1, @@ -118,7 +118,7 @@ def hyperopt_test_result(): "roi_p2": 0.055519840060645045, "roi_p3": 0.3253712811342459, "stoploss": -0.338070047333259, - }, # noqa: E501 + }, "params_details": { "buy": { "mfi-value": 17, @@ -130,7 +130,7 @@ def hyperopt_test_result(): "adx-enabled": True, "rsi-enabled": True, "trigger": "macd_cross_signal", - }, # noqa: E501 + }, "sell": { "sell-mfi-value": 96, "sell-fastd-value": 68, @@ -141,13 +141,13 @@ def hyperopt_test_result(): "sell-adx-enabled": True, "sell-rsi-enabled": True, "sell-trigger": "sell-sar_reversal", - }, # noqa: E501 + }, "roi": { 0: 0.4449309386008759, 140: 0.11955965746663, 823: 0.06403981740598495, 1157: 0, - }, # noqa: E501 + }, "stoploss": {"stoploss": -0.338070047333259}, }, "results_metrics": { @@ -164,7 +164,7 @@ def hyperopt_test_result(): "max_drawdown_account": 0.23, "max_drawdown_abs": -0.00125625, "holding_avg": timedelta(minutes=1200.0), - }, # noqa: E501 + }, "results_explanation": " 1 trades. Avg profit 0.12%. Total profit 0.00006185 BTC ( 0.12Σ%). Avg duration 1200.0 min.", # noqa: E501 "total_profit": 6.185e-05, "current_epoch": 2, @@ -200,7 +200,7 @@ def hyperopt_test_result(): "roi_p2": 0.1488819964638463, "roi_p3": 0.4102801822104605, "stoploss": -0.05394588767607611, - }, # noqa: E501 + }, "params_details": { "buy": { "mfi-value": 25, @@ -231,7 +231,7 @@ def hyperopt_test_result(): 1685: 0, }, "stoploss": {"stoploss": -0.05394588767607611}, - }, # noqa: E501 + }, "results_metrics": { "total_trades": 621, "trade_count_long": 621, @@ -246,7 +246,7 @@ def hyperopt_test_result(): "max_drawdown_account": 0.25, "max_drawdown_abs": -272.515306, "holding_avg": timedelta(minutes=1691.207729468599), - }, # noqa: E501 + }, "results_explanation": " 621 trades. Avg profit -0.44%. Total profit -0.13639474 BTC (-272.52Σ%). Avg duration 1691.2 min.", # noqa: E501 "total_profit": -0.13639474, "current_epoch": 3, @@ -282,7 +282,7 @@ def hyperopt_test_result(): "roi_p2": 0.14258587851894644, "roi_p3": 0.20671291201040828, "stoploss": -0.11818343570194478, - }, # noqa: E501 + }, "params_details": { "buy": { "mfi-value": 13, @@ -313,7 +313,7 @@ def hyperopt_test_result(): 2293: 0, }, "stoploss": {"stoploss": -0.11818343570194478}, - }, # noqa: E501 + }, "results_metrics": { "total_trades": 0, "trade_count_long": 0, @@ -327,13 +327,13 @@ def hyperopt_test_result(): "max_drawdown_account": 0.0, "max_drawdown_abs": 0.0, "holding_avg": timedelta(), - }, # noqa: E501 + }, "results_explanation": " 0 trades. Avg profit nan%. Total profit 0.00000000 BTC ( 0.00Σ%). Avg duration nan min.", # noqa: E501 "total_profit": 0, "current_epoch": 4, "is_initial_point": True, "is_random": False, - "is_best": False, # noqa: E501 + "is_best": False, }, { "loss": 0.22195522184191518, @@ -363,7 +363,7 @@ def hyperopt_test_result(): "roi_p2": 0.08946698095898986, "roi_p3": 0.1454876733325284, "stoploss": -0.18181041180901014, - }, # noqa: E501 + }, "params_details": { "buy": { "mfi-value": 17, @@ -394,7 +394,7 @@ def hyperopt_test_result(): 2314: 0, }, "stoploss": {"stoploss": -0.18181041180901014}, - }, # noqa: E501 + }, "results_metrics": { "total_trades": 14, "trade_count_long": 14, @@ -409,7 +409,7 @@ def hyperopt_test_result(): "max_drawdown_account": 0.34, "max_drawdown_abs": -4.955321, "holding_avg": timedelta(minutes=3402.8571428571427), - }, # noqa: E501 + }, "results_explanation": " 14 trades. Avg profit -0.35%. Total profit -0.00248014 BTC ( -4.96Σ%). Avg duration 3402.9 min.", # noqa: E501 "total_profit": -0.002480140000000001, "current_epoch": 5, @@ -445,7 +445,7 @@ def hyperopt_test_result(): "roi_p2": 0.11659519602202795, "roi_p3": 0.0953744132197762, "stoploss": -0.024551752215582423, - }, # noqa: E501 + }, "params_details": { "buy": { "mfi-value": 22, @@ -476,7 +476,7 @@ def hyperopt_test_result(): 1091: 0, }, "stoploss": {"stoploss": -0.024551752215582423}, - }, # noqa: E501 + }, "results_metrics": { "total_trades": 39, "trade_count_long": 39, @@ -491,7 +491,7 @@ def hyperopt_test_result(): "max_drawdown_account": 0.45, "max_drawdown_abs": -4.955321, "holding_avg": timedelta(minutes=636.9230769230769), - }, # noqa: E501 + }, "results_explanation": " 39 trades. Avg profit -0.21%. Total profit -0.00417730 BTC ( -8.35Σ%). Avg duration 636.9 min.", # noqa: E501 "total_profit": -0.0041773, "current_epoch": 6, @@ -527,7 +527,7 @@ def hyperopt_test_result(): "roi_p2": 0.04984118697312542, "roi_p3": 0.37521058680247044, "stoploss": -0.14613268022709905, - }, # noqa: E501 + }, "params_details": { "buy": { "mfi-value": 13, @@ -556,9 +556,9 @@ def hyperopt_test_result(): 145: 0.10853310701097472, 765: 0.0586919200378493, 1536: 0, - }, # noqa: E501 + }, "stoploss": {"stoploss": -0.14613268022709905}, - }, # noqa: E501 + }, "results_metrics": { "total_trades": 318, "trade_count_long": 318, @@ -573,7 +573,7 @@ def hyperopt_test_result(): "max_drawdown_account": 0.50, "max_drawdown_abs": -200.955321, "holding_avg": timedelta(minutes=3140.377358490566), - }, # noqa: E501 + }, "results_explanation": " 318 trades. Avg profit -0.40%. Total profit -0.06339929 BTC (-126.67Σ%). Avg duration 3140.4 min.", # noqa: E501 "total_profit": -0.06339929, "current_epoch": 7, @@ -582,7 +582,7 @@ def hyperopt_test_result(): "is_best": False, }, { - "loss": 20.0, # noqa: E501 + "loss": 20.0, "params_dict": { "mfi-value": 24, "fastd-value": 43, @@ -609,7 +609,7 @@ def hyperopt_test_result(): "roi_p2": 0.0606240398618907, "roi_p3": 0.1729012220156157, "stoploss": -0.1588514289110401, - }, # noqa: E501 + }, "params_details": { "buy": { "mfi-value": 24, @@ -640,7 +640,7 @@ def hyperopt_test_result(): 1813: 0, }, "stoploss": {"stoploss": -0.1588514289110401}, - }, # noqa: E501 + }, "results_metrics": { "total_trades": 1, "trade_count_long": 1, @@ -655,7 +655,7 @@ def hyperopt_test_result(): "max_drawdown_account": 0.0, "max_drawdown_abs": 0.52, "holding_avg": timedelta(minutes=5340.0), - }, # noqa: E501 + }, "results_explanation": " 1 trades. Avg profit 0.00%. Total profit 0.00000000 BTC ( 0.00Σ%). Avg duration 5340.0 min.", # noqa: E501 "total_profit": 0.0, "current_epoch": 8, @@ -691,7 +691,7 @@ def hyperopt_test_result(): "roi_p2": 0.10335480573205287, "roi_p3": 0.10322347377503042, "stoploss": -0.2780610808108503, - }, # noqa: E501 + }, "params_details": { "buy": { "mfi-value": 22, @@ -722,7 +722,7 @@ def hyperopt_test_result(): 2018: 0, }, "stoploss": {"stoploss": -0.2780610808108503}, - }, # noqa: E501 + }, "results_metrics": { "total_trades": 229, "trade_count_long": 229, @@ -737,16 +737,16 @@ def hyperopt_test_result(): "max_drawdown_account": 0.41, "max_drawdown_abs": -150.955321, "holding_avg": timedelta(minutes=6505.676855895196), - }, # noqa: E501 + }, "results_explanation": " 229 trades. Avg profit -0.38%. Total profit -0.04405007 BTC ( -88.01Σ%). Avg duration 6505.7 min.", # noqa: E501 - "total_profit": -0.044050070000000004, # noqa: E501 + "total_profit": -0.044050070000000004, "current_epoch": 9, "is_initial_point": True, "is_random": False, "is_best": False, }, { - "loss": -0.2604606005845212, # noqa: E501 + "loss": -0.2604606005845212, "params_dict": { "mfi-value": 23, "fastd-value": 24, @@ -773,7 +773,7 @@ def hyperopt_test_result(): "roi_p2": 0.09623192684243963, "roi_p3": 0.04428219070850663, "stoploss": -0.16992287161634415, - }, # noqa: E501 + }, "params_details": { "buy": { "mfi-value": 23, @@ -804,7 +804,7 @@ def hyperopt_test_result(): 1471: 0, }, "stoploss": {"stoploss": -0.16992287161634415}, - }, # noqa: E501 + }, "results_metrics": { "total_trades": 4, "trade_count_long": 4, @@ -819,7 +819,7 @@ def hyperopt_test_result(): "max_drawdown_account": 0.13, "max_drawdown_abs": -4.955321, "holding_avg": timedelta(minutes=2850.0), - }, # noqa: E501 + }, "results_explanation": " 4 trades. Avg profit 0.11%. Total profit 0.00021629 BTC ( 0.43Σ%). Avg duration 2850.0 min.", # noqa: E501 "total_profit": 0.00021629, "current_epoch": 10, @@ -828,7 +828,7 @@ def hyperopt_test_result(): "is_best": True, }, { - "loss": 4.876465945994304, # noqa: E501 + "loss": 4.876465945994304, "params_dict": { "mfi-value": 20, "fastd-value": 32, @@ -855,7 +855,7 @@ def hyperopt_test_result(): "roi_p2": 0.1352282078262871, "roi_p3": 0.1913307406325751, "stoploss": -0.25728526022513887, - }, # noqa: E501 + }, "params_details": { "buy": { "mfi-value": 20, @@ -886,7 +886,7 @@ def hyperopt_test_result(): 1466: 0, }, "stoploss": {"stoploss": -0.25728526022513887}, - }, # noqa: E501 + }, # New Hyperopt mode! "results_metrics": { "total_trades": 117, @@ -902,7 +902,7 @@ def hyperopt_test_result(): "max_drawdown_account": 0.52, "max_drawdown_abs": -224.955321, "holding_avg": timedelta(minutes=4282.5641025641025), - }, # noqa: E501 + }, "results_explanation": " 117 trades. Avg profit -1.27%. Total profit -0.07436117 BTC (-148.57Σ%). Avg duration 4282.6 min.", # noqa: E501 "total_profit": -0.07436117, "current_epoch": 11, @@ -938,7 +938,7 @@ def hyperopt_test_result(): "roi_p2": 0.12473718444931989, "roi_p3": 0.2896360635226823, "stoploss": -0.30889015124682806, - }, # noqa: E501 + }, "params_details": { "buy": { "mfi-value": 10, @@ -969,7 +969,7 @@ def hyperopt_test_result(): 2145: 0, }, "stoploss": {"stoploss": -0.30889015124682806}, - }, # noqa: E501 + }, "results_metrics": { "total_trades": 0, "trade_count_long": 0, @@ -984,7 +984,7 @@ def hyperopt_test_result(): "max_drawdown_account": 0.0, "max_drawdown_abs": 0.0, "holding_avg": timedelta(), - }, # noqa: E501 + }, "results_explanation": " 0 trades. Avg profit nan%. Total profit 0.00000000 BTC ( 0.00Σ%). Avg duration nan min.", # noqa: E501 "total_profit": 0, "current_epoch": 12, diff --git a/tests/data/test_btanalysis.py b/tests/data/test_btanalysis.py index 1c901bc16..6531c6e2e 100644 --- a/tests/data/test_btanalysis.py +++ b/tests/data/test_btanalysis.py @@ -30,6 +30,7 @@ from freqtrade.data.metrics import ( calculate_max_drawdown, calculate_sharpe, calculate_sortino, + calculate_sqn, calculate_underwater, combine_dataframes_with_mean, combined_dataframes_with_rel_mean, @@ -55,7 +56,7 @@ def test_get_latest_backtest_filename(testdatadir, mocker): res = get_latest_backtest_filename(str(testdir_bt)) assert res == "backtest-result.json" - mocker.patch("freqtrade.data.btanalysis.json_load", return_value={}) + mocker.patch("freqtrade.data.btanalysis.bt_fileutils.json_load", return_value={}) with pytest.raises(ValueError, match=r"Invalid '.last_result.json' format."): get_latest_backtest_filename(testdir_bt) @@ -83,8 +84,8 @@ def test_load_backtest_metadata(mocker, testdatadir): res = load_backtest_metadata(testdatadir / "nonexistent.file.json") assert res == {} - mocker.patch("freqtrade.data.btanalysis.get_backtest_metadata_filename") - mocker.patch("freqtrade.data.btanalysis.json_load", side_effect=Exception()) + mocker.patch("freqtrade.data.btanalysis.bt_fileutils.get_backtest_metadata_filename") + mocker.patch("freqtrade.data.btanalysis.bt_fileutils.json_load", side_effect=Exception()) with pytest.raises( OperationalException, match=r"Unexpected error.*loading backtest metadata\." ): @@ -93,7 +94,7 @@ def test_load_backtest_metadata(mocker, testdatadir): def test_load_backtest_data_old_format(testdatadir, mocker): filename = testdatadir / "backtest-result_test222.json" - mocker.patch("freqtrade.data.btanalysis.load_backtest_stats", return_value=[]) + mocker.patch("freqtrade.data.btanalysis.bt_fileutils.load_backtest_stats", return_value=[]) with pytest.raises( OperationalException, @@ -148,7 +149,7 @@ def test_load_backtest_data_multi(testdatadir): def test_load_trades_from_db(default_conf, fee, is_short, mocker): create_mock_trades(fee, is_short) # remove init so it does not init again - init_mock = mocker.patch("freqtrade.data.btanalysis.init_db", MagicMock()) + init_mock = mocker.patch("freqtrade.data.btanalysis.bt_fileutils.init_db", MagicMock()) trades = load_trades_from_db(db_url=default_conf["db_url"]) assert init_mock.call_count == 1 @@ -220,8 +221,10 @@ def test_analyze_trade_parallelism(testdatadir): def test_load_trades(default_conf, mocker): - db_mock = mocker.patch("freqtrade.data.btanalysis.load_trades_from_db", MagicMock()) - bt_mock = mocker.patch("freqtrade.data.btanalysis.load_backtest_data", MagicMock()) + db_mock = mocker.patch( + "freqtrade.data.btanalysis.bt_fileutils.load_trades_from_db", MagicMock() + ) + bt_mock = mocker.patch("freqtrade.data.btanalysis.bt_fileutils.load_backtest_data", MagicMock()) load_trades( "DB", @@ -267,6 +270,14 @@ def test_calculate_market_change(testdatadir): assert isinstance(result, float) assert pytest.approx(result) == 0.01100002 + result = calculate_market_change(data, min_date=dt_utc(2018, 1, 20)) + assert isinstance(result, float) + assert pytest.approx(result) == 0.0375149 + + # Move min-date after the last date + result = calculate_market_change(data, min_date=dt_utc(2018, 2, 20)) + assert pytest.approx(result) == 0.0 + def test_combine_dataframes_with_mean(testdatadir): pairs = ["ETH/BTC", "ADA/BTC"] @@ -457,6 +468,42 @@ def test_calculate_calmar(testdatadir): assert pytest.approx(calmar) == 559.040508 +def test_calculate_sqn(testdatadir): + filename = testdatadir / "backtest_results/backtest-result.json" + bt_data = load_backtest_data(filename) + + sqn = calculate_sqn(DataFrame(), 0) + assert sqn == 0.0 + + sqn = calculate_sqn( + bt_data, + 0.01, + ) + assert isinstance(sqn, float) + assert pytest.approx(sqn) == 3.2991 + + +@pytest.mark.parametrize( + "profits,starting_balance,expected_sqn,description", + [ + ([1.0, -0.5, 2.0, -1.0, 0.5, 1.5, -0.5, 1.0], 100, 1.3229, "Mixed profits/losses"), + ([], 100, 0.0, "Empty dataframe"), + ([1.0, 0.5, 2.0, 1.5, 0.8], 100, 4.3657, "All winning trades"), + ([-1.0, -0.5, -2.0, -1.5, -0.8], 100, -4.3657, "All losing trades"), + ([1.0], 100, -100, "Single trade"), + ], +) +def test_calculate_sqn_cases(profits, starting_balance, expected_sqn, description): + """ + Test SQN calculation with various scenarios: + """ + trades = DataFrame({"profit_abs": profits}) + sqn = calculate_sqn(trades, starting_balance=starting_balance) + + assert isinstance(sqn, float) + assert pytest.approx(sqn, rel=1e-4) == expected_sqn + + @pytest.mark.parametrize( "start,end,days, expected", [ @@ -525,14 +572,15 @@ def test_calculate_max_drawdown2(): assert pytest.approx(drawdown.relative_account_drawdown) == 0.32129575 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") + # No losing trade ... + drawdown = calculate_max_drawdown(df, date_col="open_date", value_col="profit") + assert drawdown.drawdown_abs == 0.0 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") - assert drawdown.drawdown_abs == 0.043965 + assert drawdown.drawdown_abs == 0.055545 @pytest.mark.parametrize( diff --git a/tests/data/test_dataprovider.py b/tests/data/test_dataprovider.py index bef894eff..c2adb84bb 100644 --- a/tests/data/test_dataprovider.py +++ b/tests/data/test_dataprovider.py @@ -408,20 +408,20 @@ def test_get_analyzed_dataframe(mocker, default_conf, ohlcv_history): # Test backtest mode default_conf["runmode"] = RunMode.BACKTEST - dp._set_dataframe_max_index(1) + dp._set_dataframe_max_index("XRP/BTC", 1) dataframe, time = dp.get_analyzed_dataframe("XRP/BTC", timeframe) assert len(dataframe) == 1 - dp._set_dataframe_max_index(2) + dp._set_dataframe_max_index("XRP/BTC", 2) dataframe, time = dp.get_analyzed_dataframe("XRP/BTC", timeframe) assert len(dataframe) == 2 - dp._set_dataframe_max_index(3) + dp._set_dataframe_max_index("XRP/BTC", 3) dataframe, time = dp.get_analyzed_dataframe("XRP/BTC", timeframe) assert len(dataframe) == 3 - dp._set_dataframe_max_index(500) + dp._set_dataframe_max_index("XRP/BTC", 500) dataframe, time = dp.get_analyzed_dataframe("XRP/BTC", timeframe) assert len(dataframe) == len(ohlcv_history) diff --git a/tests/data/test_entryexitanalysis.py b/tests/data/test_entryexitanalysis.py index 509c9b92c..63ac3c1a3 100644 --- a/tests/data/test_entryexitanalysis.py +++ b/tests/data/test_entryexitanalysis.py @@ -139,7 +139,7 @@ def test_backtest_analysis_on_entry_and_rejected_signals_nomock( # test group 0 and indicator list args = get_args( - base_args + ["--analysis-groups", "0", "--indicator-list", "close", "rsi", "profit_abs"] + [*base_args, "--analysis-groups", "0", "--indicator-list", "close", "rsi", "profit_abs"] ) start_analysis_entries_exits(args) captured = capsys.readouterr() @@ -172,7 +172,7 @@ def test_backtest_analysis_on_entry_and_rejected_signals_nomock( assert "profit_abs" in captured.out # test group 1 - args = get_args(base_args + ["--analysis-groups", "1"]) + args = get_args([*base_args, "--analysis-groups", "1"]) start_analysis_entries_exits(args) captured = capsys.readouterr() assert "enter_tag_long_a" in captured.out @@ -185,7 +185,7 @@ def test_backtest_analysis_on_entry_and_rejected_signals_nomock( assert "0" in captured.out # test group 2 - args = get_args(base_args + ["--analysis-groups", "2"]) + args = get_args([*base_args, "--analysis-groups", "2"]) start_analysis_entries_exits(args) captured = capsys.readouterr() assert "enter_tag_long_a" in captured.out @@ -200,7 +200,7 @@ def test_backtest_analysis_on_entry_and_rejected_signals_nomock( assert "2.5" in captured.out # test group 3 - args = get_args(base_args + ["--analysis-groups", "3"]) + args = get_args([*base_args, "--analysis-groups", "3"]) start_analysis_entries_exits(args) captured = capsys.readouterr() assert "LTC/BTC" in captured.out @@ -215,7 +215,7 @@ def test_backtest_analysis_on_entry_and_rejected_signals_nomock( assert "2" in captured.out # test group 4 - args = get_args(base_args + ["--analysis-groups", "4"]) + args = get_args([*base_args, "--analysis-groups", "4"]) start_analysis_entries_exits(args) captured = capsys.readouterr() assert "LTC/BTC" in captured.out @@ -235,7 +235,7 @@ def test_backtest_analysis_on_entry_and_rejected_signals_nomock( assert "2.5" in captured.out # test group 5 - args = get_args(base_args + ["--analysis-groups", "5"]) + args = get_args([*base_args, "--analysis-groups", "5"]) start_analysis_entries_exits(args) captured = capsys.readouterr() assert "exit_signal" in captured.out @@ -245,7 +245,7 @@ def test_backtest_analysis_on_entry_and_rejected_signals_nomock( # test date filtering args = get_args( - base_args + ["--analysis-groups", "0", "1", "2", "--timerange", "20180129-20180130"] + [*base_args, "--analysis-groups", "0", "1", "2", "--timerange", "20180129-20180130"] ) start_analysis_entries_exits(args) captured = capsys.readouterr() @@ -253,7 +253,7 @@ def test_backtest_analysis_on_entry_and_rejected_signals_nomock( assert "enter_tag_long_b" not in captured.out # Due to the backtest mock, there's no rejected signals generated. - args = get_args(base_args + ["--rejected-signals"]) + args = get_args([*base_args, "--rejected-signals"]) start_analysis_entries_exits(args) captured = capsys.readouterr() assert "no rejected signals" in captured.out @@ -379,8 +379,8 @@ def test_backtest_analysis_with_invalid_config( # test with both entry and exit only arguments args = get_args( - base_args - + [ + [ + *base_args, "--analysis-groups", "0", "--indicator-list", @@ -518,8 +518,8 @@ def test_backtest_analysis_on_entry_and_rejected_signals_only_entry_signals( # test group 0 and indicator list args = get_args( - base_args - + [ + [ + *base_args, "--analysis-groups", "0", "--indicator-list", diff --git a/tests/exchange/test_binance.py b/tests/exchange/test_binance.py index fc683e056..5241b3b69 100644 --- a/tests/exchange/test_binance.py +++ b/tests/exchange/test_binance.py @@ -6,6 +6,7 @@ import ccxt import pandas as pd import pytest +from freqtrade.data.converter.trade_converter import trades_dict_to_list from freqtrade.enums import CandleType, MarginMode, TradingMode from freqtrade.exceptions import DependencyException, InvalidOrderException, OperationalException from freqtrade.exchange.exchange_utils_timeframe import timeframe_to_seconds @@ -298,7 +299,7 @@ def test_liquidation_price_binance( def get_maint_ratio(pair_, stake_amount): if pair_ != pair: - oc = [c for c in open_trades if c["pair"] == pair_][0] + oc = next(c for c in open_trades if c["pair"] == pair_) return oc["mm_ratio"], oc["maintenance_amt"] return mm_ratio, maintenance_amt @@ -1002,6 +1003,7 @@ def test_get_maintenance_ratio_and_amt_binance( async def test__async_get_trade_history_id_binance(default_conf_usdt, mocker, fetch_trades_result): + default_conf_usdt["exchange"]["only_from_ccxt"] = True exchange = get_patched_exchange(mocker, default_conf_usdt, exchange="binance") async def mock_get_trade_hist(pair, *args, **kwargs): @@ -1056,3 +1058,53 @@ async def test__async_get_trade_history_id_binance(default_conf_usdt, mocker, fe # Clean up event loop to avoid warnings exchange.close() + + +async def test__async_get_trade_history_id_binance_fast( + default_conf_usdt, mocker, fetch_trades_result +): + default_conf_usdt["exchange"]["only_from_ccxt"] = False + exchange = get_patched_exchange(mocker, default_conf_usdt, exchange="binance") + + async def mock_get_trade_hist(pair, *args, **kwargs): + if "since" in kwargs: + pass + # 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:] + + pair = "ETH/BTC" + mocker.patch( + "freqtrade.exchange.binance.download_archive_trades", + return_value=(pair, trades_dict_to_list(fetch_trades_result[-2:])), + ) + + exchange._api_async.fetch_trades = MagicMock(side_effect=mock_get_trade_hist) + + ret = await exchange._async_get_trade_history( + pair, + since=fetch_trades_result[0]["timestamp"], + until=fetch_trades_result[-1]["timestamp"] - 1, + ) + + assert ret[0] == pair + assert isinstance(ret[1], list) + + # Clean up event loop to avoid warnings + exchange.close() diff --git a/tests/exchange/test_binance_public_data.py b/tests/exchange/test_binance_public_data.py index 655a0c874..ab299321b 100644 --- a/tests/exchange/test_binance_public_data.py +++ b/tests/exchange/test_binance_public_data.py @@ -14,11 +14,15 @@ from freqtrade.enums import CandleType from freqtrade.exchange.binance_public_data import ( BadHttpStatus, Http404, + binance_vision_trades_zip_url, binance_vision_zip_name, download_archive_ohlcv, + download_archive_trades, get_daily_ohlcv, + get_daily_trades, ) from freqtrade.util.datetime_helpers import dt_ts, dt_utc +from ft_client.test_client.test_rest_client import log_has_re @pytest.fixture(scope="module") @@ -337,3 +341,156 @@ async def test_get_daily_ohlcv(mocker, testdatadir): with pytest.raises(zipfile.BadZipFile): df = await get_daily_ohlcv(symbol, timeframe, CandleType.SPOT, date, session) assert get.call_count == 4 # 1 + 3 default retries + + +async def test_download_archive_trades(mocker, caplog): + 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.get_daily_trades", return_value=[[2, 3]]) + + pair1, res = await download_archive_trades( + CandleType.SPOT, pair, since_ms=since_ms, until_ms=until_ms, markets=markets + ) + assert pair1 == pair + assert res == [[2, 3], [2, 3]] + + mocker.patch( + "freqtrade.exchange.binance_public_data.get_daily_trades", + side_effect=Http404("xxx", dt_utc(2020, 1, 1), "http://example.com/something"), + ) + + pair1, res = await download_archive_trades( + CandleType.SPOT, pair, since_ms=since_ms, until_ms=until_ms, markets=markets + ) + + assert pair1 == pair + assert res == [] + # exit on day 1 + assert log_has_re("Fast download is unavailable", caplog) + + # Test fail on day 2 + caplog.clear() + mocker.patch( + "freqtrade.exchange.binance_public_data.get_daily_trades", + side_effect=[ + [[2, 3]], + [[2, 3]], + Http404("xxx", dt_utc(2020, 1, 2), "http://example.com/something"), + [[2, 3]], + ], + ) + # Download 3 days + until_ms = dt_ts(dt_utc(2020, 1, 3)) + + pair1, res = await download_archive_trades( + CandleType.SPOT, pair, since_ms=since_ms, until_ms=until_ms, markets=markets + ) + + assert pair1 == pair + assert res == [[2, 3], [2, 3]] + assert log_has_re(r"Binance fast download .*stopped", caplog) + + +async def test_download_archive_trades_exception(mocker, caplog): + 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 + ) + + pair1, res = await download_archive_trades( + CandleType.SPOT, pair, since_ms=since_ms, until_ms=until_ms, markets=markets + ) + + assert pair1 == pair + assert res == [] + mocker.patch( + "freqtrade.exchange.binance_public_data._download_archive_trades", side_effect=RuntimeError + ) + + await download_archive_trades( + CandleType.SPOT, pair, since_ms=since_ms, until_ms=until_ms, markets=markets + ) + assert pair1 == pair + assert res == [] + assert log_has_re("An exception occurred during fast trades download", caplog) + + +async def test_binance_vision_trades_zip_url(): + url = binance_vision_trades_zip_url("BTCUSDT", CandleType.SPOT, dt_utc(2023, 10, 27)) + assert ( + url == "https://data.binance.vision/data/spot/daily/aggTrades/" + "BTCUSDT/BTCUSDT-aggTrades-2023-10-27.zip" + ) + + url = binance_vision_trades_zip_url("BTCUSDT", CandleType.FUTURES, dt_utc(2023, 10, 28)) + assert ( + url == "https://data.binance.vision/data/futures/um/daily/aggTrades/" + "BTCUSDT/BTCUSDT-aggTrades-2023-10-28.zip" + ) + + +async def test_get_daily_trades(mocker, testdatadir): + symbol = "PEPEUSDT" + symbol_futures = "APEUSDT" + date = dt_utc(2024, 10, 28).date() + first_date = 1729987202368 + last_date = 1730073596350 + + async with aiohttp.ClientSession() as session: + spot_path = ( + testdatadir / "binance/binance_public_data/spot-PEPEUSDT-aggTrades-2024-10-27.zip" + ) + get = mocker.patch( + "freqtrade.exchange.binance_public_data.aiohttp.ClientSession.get", + return_value=MockResponse(spot_path.read_bytes(), 200), + ) + res = await get_daily_trades(symbol, CandleType.SPOT, date, session) + assert get.call_count == 1 + assert res[0][0] == first_date + assert res[-1][0] == last_date + + futures_path = ( + testdatadir / "binance/binance_public_data/futures-APEUSDT-aggTrades-2024-10-18.zip" + ) + get = mocker.patch( + "freqtrade.exchange.binance_public_data.aiohttp.ClientSession.get", + return_value=MockResponse(futures_path.read_bytes(), 200), + ) + res_fut = await get_daily_trades(symbol_futures, CandleType.FUTURES, date, session) + assert get.call_count == 1 + assert res_fut[0][0] == 1729209603958 + assert res_fut[-1][0] == 1729295981272 + + get = mocker.patch( + "freqtrade.exchange.binance_public_data.aiohttp.ClientSession.get", + return_value=MockResponse(b"", 404), + ) + with pytest.raises(Http404): + await get_daily_trades(symbol, CandleType.SPOT, 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): + await get_daily_trades(symbol, CandleType.SPOT, 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): + await get_daily_trades(symbol, CandleType.SPOT, date, session) + assert get.call_count == 4 # 1 + 3 default retries diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 58abb141e..f9f7dd9a1 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -2177,13 +2177,11 @@ def test_get_historic_ohlcv(default_conf, mocker, caplog, exchange_name, candle_ caplog.clear() - async def mock_get_candle_hist_error(pair, *args, **kwargs): - raise TimeoutError() - - exchange._async_get_candle_history = MagicMock(side_effect=mock_get_candle_hist_error) - ret = exchange.get_historic_ohlcv( - pair, "5m", dt_ts(dt_now() - timedelta(seconds=since)), candle_type=candle_type - ) + exchange._async_get_candle_history = get_mock_coro(side_effect=TimeoutError()) + with pytest.raises(TimeoutError): + exchange.get_historic_ohlcv( + pair, "5m", dt_ts(dt_now() - timedelta(seconds=since)), candle_type=candle_type + ) assert log_has_re(r"Async code raised an exception: .*", caplog) @@ -2373,6 +2371,8 @@ def test_refresh_latest_trades( caplog.set_level(logging.DEBUG) use_trades_conf = default_conf use_trades_conf["exchange"]["use_public_trades"] = True + use_trades_conf["exchange"]["only_from_ccxt"] = True + use_trades_conf["datadir"] = tmp_path use_trades_conf["orderflow"] = {"max_candles": 1500} exchange = get_patched_exchange(mocker, use_trades_conf) @@ -2838,6 +2838,11 @@ def test_get_next_limit_in_list(): assert Exchange.get_next_limit_in_list(21, None) == 21 assert Exchange.get_next_limit_in_list(100, None) == 100 assert Exchange.get_next_limit_in_list(1000, None) == 1000 + # With upper limit + assert Exchange.get_next_limit_in_list(1000, None, upper_limit=None) == 1000 + assert Exchange.get_next_limit_in_list(1000, None, upper_limit=500) == 500 + # with upper limit and range, limit_range wins + assert Exchange.get_next_limit_in_list(1000, limit_range, upper_limit=500) == 1000 @pytest.mark.parametrize("exchange_name", EXCHANGES) @@ -3365,6 +3370,7 @@ async def test__async_fetch_trades_contract_size( async def test__async_get_trade_history_id( default_conf, mocker, exchange_name, fetch_trades_result ): + default_conf["exchange"]["only_from_ccxt"] = True exchange = get_patched_exchange(mocker, default_conf, exchange=exchange_name) if exchange._trades_pagination != "id": exchange.close() @@ -5593,11 +5599,13 @@ def test_liquidation_price_is_none( def test_get_max_pair_stake_amount( mocker, default_conf, + leverage_tiers, ): api_mock = MagicMock() default_conf["margin_mode"] = "isolated" default_conf["trading_mode"] = "futures" exchange = get_patched_exchange(mocker, default_conf, api_mock) + exchange._leverage_tiers = leverage_tiers markets = { "XRP/USDT:USDT": { "limits": { @@ -5661,11 +5669,23 @@ def test_get_max_pair_stake_amount( "contractSize": 0.01, "spot": False, }, + "ZEC/USDT:USDT": { + "limits": { + "amount": {"min": 0.001, "max": None}, + "cost": {"min": 5, "max": None}, + }, + "contractSize": 1, + "spot": False, + }, } mocker.patch(f"{EXMS}.markets", markets) assert exchange.get_max_pair_stake_amount("XRP/USDT:USDT", 2.0) == 20000 assert exchange.get_max_pair_stake_amount("XRP/USDT:USDT", 2.0, 5) == 4000 + # limit leverage tiers + assert exchange.get_max_pair_stake_amount("ZEC/USDT:USDT", 2.0, 5) == 100_000 + assert exchange.get_max_pair_stake_amount("ZEC/USDT:USDT", 2.0, 50) == 1000 + assert exchange.get_max_pair_stake_amount("LTC/USDT:USDT", 2.0) == float("inf") assert exchange.get_max_pair_stake_amount("ETH/USDT:USDT", 2.0) == 200 assert exchange.get_max_pair_stake_amount("DOGE/USDT:USDT", 2.0) == 500 @@ -5896,8 +5916,8 @@ def test_get_max_leverage_futures(default_conf, mocker, leverage_tiers): assert exchange.get_max_leverage("XRP/USDT:USDT", 1.0) == 20.0 assert exchange.get_max_leverage("BNB/USDT:USDT", 100.0) == 75.0 assert exchange.get_max_leverage("BTC/USDT:USDT", 170.30) == 125.0 - assert pytest.approx(exchange.get_max_leverage("XRP/USDT:USDT", 99999.9)) == 5.000005 - assert pytest.approx(exchange.get_max_leverage("BNB/USDT:USDT", 1500)) == 33.333333333333333 + assert pytest.approx(exchange.get_max_leverage("XRP/USDT:USDT", 99999.9)) == 5 + assert pytest.approx(exchange.get_max_leverage("BNB/USDT:USDT", 1500)) == 25 assert exchange.get_max_leverage("BTC/USDT:USDT", 300000000) == 2.0 assert exchange.get_max_leverage("BTC/USDT:USDT", 600000000) == 1.0 # Last tier @@ -6076,44 +6096,47 @@ def test_get_liquidation_price1(mocker, default_conf): @pytest.mark.parametrize("liquidation_buffer", [0.0]) @pytest.mark.parametrize( - "is_short,trading_mode,exchange_name,margin_mode,leverage,open_rate,amount,expected_liq", + "is_short,trading_mode,exchange_name,margin_mode,leverage,open_rate,amount,mramt,expected_liq", [ - (False, "spot", "binance", "", 5.0, 10.0, 1.0, None), - (True, "spot", "binance", "", 5.0, 10.0, 1.0, None), - (False, "spot", "gate", "", 5.0, 10.0, 1.0, None), - (True, "spot", "gate", "", 5.0, 10.0, 1.0, None), - (False, "spot", "okx", "", 5.0, 10.0, 1.0, None), - (True, "spot", "okx", "", 5.0, 10.0, 1.0, None), + (False, "spot", "binance", "", 5.0, 10.0, 1.0, (0.01, 0.01), None), + (True, "spot", "binance", "", 5.0, 10.0, 1.0, (0.01, 0.01), None), + (False, "spot", "gate", "", 5.0, 10.0, 1.0, (0.01, 0.01), None), + (True, "spot", "gate", "", 5.0, 10.0, 1.0, (0.01, 0.01), None), + (False, "spot", "okx", "", 5.0, 10.0, 1.0, (0.01, 0.01), None), + (True, "spot", "okx", "", 5.0, 10.0, 1.0, (0.01, 0.01), None), # Binance, short - (True, "futures", "binance", "isolated", 5.0, 10.0, 1.0, 11.89108910891089), - (True, "futures", "binance", "isolated", 3.0, 10.0, 1.0, 13.211221122079207), - (True, "futures", "binance", "isolated", 5.0, 8.0, 1.0, 9.514851485148514), - (True, "futures", "binance", "isolated", 5.0, 10.0, 0.6, 11.897689768976898), + (True, "futures", "binance", "isolated", 5.0, 10.0, 1.0, (0.01, 0.01), 11.89108910891089), + (True, "futures", "binance", "isolated", 3.0, 10.0, 1.0, (0.01, 0.01), 13.211221122079207), + (True, "futures", "binance", "isolated", 5.0, 8.0, 1.0, (0.01, 0.01), 9.514851485148514), + (True, "futures", "binance", "isolated", 5.0, 10.0, 0.6, (0.01, 0.01), 11.897689768976898), # Binance, long - (False, "futures", "binance", "isolated", 5, 10, 1.0, 8.070707070707071), - (False, "futures", "binance", "isolated", 5, 8, 1.0, 6.454545454545454), - (False, "futures", "binance", "isolated", 3, 10, 1.0, 6.723905723905723), - (False, "futures", "binance", "isolated", 5, 10, 0.6, 8.063973063973064), + (False, "futures", "binance", "isolated", 5, 10, 1.0, (0.01, 0.01), 8.070707070707071), + (False, "futures", "binance", "isolated", 5, 8, 1.0, (0.01, 0.01), 6.454545454545454), + (False, "futures", "binance", "isolated", 3, 10, 1.0, (0.01, 0.01), 6.723905723905723), + (False, "futures", "binance", "isolated", 5, 10, 0.6, (0.01, 0.01), 8.063973063973064), # Gate/okx, short - (True, "futures", "gate", "isolated", 5, 10, 1.0, 11.87413417771621), - (True, "futures", "gate", "isolated", 5, 10, 2.0, 11.87413417771621), - (True, "futures", "gate", "isolated", 3, 10, 1.0, 13.193482419684678), - (True, "futures", "gate", "isolated", 5, 8, 1.0, 9.499307342172967), - (True, "futures", "okx", "isolated", 3, 10, 1.0, 13.193482419684678), + (True, "futures", "gate", "isolated", 5, 10, 1.0, (0.01, 0.01), 11.87413417771621), + (True, "futures", "gate", "isolated", 5, 10, 2.0, (0.01, 0.01), 11.87413417771621), + (True, "futures", "gate", "isolated", 3, 10, 1.0, (0.01, 0.01), 13.193482419684678), + (True, "futures", "gate", "isolated", 5, 8, 1.0, (0.01, 0.01), 9.499307342172967), + (True, "futures", "okx", "isolated", 3, 10, 1.0, (0.01, 0.01), 13.193482419684678), # Gate/okx, long - (False, "futures", "gate", "isolated", 5.0, 10.0, 1.0, 8.085708510208207), - (False, "futures", "gate", "isolated", 3.0, 10.0, 1.0, 6.738090425173506), - (False, "futures", "okx", "isolated", 3.0, 10.0, 1.0, 6.738090425173506), + (False, "futures", "gate", "isolated", 5.0, 10.0, 1.0, (0.01, 0.01), 8.085708510208207), + (False, "futures", "gate", "isolated", 3.0, 10.0, 1.0, (0.01, 0.01), 6.738090425173506), + (False, "futures", "okx", "isolated", 3.0, 10.0, 1.0, (0.01, 0.01), 6.738090425173506), # bybit, long - (False, "futures", "bybit", "isolated", 1.0, 10.0, 1.0, 0.1), - (False, "futures", "bybit", "isolated", 3.0, 10.0, 1.0, 6.7666666), - (False, "futures", "bybit", "isolated", 5.0, 10.0, 1.0, 8.1), - (False, "futures", "bybit", "isolated", 10.0, 10.0, 1.0, 9.1), + (False, "futures", "bybit", "isolated", 1.0, 10.0, 1.0, (0.01, 0.01), 0.1), + (False, "futures", "bybit", "isolated", 3.0, 10.0, 1.0, (0.01, 0.01), 6.7666666), + (False, "futures", "bybit", "isolated", 5.0, 10.0, 1.0, (0.01, 0.01), 8.1), + (False, "futures", "bybit", "isolated", 10.0, 10.0, 1.0, (0.01, 0.01), 9.1), + # From the bybit example - without additional margin + (False, "futures", "bybit", "isolated", 50.0, 40000.0, 1.0, (0.005, None), 39400), + (False, "futures", "bybit", "isolated", 50.0, 20000.0, 1.0, (0.005, None), 19700), # bybit, short - (True, "futures", "bybit", "isolated", 1.0, 10.0, 1.0, 19.9), - (True, "futures", "bybit", "isolated", 3.0, 10.0, 1.0, 13.233333), - (True, "futures", "bybit", "isolated", 5.0, 10.0, 1.0, 11.9), - (True, "futures", "bybit", "isolated", 10.0, 10.0, 1.0, 10.9), + (True, "futures", "bybit", "isolated", 1.0, 10.0, 1.0, (0.01, 0.01), 19.9), + (True, "futures", "bybit", "isolated", 3.0, 10.0, 1.0, (0.01, 0.01), 13.233333), + (True, "futures", "bybit", "isolated", 5.0, 10.0, 1.0, (0.01, 0.01), 11.9), + (True, "futures", "bybit", "isolated", 10.0, 10.0, 1.0, (0.01, 0.01), 10.9), ], ) def test_get_liquidation_price( @@ -6126,6 +6149,7 @@ def test_get_liquidation_price( leverage, open_rate, amount, + mramt, expected_liq, liquidation_buffer, ): @@ -6189,7 +6213,7 @@ def test_get_liquidation_price( 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)) + exchange.get_maintenance_ratio_and_amt = MagicMock(return_value=mramt) exchange.name = exchange_name # default_conf_usdt.update({ # "dry_run": False, diff --git a/tests/exchange/test_exchange_utils.py b/tests/exchange/test_exchange_utils.py index 7fe8cb707..a298599c4 100644 --- a/tests/exchange/test_exchange_utils.py +++ b/tests/exchange/test_exchange_utils.py @@ -1,5 +1,6 @@ # pragma pylint: disable=missing-docstring, protected-access, invalid-name from datetime import datetime, timedelta, timezone +from math import isnan, nan import pytest from ccxt import ( @@ -321,6 +322,7 @@ def test_amount_to_precision( (2.9977, TICK_SIZE, 0.005, 3.0, ROUND), (234.24, TICK_SIZE, 0.5, 234.0, ROUND), (234.26, TICK_SIZE, 0.5, 234.5, ROUND), + (nan, TICK_SIZE, 3, nan, ROUND), # Tests for TRUNCATTE (2.34559, DECIMAL_PLACES, 4, 2.3455, TRUNCATE), (2.34559, DECIMAL_PLACES, 5, 2.34559, TRUNCATE), @@ -359,10 +361,11 @@ def test_amount_to_precision( ], ) def test_price_to_precision(price, precision_mode, precision, expected, rounding_mode): - assert ( - price_to_precision(price, precision, precision_mode, rounding_mode=rounding_mode) - == expected - ) + result = price_to_precision(price, precision, precision_mode, rounding_mode=rounding_mode) + if not isnan(expected): + assert result == expected + else: + assert isnan(result) @pytest.mark.parametrize( diff --git a/tests/exchange/test_exchange_ws.py b/tests/exchange/test_exchange_ws.py index 5f3e676ef..6dee7f339 100644 --- a/tests/exchange/test_exchange_ws.py +++ b/tests/exchange/test_exchange_ws.py @@ -1,9 +1,12 @@ import asyncio +import logging import threading from datetime import timedelta from time import sleep from unittest.mock import AsyncMock, MagicMock +from ccxt import NotSupported + from freqtrade.enums import CandleType from freqtrade.exchange.exchange_ws import ExchangeWS from ft_client.test_client.test_rest_client import log_has_re @@ -61,15 +64,18 @@ def patch_eventloop_threading(exchange): pass -async def test_exchangews_ohlcv(mocker, time_machine): +async def test_exchangews_ohlcv(mocker, time_machine, caplog): config = MagicMock() ccxt_object = MagicMock() + caplog.set_level(logging.DEBUG) async def sleeper(*args, **kwargs): # pass await asyncio.sleep(0.12) return MagicMock() + ccxt_object.un_watch_ohlcv_for_symbols = AsyncMock(side_effect=NotSupported) + ccxt_object.watch_ohlcv = AsyncMock(side_effect=sleeper) ccxt_object.close = AsyncMock() time_machine.move_to("2024-11-01 01:00:02 +00:00") @@ -101,11 +107,14 @@ async def test_exchangews_ohlcv(mocker, time_machine): time_machine.shift(timedelta(minutes=5)) exchange_ws.schedule_ohlcv("ETH/BTC", "1m", CandleType.SPOT) await asyncio.sleep(1) + assert log_has_re("un_watch_ohlcv_for_symbols not supported: ", caplog) # XRP/BTC should be cleaned up. assert exchange_ws._klines_watching == { ("ETH/BTC", "1m", CandleType.SPOT), } + # Cleanup happened. + ccxt_object.un_watch_ohlcv_for_symbols = AsyncMock(side_effect=ValueError) exchange_ws.schedule_ohlcv("ETH/BTC", "1m", CandleType.SPOT) assert exchange_ws._klines_watching == { ("ETH/BTC", "1m", CandleType.SPOT), @@ -117,6 +126,7 @@ async def test_exchangews_ohlcv(mocker, time_machine): finally: # Cleanup exchange_ws.cleanup() + assert log_has_re("Exception in _unwatch_ohlcv", caplog) async def test_exchangews_get_ohlcv(mocker, caplog): diff --git a/tests/exchange/test_kraken.py b/tests/exchange/test_kraken.py index 5cfdac15f..fd36a359d 100644 --- a/tests/exchange/test_kraken.py +++ b/tests/exchange/test_kraken.py @@ -71,7 +71,7 @@ def test_get_balances_prod_kraken(default_conf, mocker): "4TH": balance_item.copy(), "EUR": balance_item.copy(), "BTC": {"free": 0.0, "total": 0.0, "used": 0.0}, - "XBT.F": balance_item.copy(), + "BTC.F": balance_item.copy(), "timestamp": 123123, } ) diff --git a/tests/exchange_online/conftest.py b/tests/exchange_online/conftest.py index 8eedcfb01..f7cf49aa4 100644 --- a/tests/exchange_online/conftest.py +++ b/tests/exchange_online/conftest.py @@ -156,7 +156,7 @@ EXCHANGES = { "ADA.F": {"free": 2.0, "total": 2.0, "used": 0.0}, "BTC": {"free": 0.0006, "total": 0.0006, "used": 0.0}, # XBT.F should be mapped to BTC.F - "XBT.F": {"free": 0.001, "total": 0.001, "used": 0.0}, + "BTC.F": {"free": 0.001, "total": 0.001, "used": 0.0}, }, }, }, diff --git a/tests/exchange_online/test_ccxt_ws_compat.py b/tests/exchange_online/test_ccxt_ws_compat.py index 8083a926c..6ab7600f4 100644 --- a/tests/exchange_online/test_ccxt_ws_compat.py +++ b/tests/exchange_online/test_ccxt_ws_compat.py @@ -12,7 +12,6 @@ import pytest from freqtrade.enums import CandleType from freqtrade.exchange.exchange_utils import timeframe_to_prev_date -from freqtrade.loggers.set_log_levels import set_loggers from freqtrade.util.datetime_helpers import dt_now from tests.conftest import log_has_re from tests.exchange_online.conftest import EXCHANGE_WS_FIXTURE_TYPE @@ -50,7 +49,6 @@ class TestCCXTExchangeWs: assert res[pair_tf] is not None df1 = res[pair_tf] caplog.set_level(logging.DEBUG) - set_loggers(1) assert df1.iloc[-1]["date"] == curr_candle # Wait until the next candle (might be up to 1 minute). diff --git a/tests/freqai/test_freqai_datakitchen.py b/tests/freqai/test_freqai_datakitchen.py index 7a219e46e..2e92ae447 100644 --- a/tests/freqai/test_freqai_datakitchen.py +++ b/tests/freqai/test_freqai_datakitchen.py @@ -150,7 +150,9 @@ def test_get_pair_data_for_features_with_prealoaded_data(mocker, freqai_conf): freqai.dd.load_all_pair_histories(timerange, freqai.dk) _, base_df = freqai.dd.get_base_and_corr_dataframes(timerange, "LTC/BTC", freqai.dk) - df = freqai.dk.get_pair_data_for_features("LTC/BTC", "5m", strategy, base_dataframes=base_df) + df = freqai.dk.get_pair_data_for_features( + "LTC/BTC", "5m", strategy, {}, base_dataframes=base_df + ) assert df is base_df["5m"] assert not df.empty @@ -170,7 +172,9 @@ def test_get_pair_data_for_features_without_preloaded_data(mocker, freqai_conf): freqai.dd.load_all_pair_histories(timerange, freqai.dk) base_df = {"5m": pd.DataFrame()} - df = freqai.dk.get_pair_data_for_features("LTC/BTC", "5m", strategy, base_dataframes=base_df) + df = freqai.dk.get_pair_data_for_features( + "LTC/BTC", "5m", strategy, {}, base_dataframes=base_df + ) assert df is not base_df["5m"] assert not df.empty diff --git a/tests/freqtradebot/test_freqtradebot.py b/tests/freqtradebot/test_freqtradebot.py index 02ffcb2e4..3ff8fcb5e 100644 --- a/tests/freqtradebot/test_freqtradebot.py +++ b/tests/freqtradebot/test_freqtradebot.py @@ -701,9 +701,9 @@ def test_process_trade_creation( assert pytest.approx(trade.amount) == 0 assert pytest.approx(trade.amount_requested) == 60 / ticker_usdt.return_value[ticker_side] - assert log_has( + assert log_has_re( f"{'Short' if is_short else 'Long'} signal found: about create a new trade for ETH/USDT " - "with stake_amount: 60.0 ...", + r"with stake_amount: 60.0 and price: .*", caplog, ) mocker.patch("freqtrade.freqtradebot.FreqtradeBot._check_and_execute_exit") @@ -3743,8 +3743,9 @@ def test_trailing_stop_loss_positive( @pytest.mark.parametrize("is_short", [False, True]) def test_disable_ignore_roi_if_entry_signal( - default_conf_usdt, limit_order, limit_order_open, is_short, fee, mocker + default_conf_usdt, limit_order, limit_order_open, is_short, fee, mocker, time_machine ) -> None: + time_machine.move_to("2025-01-10 08:00:16 +00:00") patch_RPCManager(mocker) patch_exchange(mocker) eside = entry_side(is_short) @@ -3773,6 +3774,13 @@ def test_disable_ignore_roi_if_entry_signal( patch_get_signal(freqtrade, enter_long=not is_short, enter_short=is_short, exit_short=is_short) assert freqtrade.handle_trade(trade) is True + # Test if entry-signal is absent + patch_get_signal(freqtrade) + # Signal was evaluated already - no action. + assert freqtrade.handle_trade(trade) is False + + # Move to after the candle expired + time_machine.shift(timedelta(hours=5)) # Test if entry-signal is absent patch_get_signal(freqtrade) assert freqtrade.handle_trade(trade) is True diff --git a/tests/freqtradebot/test_integration.py b/tests/freqtradebot/test_integration.py index 9fc580753..2cb4b6aa8 100644 --- a/tests/freqtradebot/test_integration.py +++ b/tests/freqtradebot/test_integration.py @@ -436,6 +436,7 @@ def test_dca_order_adjust(default_conf_usdt, ticker_usdt, leverage, fee, mocker) # Replace new order with diff. order at a lower price freqtrade.strategy.adjust_entry_price = MagicMock(return_value=1.95) + freqtrade.strategy.adjust_exit_price = MagicMock(side_effect=ValueError) freqtrade.strategy.adjust_trade_position = MagicMock(return_value=None) freqtrade.process() trade = Trade.get_trades().first() @@ -445,6 +446,8 @@ def test_dca_order_adjust(default_conf_usdt, ticker_usdt, leverage, fee, mocker) assert pytest.approx(trade.stake_amount) == 60 assert trade.orders[-1].price == 1.95 assert pytest.approx(trade.orders[-1].cost) == 120 * leverage + assert freqtrade.strategy.adjust_entry_price.call_count == 1 + assert freqtrade.strategy.adjust_exit_price.call_count == 0 # Fill DCA order freqtrade.strategy.adjust_trade_position = MagicMock(return_value=None) @@ -469,6 +472,7 @@ def test_dca_order_adjust(default_conf_usdt, ticker_usdt, leverage, fee, mocker) mocker.patch(f"{EXMS}._dry_is_price_crossed", return_value=False) freqtrade.strategy.custom_exit = MagicMock(return_value="Exit now") freqtrade.strategy.adjust_entry_price = MagicMock(return_value=2.02) + freqtrade.strategy.adjust_exit_price = MagicMock(side_effect=ValueError) freqtrade.process() trade = Trade.get_trades().first() assert len(trade.orders) == 5 @@ -478,8 +482,9 @@ def test_dca_order_adjust(default_conf_usdt, ticker_usdt, leverage, fee, mocker) assert pytest.approx(trade.amount) == 91.689215 * leverage assert pytest.approx(trade.orders[-1].amount) == 91.689215 * leverage assert freqtrade.strategy.adjust_entry_price.call_count == 0 + assert freqtrade.strategy.adjust_exit_price.call_count == 0 - # Process again, should not adjust entry price + # Process again, should not adjust price freqtrade.process() trade = Trade.get_trades().first() @@ -490,6 +495,21 @@ def test_dca_order_adjust(default_conf_usdt, ticker_usdt, leverage, fee, mocker) assert trade.orders[-1].price == 2.02 # Adjust entry price cannot be called - this is an exit order assert freqtrade.strategy.adjust_entry_price.call_count == 0 + assert freqtrade.strategy.adjust_exit_price.call_count == 1 + + freqtrade.strategy.adjust_exit_price = MagicMock(return_value=2.03) + + # Process again, should adjust exit price + freqtrade.process() + trade = Trade.get_trades().first() + + assert trade.orders[-2].status == "canceled" + assert len(trade.orders) == 6 + assert trade.orders[-1].side == trade.exit_side + assert trade.orders[-1].status == "open" + assert trade.orders[-1].price == 2.03 + assert freqtrade.strategy.adjust_entry_price.call_count == 0 + assert freqtrade.strategy.adjust_exit_price.call_count == 1 @pytest.mark.parametrize("leverage", [1, 2]) diff --git a/tests/freqtradebot/test_worker.py b/tests/freqtradebot/test_worker.py index 1dfdca5b2..6423e63ee 100644 --- a/tests/freqtradebot/test_worker.py +++ b/tests/freqtradebot/test_worker.py @@ -3,6 +3,7 @@ import time from datetime import timedelta from unittest.mock import MagicMock, PropertyMock +import pytest import time_machine from freqtrade.data.dataprovider import DataProvider @@ -38,6 +39,25 @@ def test_worker_running(mocker, default_conf, caplog) -> None: assert isinstance(worker.freqtrade.strategy.dp, DataProvider) +def test_worker_paused(mocker, default_conf, caplog) -> None: + mock_throttle = MagicMock() + mocker.patch("freqtrade.worker.Worker._throttle", mock_throttle) + mocker.patch("freqtrade.persistence.Trade.stoploss_reinitialization", MagicMock()) + + worker = get_patched_worker(mocker, default_conf) + + worker.freqtrade.state = State.PAUSED + state = worker._worker(old_state=State.RUNNING) + + assert state is State.PAUSED + assert log_has("Changing state from RUNNING to: PAUSED", caplog) + assert mock_throttle.call_count == 1 + # Check strategy is loaded, and received a dataprovider object + assert worker.freqtrade.strategy + assert worker.freqtrade.strategy.dp + assert isinstance(worker.freqtrade.strategy.dp, DataProvider) + + def test_worker_stopped(mocker, default_conf, caplog) -> None: mock_throttle = MagicMock() mocker.patch("freqtrade.worker.Worker._throttle", mock_throttle) @@ -50,6 +70,54 @@ def test_worker_stopped(mocker, default_conf, caplog) -> None: assert mock_throttle.call_count == 1 +@pytest.mark.parametrize( + "old_state,target_state,startup_call,log_fragment", + [ + (State.STOPPED, State.PAUSED, True, "Changing state from STOPPED to: PAUSED"), + (State.RUNNING, State.PAUSED, False, "Changing state from RUNNING to: PAUSED"), + (State.PAUSED, State.RUNNING, False, "Changing state from PAUSED to: RUNNING"), + (State.PAUSED, State.STOPPED, False, "Changing state from PAUSED to: STOPPED"), + (State.RELOAD_CONFIG, State.RUNNING, True, "Changing state from RELOAD_CONFIG to: RUNNING"), + ( + State.RELOAD_CONFIG, + State.STOPPED, + False, + "Changing state from RELOAD_CONFIG to: STOPPED", + ), + ], +) +def test_worker_lifecycle( + mocker, + default_conf, + caplog, + old_state, + target_state, + startup_call, + log_fragment, +): + mock_throttle = mocker.MagicMock() + mocker.patch("freqtrade.worker.Worker._throttle", mock_throttle) + mocker.patch("freqtrade.persistence.Trade.stoploss_reinitialization") + startup = mocker.patch("freqtrade.freqtradebot.FreqtradeBot.startup") + + worker = get_patched_worker(mocker, default_conf) + worker.freqtrade.state = target_state + + new_state = worker._worker(old_state=old_state) + + assert new_state is target_state + assert log_has(log_fragment, caplog) + assert mock_throttle.call_count == 1 + assert startup.call_count == (1 if startup_call else 0) + + # For any state where the strategy should be initialized + if target_state in (State.RUNNING, State.PAUSED): + assert worker.freqtrade.strategy + assert isinstance(worker.freqtrade.strategy.dp, DataProvider) + else: + assert new_state is State.STOPPED + + def test_throttle(mocker, default_conf, caplog) -> None: def throttled_func(): return 42 diff --git a/tests/optimize/__init__.py b/tests/optimize/__init__.py index 3299c6a53..38d86439c 100644 --- a/tests/optimize/__init__.py +++ b/tests/optimize/__init__.py @@ -45,6 +45,7 @@ class BTContainer(NamedTuple): leverage: float = 1.0 timeout: int | None = None adjust_entry_price: float | None = None + adjust_exit_price: float | None = None adjust_trade_position: list[float] | None = None @@ -68,8 +69,8 @@ def _build_backtest_dataframe(data): ] if len(data[0]) == 8: # No short columns - data = [d + [0, 0] for d in data] - columns = columns + ["enter_tag"] if len(data[0]) == 11 else columns + data = [[*d, 0, 0] for d in data] + columns = [*columns, "enter_tag"] if len(data[0]) == 11 else columns frame = DataFrame.from_records(data, columns=columns) frame["date"] = frame["date"].apply(_get_frame_time_from_offset) diff --git a/tests/optimize/test_backtest_detail.py b/tests/optimize/test_backtest_detail.py index 7ba53a1b3..2e5ab41de 100644 --- a/tests/optimize/test_backtest_detail.py +++ b/tests/optimize/test_backtest_detail.py @@ -102,7 +102,7 @@ tc3 = BTContainer( ) # Test 4: Minus 3% / recovery +15% -# Candle Data for test 3 – Candle drops 3% Closed 15% up +# Candle Data for test 3 - Candle drops 3% Closed 15% up # Test with Stop-loss at 2% ROI 6% # Stop-Loss Triggered 2% Loss tc4 = BTContainer( @@ -1217,6 +1217,46 @@ tc57 = BTContainer( ], ) +# Test 58: Custom-exit-price short - below all candles +tc58 = 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, 5200, 4951, 5000, 6172, 0, 0, 0, 0], # enter trade (signal on last candle) + [2, 4900, 5250, 4900, 5100, 6172, 0, 0, 0, 1], # Exit - delayed + [3, 5100, 5100, 4650, 4750, 6172, 0, 0, 0, 0], # + [4, 4750, 5100, 4350, 4750, 6172, 0, 0, 0, 0], + ], + stop_loss=-0.10, + roi={"0": 1.00}, + profit_perc=-0.01, + use_exit_signal=True, + timeout=1000, + custom_exit_price=4300, + adjust_exit_price=5050, + trades=[BTrade(exit_reason=ExitType.EXIT_SIGNAL, open_tick=1, close_tick=4, is_short=True)], +) + +# Test 59: Custom-exit-price above all candles - readjust order +tc59 = BTContainer( + data=[ + # D O H L C V EL XL ES Xs BT + [0, 5000, 5050, 4950, 5000, 6172, 1, 0], + [1, 5000, 5500, 4951, 5000, 6172, 0, 0], + [2, 4900, 5250, 4500, 5100, 6172, 0, 1], # exit + [3, 5100, 5100, 4650, 4750, 6172, 0, 0], # order readjust + [4, 4750, 4950, 4350, 4750, 6172, 0, 0], + ], + stop_loss=-0.2, + roi={"0": 0.10}, + profit_perc=-0.02, + use_exit_signal=True, + timeout=1000, + custom_exit_price=5300, + adjust_exit_price=4900, + trades=[BTrade(exit_reason=ExitType.EXIT_SIGNAL, open_tick=1, close_tick=4, is_short=False)], +) + TESTS = [ tc0, @@ -1277,6 +1317,8 @@ TESTS = [ tc55, tc56, tc57, + tc58, + tc59, ] @@ -1330,6 +1372,8 @@ def test_backtest_results(default_conf, mocker, caplog, data: BTContainer) -> No ) if data.adjust_entry_price: backtesting.strategy.adjust_entry_price = MagicMock(return_value=data.adjust_entry_price) + if data.adjust_exit_price: + backtesting.strategy.adjust_exit_price = MagicMock(return_value=data.adjust_exit_price) backtesting.strategy.use_custom_stoploss = data.use_custom_stoploss backtesting.strategy.leverage = lambda **kwargs: data.leverage diff --git a/tests/optimize/test_backtesting.py b/tests/optimize/test_backtesting.py index f14e087af..b3e23249c 100644 --- a/tests/optimize/test_backtesting.py +++ b/tests/optimize/test_backtesting.py @@ -1543,8 +1543,7 @@ def test_backtest_multi_pair(default_conf, fee, mocker, tres, pair, testdatadir) assert len(evaluate_result_multi(results["results"], "5m", 3)) == 0 # Cached data correctly removed amounts - offset = 1 if tres == 0 else 0 - removed_candles = len(data[pair]) - offset + removed_candles = len(data[pair]) - 1 assert len(backtesting.dataprovider.get_analyzed_dataframe(pair, "5m")[0]) == removed_candles assert ( len(backtesting.dataprovider.get_analyzed_dataframe("NXT/BTC", "5m")[0]) @@ -1663,8 +1662,7 @@ def test_backtest_multi_pair_detail( assert len(evaluate_result_multi(results["results"], "5m", 3)) == 0 # Cached data correctly removed amounts - offset = 1 if tres == 0 else 0 - removed_candles = len(data[pair]) - offset + removed_candles = len(data[pair]) - 1 assert len(backtesting.dataprovider.get_analyzed_dataframe(pair, "5m")[0]) == removed_candles assert ( len(backtesting.dataprovider.get_analyzed_dataframe("NXT/USDT", "5m")[0]) @@ -1793,7 +1791,7 @@ def test_backtest_multi_pair_detail_simplified( assert len(evaluate_result_multi(results["results"], "1m", 3)) == 0 # # Cached data correctly removed amounts - offset = 1 if tres == 0 else 0 + offset = 1 removed_candles = len(data[pair]) - offset assert len(backtesting.dataprovider.get_analyzed_dataframe(pair, "1h")[0]) == removed_candles assert ( @@ -2578,7 +2576,7 @@ def test_backtest_start_multi_strat_caching( ], ) mocker.patch.multiple( - "freqtrade.data.btanalysis", + "freqtrade.data.btanalysis.bt_fileutils", load_backtest_metadata=load_backtest_metadata, load_backtest_stats=load_backtest_stats, ) diff --git a/tests/optimize/test_backtesting_adjust_position.py b/tests/optimize/test_backtesting_adjust_position.py index 64df6537b..c9e8c9eeb 100644 --- a/tests/optimize/test_backtesting_adjust_position.py +++ b/tests/optimize/test_backtesting_adjust_position.py @@ -162,7 +162,7 @@ def test_backtest_position_adjustment_detailed(default_conf, fee, mocker, levera backtesting.strategy.adjust_trade_position = MagicMock(return_value=None) assert pytest.approx(trade.liquidation_price) == (0.10278333 if leverage == 1 else 1.2122249) - trade = backtesting._get_adjust_trade_entry_for_candle(trade, row_enter, current_time) + trade = backtesting._check_adjust_trade_for_candle(trade, row_enter, current_time) assert trade assert pytest.approx(trade.stake_amount) == 100.0 assert pytest.approx(trade.amount) == 47.61904762 * leverage @@ -170,7 +170,7 @@ def test_backtest_position_adjustment_detailed(default_conf, fee, mocker, levera # Increase position by 100 backtesting.strategy.adjust_trade_position = MagicMock(return_value=(100, "PartIncrease")) - trade = backtesting._get_adjust_trade_entry_for_candle(trade, row_enter, current_time) + trade = backtesting._check_adjust_trade_for_candle(trade, row_enter, current_time) liq_price = 0.1038916 if leverage == 1 else 1.2127791 assert trade @@ -184,7 +184,7 @@ def test_backtest_position_adjustment_detailed(default_conf, fee, mocker, levera backtesting.strategy.adjust_trade_position = MagicMock(return_value=-500) current_time = row_exit[0].to_pydatetime() - trade = backtesting._get_adjust_trade_entry_for_candle(trade, row_exit, current_time) + trade = backtesting._check_adjust_trade_for_candle(trade, row_exit, current_time) assert trade assert pytest.approx(trade.stake_amount) == 200.0 @@ -195,7 +195,7 @@ def test_backtest_position_adjustment_detailed(default_conf, fee, mocker, levera # Reduce position by 50 backtesting.strategy.adjust_trade_position = MagicMock(return_value=(-100, "partDecrease")) - trade = backtesting._get_adjust_trade_entry_for_candle(trade, row_exit, current_time) + trade = backtesting._check_adjust_trade_for_candle(trade, row_exit, current_time) assert trade assert pytest.approx(trade.stake_amount) == 100.0 @@ -208,7 +208,7 @@ def test_backtest_position_adjustment_detailed(default_conf, fee, mocker, levera # Adjust below minimum backtesting.strategy.adjust_trade_position = MagicMock(return_value=-99) - trade = backtesting._get_adjust_trade_entry_for_candle(trade, row_exit, current_time) + trade = backtesting._check_adjust_trade_for_candle(trade, row_exit, current_time) assert trade assert pytest.approx(trade.stake_amount) == 100.0 @@ -220,5 +220,5 @@ def test_backtest_position_adjustment_detailed(default_conf, fee, mocker, levera # Adjust to close trade backtesting.strategy.adjust_trade_position = MagicMock(return_value=-trade.stake_amount) - trade = backtesting._get_adjust_trade_entry_for_candle(trade, row_exit, current_time) + trade = backtesting._check_adjust_trade_for_candle(trade, row_exit, current_time) assert trade.is_open is False diff --git a/tests/optimize/test_hyperopt.py b/tests/optimize/test_hyperopt.py index a0cc4eb73..8bd2e95e0 100644 --- a/tests/optimize/test_hyperopt.py +++ b/tests/optimize/test_hyperopt.py @@ -688,7 +688,7 @@ def test_print_json_spaces_all(mocker, hyperopt_conf, capsys) -> None: '{"params":{"mfi-value":null,"sell-mfi-value":null},"minimal_roi"' ':{},"stoploss":null,"trailing_stop":null,"max_open_trades":null}' ) - assert result_str in out # noqa: E501 + assert result_str in out # Should be called for historical candle data assert dumper.call_count == 1 assert dumper2.call_count == 1 @@ -745,7 +745,7 @@ def test_print_json_spaces_default(mocker, hyperopt_conf, capsys) -> None: assert ( '{"params":{"mfi-value":null,"sell-mfi-value":null},"minimal_roi":{},"stoploss":null}' in out - ) # noqa: E501 + ) # Should be called for historical candle data assert dumper.call_count == 1 assert dumper2.call_count == 1 diff --git a/tests/optimize/test_hyperoptloss.py b/tests/optimize/test_hyperoptloss.py index 8f1b1c786..6d3110509 100644 --- a/tests/optimize/test_hyperoptloss.py +++ b/tests/optimize/test_hyperoptloss.py @@ -153,6 +153,7 @@ def test_loss_calculation_has_limited_profit(hyperopt_conf, hyperopt_results) -> "SharpeHyperOptLossDaily", "MaxDrawDownHyperOptLoss", "MaxDrawDownRelativeHyperOptLoss", + "MaxDrawDownPerPairHyperOptLoss", "CalmarHyperOptLoss", "ProfitDrawDownHyperOptLoss", "MultiMetricHyperOptLoss", @@ -165,6 +166,34 @@ def test_loss_functions_better_profits(default_conf, hyperopt_results, lossfunct results_under = hyperopt_results.copy() results_under["profit_abs"] = hyperopt_results["profit_abs"] / 2 - 0.2 results_under["profit_ratio"] = hyperopt_results["profit_ratio"] / 2 + pair_results = [ + { + "key": "ETH/USDT", + "max_drawdown_abs": 50.0, + "profit_total_abs": 100.0, + }, + { + "key": "BTC/USDT", + "max_drawdown_abs": 50.0, + "profit_total_abs": 100.0, + }, + ] + pair_results_over = [ + { + **p, + "max_drawdown_abs": p["max_drawdown_abs"] * 0.5, + "profit_total_abs": p["profit_total_abs"] * 2, + } + for p in pair_results + ] + pair_results_under = [ + { + **p, + "max_drawdown_abs": p["max_drawdown_abs"] * 2, + "profit_total_abs": p["profit_total_abs"] * 0.5, + } + for p in pair_results + ] default_conf.update({"hyperopt_loss": lossfunction}) hl = HyperOptLossResolver.load_hyperoptloss(default_conf) @@ -175,7 +204,10 @@ def test_loss_functions_better_profits(default_conf, hyperopt_results, lossfunct max_date=datetime(2019, 5, 1), config=default_conf, processed=None, - backtest_stats={"profit_total": hyperopt_results["profit_abs"].sum()}, + backtest_stats={ + "profit_total": hyperopt_results["profit_abs"].sum(), + "results_per_pair": pair_results, + }, starting_balance=default_conf["dry_run_wallet"], ) over = hl.hyperopt_loss_function( @@ -185,7 +217,10 @@ def test_loss_functions_better_profits(default_conf, hyperopt_results, lossfunct max_date=datetime(2019, 5, 1), config=default_conf, processed=None, - backtest_stats={"profit_total": results_over["profit_abs"].sum()}, + backtest_stats={ + "profit_total": results_over["profit_abs"].sum(), + "results_per_pair": pair_results_over, + }, starting_balance=default_conf["dry_run_wallet"], ) under = hl.hyperopt_loss_function( @@ -195,7 +230,10 @@ def test_loss_functions_better_profits(default_conf, hyperopt_results, lossfunct max_date=datetime(2019, 5, 1), config=default_conf, processed=None, - backtest_stats={"profit_total": results_under["profit_abs"].sum()}, + backtest_stats={ + "profit_total": results_under["profit_abs"].sum(), + "results_per_pair": pair_results_under, + }, starting_balance=default_conf["dry_run_wallet"], ) assert over < correct diff --git a/tests/optimize/test_optimize_reports.py b/tests/optimize/test_optimize_reports.py index 5459f76f5..8943a7467 100644 --- a/tests/optimize/test_optimize_reports.py +++ b/tests/optimize/test_optimize_reports.py @@ -1,5 +1,6 @@ import json import re +import shutil from datetime import timedelta from pathlib import Path from shutil import copyfile @@ -41,7 +42,7 @@ from freqtrade.optimize.optimize_reports.optimize_reports import ( from freqtrade.resolvers.strategy_resolver import StrategyResolver from freqtrade.util import dt_ts from freqtrade.util.datetime_helpers import dt_from_ts, dt_utc -from tests.conftest import CURRENT_TEST_STRATEGY +from tests.conftest import CURRENT_TEST_STRATEGY, log_has_re from tests.data.test_history import _clean_test_file @@ -67,11 +68,21 @@ def test_text_table_bt_results(capsys): "profit_ratio": [0.1, 0.2, -0.05], "profit_abs": [0.2, 0.4, -0.1], "trade_duration": [10, 30, 20], + "close_date": [ + dt_utc(2017, 11, 14, 21, 35, 00), + dt_utc(2017, 11, 14, 22, 10, 00), + dt_utc(2017, 11, 14, 22, 43, 00), + ], } ) pair_results = generate_pair_metrics( - ["ETH/BTC"], stake_currency="BTC", starting_balance=4, results=results + ["ETH/BTC"], + stake_currency="BTC", + starting_balance=4, + results=results, + min_date=dt_from_ts(1510688220), + max_date=dt_from_ts(1510700340), ) text_table_bt_results(pair_results, stake_currency="BTC", title="title") text = capsys.readouterr().out @@ -253,8 +264,9 @@ def test_store_backtest_results(testdatadir, mocker): dump_mock = mocker.patch("freqtrade.optimize.optimize_reports.bt_storage.file_dump_json") zip_mock = mocker.patch("freqtrade.optimize.optimize_reports.bt_storage.ZipFile") data = {"metadata": {}, "strategy": {}, "strategy_comparison": []} - - store_backtest_results({"exportfilename": testdatadir}, data, "2022_01_01_15_05_13") + store_backtest_results( + {"exportfilename": testdatadir, "original_config": {}}, data, "2022_01_01_15_05_13" + ) assert dump_mock.call_count == 2 assert zip_mock.call_count == 1 @@ -264,7 +276,9 @@ def test_store_backtest_results(testdatadir, mocker): dump_mock.reset_mock() zip_mock.reset_mock() filename = testdatadir / "testresult.json" - store_backtest_results({"exportfilename": filename}, data, "2022_01_01_15_05_13") + store_backtest_results( + {"exportfilename": filename, "original_config": {}}, data, "2022_01_01_15_05_13" + ) assert dump_mock.call_count == 2 assert zip_mock.call_count == 1 assert isinstance(dump_mock.call_args_list[0][0][0], Path) @@ -272,9 +286,16 @@ def test_store_backtest_results(testdatadir, mocker): assert str(dump_mock.call_args_list[0][0][0]).startswith(str(testdatadir / "testresult")) -def test_store_backtest_results_real(tmp_path): +def test_store_backtest_results_real(tmp_path, caplog): data = {"metadata": {}, "strategy": {}, "strategy_comparison": []} - store_backtest_results({"exportfilename": tmp_path}, data, "2022_01_01_15_05_13") + config = { + "exportfilename": tmp_path, + "original_config": {}, + } + store_backtest_results( + config, data, "2022_01_01_15_05_13", strategy_files={"DefStrat": "NoFile"} + ) + assert log_has_re(r"Strategy file .* does not exist\. Skipping\.", caplog) zip_file = tmp_path / "backtest-result-2022_01_01_15_05_13.zip" assert zip_file.is_file() @@ -287,8 +308,19 @@ def test_store_backtest_results_real(tmp_path): fn = get_latest_backtest_filename(tmp_path) assert fn == "backtest-result-2022_01_01_15_05_13.zip" + strategy_test_dir = Path(__file__).parent.parent / "strategy" / "strats" + + shutil.copy(strategy_test_dir / "strategy_test_v3.py", tmp_path) + params_file = tmp_path / "strategy_test_v3.json" + with params_file.open("w") as f: + f.write("""{"strategy_name": "TurtleStrategyX5","params":{}}""") + store_backtest_results( - {"exportfilename": tmp_path}, data, "2024_01_01_15_05_25", market_change_data=pd.DataFrame() + config, + data, + "2024_01_01_15_05_25", + market_change_data=pd.DataFrame(), + strategy_files={"DefStrat": str(tmp_path / "strategy_test_v3.py")}, ) zip_file = tmp_path / "backtest-result-2024_01_01_15_05_25.zip" assert zip_file.is_file() @@ -298,6 +330,22 @@ def test_store_backtest_results_real(tmp_path): with ZipFile(zip_file, "r") as zipf: assert "backtest-result-2024_01_01_15_05_25.json" in zipf.namelist() assert "backtest-result-2024_01_01_15_05_25_market_change.feather" in zipf.namelist() + assert "backtest-result-2024_01_01_15_05_25_config.json" in zipf.namelist() + # strategy file is copied to the zip file + assert "backtest-result-2024_01_01_15_05_25_DefStrat.py" in zipf.namelist() + # compare the content of the strategy file + with zipf.open("backtest-result-2024_01_01_15_05_25_DefStrat.py") as strategy_file: + strategy_content = strategy_file.read() + with (strategy_test_dir / "strategy_test_v3.py").open("rb") as original_file: + original_content = original_file.read() + assert strategy_content == original_content + assert "backtest-result-2024_01_01_15_05_25_DefStrat.py" in zipf.namelist() + with zipf.open("backtest-result-2024_01_01_15_05_25_DefStrat.json") as pf: + params_content = pf.read() + with params_file.open("rb") as original_file: + original_content = original_file.read() + assert params_content == original_content + assert (tmp_path / LAST_BT_RESULT_FN).is_file() # Last file reference should be updated @@ -313,6 +361,7 @@ def test_write_read_backtest_candles(tmp_path): "exportfilename": tmp_path, "export": "signals", "runmode": "backtest", + "original_config": {}, } # test directory exporting sample_date = "2022_01_01_15_05_13" @@ -381,6 +430,10 @@ def test_generate_pair_metrics(): "profit_ratio": [0.1, 0.2], "profit_abs": [0.2, 0.4], "trade_duration": [10, 30], + "close_date": [ + dt_utc(2017, 11, 14, 21, 35, 00), + dt_utc(2017, 11, 14, 22, 10, 00), + ], "wins": [2, 0], "draws": [0, 0], "losses": [0, 0], @@ -388,7 +441,12 @@ def test_generate_pair_metrics(): ) pair_results = generate_pair_metrics( - ["ETH/BTC"], stake_currency="BTC", starting_balance=2, results=results + ["ETH/BTC"], + stake_currency="BTC", + starting_balance=2, + results=results, + min_date=dt_from_ts(1510688220), + max_date=dt_from_ts(1510700340), ) assert isinstance(pair_results, list) assert len(pair_results) == 2 @@ -473,6 +531,11 @@ def test_text_table_exit_reason(capsys): "profit_ratio": [0.1, 0.2, -0.1], "profit_abs": [0.2, 0.4, -0.2], "trade_duration": [10, 30, 10], + "close_date": [ + dt_utc(2017, 11, 14, 21, 35, 00), + dt_utc(2017, 11, 14, 22, 10, 00), + dt_utc(2017, 11, 14, 22, 43, 00), + ], "wins": [2, 0, 0], "draws": [0, 0, 0], "losses": [0, 0, 1], @@ -481,7 +544,12 @@ def test_text_table_exit_reason(capsys): ) exit_reason_stats = generate_tag_metrics( - "exit_reason", starting_balance=22, results=results, skip_nan=False + "exit_reason", + starting_balance=22, + results=results, + min_date=dt_from_ts(1510688220), + max_date=dt_from_ts(1510700340), + skip_nan=False, ) text_table_tags("exit_tag", exit_reason_stats, "BTC") text = capsys.readouterr().out @@ -511,6 +579,11 @@ def test_generate_sell_reason_stats(): "profit_ratio": [0.1, 0.2, -0.1], "profit_abs": [0.2, 0.4, -0.2], "trade_duration": [10, 30, 10], + "close_date": [ + dt_utc(2017, 11, 14, 21, 35, 00), + dt_utc(2017, 11, 14, 22, 10, 00), + dt_utc(2017, 11, 14, 22, 43, 00), + ], "wins": [2, 0, 0], "draws": [0, 0, 0], "losses": [0, 0, 1], @@ -519,7 +592,12 @@ def test_generate_sell_reason_stats(): ) exit_reason_stats = generate_tag_metrics( - "exit_reason", starting_balance=22, results=results, skip_nan=False + "exit_reason", + starting_balance=22, + results=results, + min_date=dt_from_ts(1510688220), + max_date=dt_from_ts(1510700340), + skip_nan=False, ) roi_result = exit_reason_stats[0] assert roi_result["key"] == "roi" @@ -587,7 +665,7 @@ def test_generate_periodic_breakdown_stats(testdatadir): day = res[0] assert "date" in day assert "draws" in day - assert "loses" in day + assert "losses" in day assert "wins" in day assert "profit_abs" in day diff --git a/tests/persistence/test_persistence.py b/tests/persistence/test_persistence.py index c30c27244..d07bd7192 100644 --- a/tests/persistence/test_persistence.py +++ b/tests/persistence/test_persistence.py @@ -880,68 +880,68 @@ def test_calc_close_trade_price( "exchange,is_short,lev,close_rate,fee_close,profit,profit_ratio,trading_mode,funding_fees", [ ("binance", False, 1, 2.1, 0.0025, 2.6925, 0.044763092, spot, 0), - ("binance", False, 3, 2.1, 0.0025, 2.69166667, 0.134247714, margin, 0), + ("binance", False, 3, 2.1, 0.0025, 8.075, 0.134247714, margin, 0), ("binance", True, 1, 2.1, 0.0025, -3.3088157, -0.055285142, margin, 0), - ("binance", True, 3, 2.1, 0.0025, -3.3088157, -0.16585542, margin, 0), + ("binance", True, 3, 2.1, 0.0025, -9.92644709, -0.16585542, margin, 0), ("binance", False, 1, 1.9, 0.0025, -3.2925, -0.054738154, margin, 0), - ("binance", False, 3, 1.9, 0.0025, -3.29333333, -0.164256026, margin, 0), + ("binance", False, 3, 1.9, 0.0025, -9.88, -0.164256026, margin, 0), ("binance", True, 1, 1.9, 0.0025, 2.70630953, 0.0452182043, margin, 0), - ("binance", True, 3, 1.9, 0.0025, 2.70630953, 0.135654613, margin, 0), + ("binance", True, 3, 1.9, 0.0025, 8.11892859, 0.135654613, margin, 0), ("binance", False, 1, 2.2, 0.0025, 5.685, 0.09451371, margin, 0), - ("binance", False, 3, 2.2, 0.0025, 5.68416667, 0.28349958, margin, 0), + ("binance", False, 3, 2.2, 0.0025, 17.0525, 0.28349958, margin, 0), ("binance", True, 1, 2.2, 0.0025, -6.3163784, -0.10553681, margin, 0), - ("binance", True, 3, 2.2, 0.0025, -6.3163784, -0.31661044, margin, 0), + ("binance", True, 3, 2.2, 0.0025, -18.94913, -0.31661044, margin, 0), # Kraken ("kraken", False, 1, 2.1, 0.0025, 2.6925, 0.044763092, spot, 0), - ("kraken", False, 3, 2.1, 0.0025, 2.6525, 0.132294264, margin, 0), + ("kraken", False, 3, 2.1, 0.0025, 7.9575, 0.132294264, margin, 0), ("kraken", True, 1, 2.1, 0.0025, -3.3706575, -0.056318421, margin, 0), - ("kraken", True, 3, 2.1, 0.0025, -3.3706575, -0.168955263, margin, 0), + ("kraken", True, 3, 2.1, 0.0025, -10.1119725, -0.168955263, margin, 0), ("kraken", False, 1, 1.9, 0.0025, -3.2925, -0.054738154, margin, 0), - ("kraken", False, 3, 1.9, 0.0025, -3.3325, -0.166209476, margin, 0), + ("kraken", False, 3, 1.9, 0.0025, -9.9975, -0.166209476, margin, 0), ("kraken", True, 1, 1.9, 0.0025, 2.6503575, 0.044283333, margin, 0), - ("kraken", True, 3, 1.9, 0.0025, 2.6503575, 0.132850000, margin, 0), + ("kraken", True, 3, 1.9, 0.0025, 7.9510725, 0.132850000, margin, 0), ("kraken", False, 1, 2.2, 0.0025, 5.685, 0.09451371, margin, 0), - ("kraken", False, 3, 2.2, 0.0025, 5.645, 0.28154613, margin, 0), + ("kraken", False, 3, 2.2, 0.0025, 16.935, 0.28154613, margin, 0), ("kraken", True, 1, 2.2, 0.0025, -6.381165, -0.1066192, margin, 0), - ("kraken", True, 3, 2.2, 0.0025, -6.381165, -0.3198578, margin, 0), + ("kraken", True, 3, 2.2, 0.0025, -19.143495, -0.3198578, margin, 0), ("binance", False, 1, 2.1, 0.003, 2.66100000, 0.044239401, spot, 0), ("binance", False, 1, 1.9, 0.003, -3.3209999, -0.055211970, spot, 0), ("binance", False, 1, 2.2, 0.003, 5.6520000, 0.093965087, spot, 0), # FUTURES, funding_fee=1 ("binance", False, 1, 2.1, 0.0025, 3.6925, 0.06138819, futures, 1), - ("binance", False, 3, 2.1, 0.0025, 3.6925, 0.18416458, futures, 1), + ("binance", False, 3, 2.1, 0.0025, 9.0775, 0.15091438, futures, 1), ("binance", True, 1, 2.1, 0.0025, -2.3074999, -0.03855472, futures, 1), - ("binance", True, 3, 2.1, 0.0025, -2.3074999, -0.11566416, futures, 1), + ("binance", True, 3, 2.1, 0.0025, -8.9225, -0.14908104, futures, 1), ("binance", False, 1, 1.9, 0.0025, -2.2925, -0.03811305, futures, 1), - ("binance", False, 3, 1.9, 0.0025, -2.2925, -0.11433915, futures, 1), + ("binance", False, 3, 1.9, 0.0025, -8.8775, -0.14758936, futures, 1), ("binance", True, 1, 1.9, 0.0025, 3.7075, 0.06194653, futures, 1), - ("binance", True, 3, 1.9, 0.0025, 3.7075, 0.18583959, futures, 1), + ("binance", True, 3, 1.9, 0.0025, 9.1225, 0.15242272, futures, 1), ("binance", False, 1, 2.2, 0.0025, 6.685, 0.11113881, futures, 1), - ("binance", False, 3, 2.2, 0.0025, 6.685, 0.33341645, futures, 1), + ("binance", False, 3, 2.2, 0.0025, 18.055, 0.30016625, futures, 1), ("binance", True, 1, 2.2, 0.0025, -5.315, -0.08880534, futures, 1), - ("binance", True, 3, 2.2, 0.0025, -5.315, -0.26641604, futures, 1), + ("binance", True, 3, 2.2, 0.0025, -17.945, -0.29983292, futures, 1), # FUTURES, funding_fee=-1 ("binance", False, 1, 2.1, 0.0025, 1.6925, 0.02813798, futures, -1), - ("binance", False, 3, 2.1, 0.0025, 1.6925, 0.08441396, futures, -1), + ("binance", False, 3, 2.1, 0.0025, 7.0775, 0.11766417, futures, -1), ("binance", True, 1, 2.1, 0.0025, -4.307499, -0.07197159, futures, -1), - ("binance", True, 3, 2.1, 0.0025, -4.307499, -0.21591478, futures, -1), + ("binance", True, 3, 2.1, 0.0025, -10.92249, -0.18249791, futures, -1), ("binance", False, 1, 1.9, 0.0025, -4.292499, -0.07136325, futures, -1), - ("binance", False, 3, 1.9, 0.0025, -4.292499, -0.21408977, futures, -1), + ("binance", False, 3, 1.9, 0.0025, -10.87749, -0.18083957, futures, -1), ("binance", True, 1, 1.9, 0.0025, 1.7075, 0.02852965, futures, -1), - ("binance", True, 3, 1.9, 0.0025, 1.7075, 0.08558897, futures, -1), + ("binance", True, 3, 1.9, 0.0025, 7.1225, 0.11900585, futures, -1), ("binance", False, 1, 2.2, 0.0025, 4.684999, 0.07788861, futures, -1), - ("binance", False, 3, 2.2, 0.0025, 4.684999, 0.23366583, futures, -1), + ("binance", False, 3, 2.2, 0.0025, 16.055, 0.26691604, futures, -1), ("binance", True, 1, 2.2, 0.0025, -7.315, -0.12222222, futures, -1), - ("binance", True, 3, 2.2, 0.0025, -7.315, -0.36666666, futures, -1), + ("binance", True, 3, 2.2, 0.0025, -19.945, -0.33324979, futures, -1), # FUTURES, funding_fee=0 ("binance", False, 1, 2.1, 0.0025, 2.6925, 0.04476309, futures, 0), - ("binance", False, 3, 2.1, 0.0025, 2.6925, 0.13428928, futures, 0), + ("binance", False, 3, 2.1, 0.0025, 8.0775, 0.13428928, futures, 0), ("binance", True, 1, 2.1, 0.0025, -3.3074999, -0.05526316, futures, 0), - ("binance", True, 3, 2.1, 0.0025, -3.3074999, -0.16578947, futures, 0), + ("binance", True, 3, 2.1, 0.0025, -9.9224997, -0.16578947, futures, 0), ("binance", False, 1, 1.9, 0.0025, -3.2925, -0.05473815, futures, 0), - ("binance", False, 3, 1.9, 0.0025, -3.2925, -0.16421446, futures, 0), + ("binance", False, 3, 1.9, 0.0025, -9.8775, -0.16421446, futures, 0), ("binance", True, 1, 1.9, 0.0025, 2.7075, 0.0452381, futures, 0), - ("binance", True, 3, 1.9, 0.0025, 2.7075, 0.13571429, futures, 0), + ("binance", True, 3, 1.9, 0.0025, 8.1225, 0.13571429, futures, 0), ], ) @pytest.mark.usefixtures("init_persistence") @@ -1162,7 +1162,7 @@ def test_calc_profit( trade = Trade( pair="ADA/USDT", stake_amount=60.0, - amount=30.0, + amount=30.0 * lev, open_rate=2.0, open_date=datetime.now(tz=timezone.utc) - timedelta(minutes=10), interest_rate=0.0005, @@ -1183,7 +1183,7 @@ def test_calc_profit( assert pytest.approx(val) == profit_res.profit_abs assert pytest.approx(profit_res.total_profit) == round(profit, 8) - # assert pytest.approx(profit_res.total_profit_ratio) == round(profit_ratio, 8) + assert pytest.approx(profit_res.total_profit_ratio) == round(profit_ratio, 8) assert pytest.approx(trade.calc_profit(rate=close_rate)) == round(profit, 8) assert pytest.approx(trade.calc_profit_ratio(rate=close_rate)) == round(profit_ratio, 8) @@ -1193,7 +1193,7 @@ def test_calc_profit( assert pytest.approx(profit_res2.profit_ratio) == round(profit_ratio, 8) assert pytest.approx(profit_res2.total_profit) == round(profit, 8) - # assert pytest.approx(profit_res2.total_profit_ratio) == round(profit_ratio, 8) + assert pytest.approx(profit_res2.total_profit_ratio) == round(profit_ratio, 8) assert pytest.approx(trade.calc_profit(close_rate, trade.amount, trade.open_rate)) == round( profit, 8 diff --git a/tests/persistence/test_trade_fromjson.py b/tests/persistence/test_trade_fromjson.py index 686667f85..ff717751e 100644 --- a/tests/persistence/test_trade_fromjson.py +++ b/tests/persistence/test_trade_fromjson.py @@ -276,3 +276,67 @@ def test_trade_serialize_load_back(fee): trade3 = LocalTrade.from_json(trade_string) assert len(trade3.orders) == len(t.orders) + + +@pytest.mark.usefixtures("init_persistence") +def test_trade_fromjson_backtesting(): + """ + trade.from_json should be able to load a trade output via backtesting. + """ + trade_string = """ + { + "pair":"XRP/USDT:USDT", + "stake_amount":3015.294001, + "max_stake_amount":60305.88002, + "amount":94612.3, + "open_date":"2024-03-02 10:40:00+00:00", + "close_date":"2024-03-02 11:10:00+00:00", + "open_rate":0.6374, + "close_rate":0.6399, + "fee_open":0.0005, + "fee_close":0.0005, + "trade_duration":30, + "profit_ratio":-0.09853216535933962, + "profit_abs":-296.95489539, + "exit_reason":"trailing_stop_loss", + "initial_stop_loss_abs":0.6689, + "initial_stop_loss_ratio":-0.99, + "stop_loss_abs":0.6399, + "stop_loss_ratio":-0.3368287257705749, + "min_rate":0.6294, + "max_rate":0.6421, + "is_open":false, + "enter_tag":"[0.6373, 0.5993, 0.64]", + "leverage":20, + "is_short":true, + "open_timestamp":1709376000000, + "close_timestamp":1709377800000, + "orders":[ + { + "amount":94612.3, + "safe_price":0.6374, + "ft_order_side":"sell", + "order_filled_timestamp":1709376000000, + "ft_is_entry":true, + "ft_order_tag":"[0.6373, 0.5993, 0.64]", + "cost":60336.032960009994 + }, + { + "amount":94612.3, + "safe_price":0.6399, + "ft_order_side":"buy", + "order_filled_timestamp":1709377800000, + "ft_is_entry":false, + "ft_order_tag":"trailing_stop_loss", + "cost":60572.681975385 + } + ] + } + """ + + trade = Trade.from_json(trade_string) + Trade.session.add(trade) + Trade.commit() + + # Trade-id not given - use first available + assert trade.id == 1 diff --git a/tests/plugins/test_pairlist.py b/tests/plugins/test_pairlist.py index a4f66a702..0f133242b 100644 --- a/tests/plugins/test_pairlist.py +++ b/tests/plugins/test_pairlist.py @@ -281,7 +281,7 @@ def test_remove_logs_for_pairs_already_in_blacklist(mocker, markets, static_pl_c for _ in range(3): new_whitelist = freqtrade.pairlists.verify_blacklist( - whitelist + ["BLK/BTC"], logger.warning + [*whitelist, "BLK/BTC"], logger.warning ) # Ensure that the pair is removed from the white list, and properly logged. assert set(whitelist) == set(new_whitelist) @@ -2032,11 +2032,7 @@ def test_expand_pairlist(wildcardlist, pairs, expected): }, } assert sorted(dynamic_expand_pairlist(conf, pairs)) == sorted( - expected - + [ - "BTC/USDT:USDT", - "XRP/BUSD", - ] + [*expected, "BTC/USDT:USDT", "XRP/BUSD"] ) @@ -2138,7 +2134,7 @@ def test_ProducerPairlist(mocker, whitelist_conf, markets): dp = DataProvider(whitelist_conf, exchange, None) pairs = ["ETH/BTC", "LTC/BTC", "XRP/BTC"] # different producer - dp._set_producer_pairs(pairs + ["MEEP/USDT"], "default") + dp._set_producer_pairs([*pairs, "MEEP/USDT"], "default") pm = PairListManager(exchange, whitelist_conf, dp) pm.refresh_pairlist() assert pm.whitelist == [] @@ -2161,7 +2157,7 @@ def test_ProducerPairlist(mocker, whitelist_conf, markets): pm = PairListManager(exchange, whitelist_conf, dp) pm.refresh_pairlist() assert len(pm.whitelist) == 4 - assert pm.whitelist == ["TKN/BTC"] + pairs + assert pm.whitelist == ["TKN/BTC", *pairs] @pytest.mark.usefixtures("init_persistence") diff --git a/tests/plugins/test_protections.py b/tests/plugins/test_protections.py index bec2671eb..ef2c7e1d3 100644 --- a/tests/plugins/test_protections.py +++ b/tests/plugins/test_protections.py @@ -19,8 +19,8 @@ def generate_mock_trade( fee: float, is_open: bool, exit_reason: str = ExitType.EXIT_SIGNAL, - min_ago_open: int = None, - min_ago_close: int = None, + min_ago_open: int | None = None, + min_ago_close: int | None = None, profit_rate: float = 0.9, is_short: bool = False, ): diff --git a/tests/rpc/test_rpc.py b/tests/rpc/test_rpc.py index 71eaa3bfd..7d1b87b55 100644 --- a/tests/rpc/test_rpc.py +++ b/tests/rpc/test_rpc.py @@ -197,7 +197,7 @@ def test_rpc_trade_status(default_conf, ticker, fee, mocker) -> None: response.update( { "max_stake_amount": 0.001, - "total_profit_ratio": pytest.approx(-0.00409153), + "total_profit_ratio": pytest.approx(-0.00408133), "has_open_orders": False, } ) @@ -228,7 +228,8 @@ def test_rpc_trade_status(default_conf, ticker, fee, mocker) -> None: assert results[0] == response_norate -def test_rpc_status_table(default_conf, ticker, fee, mocker) -> None: +def test_rpc_status_table(default_conf, ticker, fee, mocker, time_machine) -> None: + time_machine.move_to("2024-05-10 11:15:00 +00:00", tick=False) mocker.patch.multiple( "freqtrade.rpc.fiat_convert.FtCoinGeckoApi", get_price=MagicMock(return_value={"bitcoin": {"usd": 15000.0}}), @@ -577,7 +578,7 @@ def test_rpc_balance_handle(default_conf_usdt, mocker, tickers, proxy_coin, marg "symbol": "ETH/USDT:USDT", "timestamp": None, "datetime": None, - "initialMargin": 0.0, + "initialMargin": 20, "initialMarginPercentage": None, "maintenanceMargin": 0.0, "maintenanceMarginPercentage": 0.005, @@ -590,8 +591,9 @@ def test_rpc_balance_handle(default_conf_usdt, mocker, tickers, proxy_coin, marg "marginRatio": None, "liquidationPrice": 0.0, "markPrice": 2896.41, - "collateral": 20, - "marginType": "isolated", + # Collateral is in USDT - and can be higher than position size in cross mode + "collateral": 50, + "marginType": "cross", "side": "short", "percentage": None, } @@ -805,19 +807,19 @@ def test_rpc_stop(mocker, default_conf) -> None: assert freqtradebot.state == State.STOPPED -def test_rpc_stopentry(mocker, default_conf) -> None: +def test_rpc_pause(mocker, default_conf) -> None: mocker.patch("freqtrade.rpc.telegram.Telegram", MagicMock()) mocker.patch.multiple(EXMS, fetch_ticker=MagicMock()) freqtradebot = get_patched_freqtradebot(mocker, default_conf) patch_get_signal(freqtradebot) rpc = RPC(freqtradebot) - freqtradebot.state = State.RUNNING + freqtradebot.state = State.PAUSED - assert freqtradebot.config["max_open_trades"] != 0 - result = rpc._rpc_stopentry() - assert {"status": "No more entries will occur from now. Run /reload_config to reset."} == result - assert freqtradebot.config["max_open_trades"] == 0 + result = rpc._rpc_pause() + assert { + "status": "paused, no more entries will occur from now. Run /start to enable entries." + } == result def test_rpc_force_exit(default_conf, ticker, fee, mocker) -> None: diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index af33cd95c..9bb7e8318 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -24,7 +24,7 @@ from freqtrade.enums import CandleType, RunMode, State, TradingMode from freqtrade.exceptions import DependencyException, ExchangeError, OperationalException from freqtrade.loggers import setup_logging, setup_logging_pre from freqtrade.optimize.backtesting import Backtesting -from freqtrade.persistence import Trade +from freqtrade.persistence import CustomDataWrapper, Trade from freqtrade.rpc import RPC from freqtrade.rpc.api_server import ApiServer from freqtrade.rpc.api_server.api_auth import create_token, get_user_from_token @@ -533,23 +533,26 @@ def test_api_reloadconf(botclient): assert ftbot.state == State.RELOAD_CONFIG -def test_api_stopentry(botclient): +def test_api_pause(botclient): ftbot, client = botclient - assert ftbot.config["max_open_trades"] != 0 - rc = client_post(client, f"{BASE_URI}/stopbuy") + rc = client_post(client, f"{BASE_URI}/pause") assert_response(rc) assert rc.json() == { - "status": "No more entries will occur from now. Run /reload_config to reset." + "status": "paused, no more entries will occur from now. Run /start to enable entries." + } + + rc = client_post(client, f"{BASE_URI}/pause") + assert_response(rc) + assert rc.json() == { + "status": "paused, no more entries will occur from now. Run /start to enable entries." } - assert ftbot.config["max_open_trades"] == 0 rc = client_post(client, f"{BASE_URI}/stopentry") assert_response(rc) assert rc.json() == { - "status": "No more entries will occur from now. Run /reload_config to reset." + "status": "paused, no more entries will occur from now. Run /start to enable entries." } - assert ftbot.config["max_open_trades"] == 0 def test_api_balance(botclient, mocker, rpc_balance, tickers): @@ -773,12 +776,28 @@ def test_api_trades(botclient, mocker, fee, markets, is_short): assert rc.json()["trades_count"] == 2 assert rc.json()["total_trades"] == 2 assert rc.json()["trades"][0]["is_short"] == is_short + # Ensure the trades are sorted by trade_id (the default, see below) + assert rc.json()["trades"][0]["trade_id"] == 2 + assert rc.json()["trades"][1]["trade_id"] == 3 + rc = client_get(client, f"{BASE_URI}/trades?limit=1") assert_response(rc) assert len(rc.json()["trades"]) == 1 assert rc.json()["trades_count"] == 1 assert rc.json()["total_trades"] == 2 + # Test ascending order (default) + rc = client_get(client, f"{BASE_URI}/trades?order_by_id=true") + assert_response(rc) + assert rc.json()["trades"][0]["trade_id"] == 2 + assert rc.json()["trades"][1]["trade_id"] == 3 + + # Test descending order + rc = client_get(client, f"{BASE_URI}/trades?order_by_id=false") + assert_response(rc) + assert rc.json()["trades"][0]["trade_id"] == 3 + assert rc.json()["trades"][1]["trade_id"] == 2 + @pytest.mark.parametrize("is_short", [True, False]) def test_api_trade_single(botclient, mocker, fee, ticker, markets, is_short): @@ -802,6 +821,211 @@ def test_api_trade_single(botclient, mocker, fee, ticker, markets, is_short): assert rc.json()["is_short"] == is_short +@pytest.mark.usefixtures("init_persistence") +def test_api_custom_data_single_trade(botclient, fee): + Trade.reset_trades() + CustomDataWrapper.reset_custom_data() + + create_mock_trades_usdt(fee, use_db=True) + + trade1 = Trade.get_trades_proxy()[0] + + assert trade1.get_all_custom_data() == [] + + trade1.set_custom_data("test_str", "test_value") + trade1.set_custom_data("test_int", 0) + trade1.set_custom_data("test_float", 1.54) + trade1.set_custom_data("test_bool", True) + trade1.set_custom_data("test_dict", {"test": "vl"}) + + trade1.set_custom_data("test_int", 1) + + _, client = botclient + + # CASE 1 Checking all custom data of trade 1 + rc = client_get(client, f"{BASE_URI}/trades/1/custom-data") + assert_response(rc) + + # Validate response JSON structure + response_json = rc.json() + + assert len(response_json) == 1 + + res_cust_data = response_json[0]["custom_data"] + expected_data_td_1 = [ + {"key": "test_str", "type": "str", "value": "test_value"}, + {"key": "test_int", "type": "int", "value": 1}, + {"key": "test_float", "type": "float", "value": 1.54}, + {"key": "test_bool", "type": "bool", "value": True}, + {"key": "test_dict", "type": "dict", "value": {"test": "vl"}}, + ] + + # Ensure response contains exactly the expected number of entries + assert len(res_cust_data) == len(expected_data_td_1), ( + f"Expected {len(expected_data_td_1)} entries, but got {len(res_cust_data)}.\n" + ) + + # Validate each expected entry + for expected in expected_data_td_1: + matched_item = None + for item in res_cust_data: + if item["key"] == expected["key"]: + matched_item = item + break + + assert matched_item is not None, ( + f"Missing expected entry for key '{expected['key']}'\nExpected: {expected}\n" + ) + + # Validate individual fields and print only incorrect values + mismatches = [] + for field in ["key", "type", "value"]: + if matched_item[field] != expected[field]: + mismatches.append(f"{field}: Expected {expected[field]}, Got {matched_item[field]}") + + assert not mismatches, f"Error in entry '{expected['key']}':\n" + "\n".join(mismatches) + + # CASE 2 Checking specific existing key custom data of trade 1 + rc = client_get(client, f"{BASE_URI}/trades/1/custom-data?key=test_dict") + assert_response(rc, 200) + + # CASE 3 Checking specific not existing key custom data of trade 1 + rc = client_get(client, f"{BASE_URI}/trades/1/custom-data&key=test") + assert_response(rc, 404) + + # CASE 4 Trying to get custom-data from not existing trade + rc = client_get(client, f"{BASE_URI}/trades/13/custom-data") + assert_response(rc, 404) + assert rc.json()["detail"] == "No trade found for trade_id: 13" + + +@pytest.mark.usefixtures("init_persistence") +def test_api_custom_data_multiple_open_trades(botclient, fee): + use_db = True + Trade.use_db = use_db + Trade.reset_trades() + CustomDataWrapper.reset_custom_data() + create_mock_trades(fee, False, use_db) + trades = Trade.get_trades_proxy() + assert len(trades) == 6 + + assert isinstance(trades[0], Trade) + + trades = Trade.get_trades_proxy(is_open=True) + assert len(trades) == 4 + + create_mock_trades_usdt(fee, use_db=True) + + trade1 = Trade.get_trades_proxy(is_open=True)[0] + trade2 = Trade.get_trades_proxy(is_open=True)[1] + + # Initially, no custom data should be present. + assert trade1.get_all_custom_data() == [] + assert trade2.get_all_custom_data() == [] + + # Set custom data for the two open trades. + trade1.set_custom_data("test_str", "test_value_t1") + trade1.set_custom_data("test_float", 1.54) + trade1.set_custom_data("test_dict", {"test_t1": "vl_t1"}) + + trade2.set_custom_data("test_str", "test_value_t2") + trade2.set_custom_data("test_float", 1.55) + trade2.set_custom_data("test_dict", {"test_t2": "vl_t2"}) + + _, client = botclient + + # CASE 1: Checking all custom data for both trades. + rc = client_get(client, f"{BASE_URI}/trades/open/custom-data") + assert_response(rc) + + response_json = rc.json() + + # Expecting two trade entries in the response + assert len(response_json) == 2, f"Expected 2 trade entries, but got {len(response_json)}.\n" + + # Define expected custom data for each trade. + # The keys now use the actual trade_ids from the custom data. + expected_custom_data = { + 1: [ + { + "key": "test_str", + "type": "str", + "value": "test_value_t1", + }, + { + "key": "test_float", + "type": "float", + "value": 1.54, + }, + { + "key": "test_dict", + "type": "dict", + "value": {"test_t1": "vl_t1"}, + }, + ], + 4: [ + { + "key": "test_str", + "type": "str", + "value": "test_value_t2", + }, + { + "key": "test_float", + "type": "float", + "value": 1.55, + }, + { + "key": "test_dict", + "type": "dict", + "value": {"test_t2": "vl_t2"}, + }, + ], + } + + # Iterate over each trade's data in the response and validate entries. + for trade_entry in response_json: + trade_id = trade_entry.get("trade_id") + assert trade_id in expected_custom_data, f"\nUnexpected trade_id: {trade_id}" + + custom_data_list = trade_entry.get("custom_data") + expected_data = expected_custom_data[trade_id] + assert len(custom_data_list) == len(expected_data), ( + f"Error for trade_id {trade_id}: " + f"Expected {len(expected_data)} entries, but got {len(custom_data_list)}.\n" + ) + + # For each expected entry, check that the response contains the correct entry. + for expected in expected_data: + matched_item = None + for item in custom_data_list: + if item["key"] == expected["key"]: + matched_item = item + break + + assert matched_item is not None, ( + f"For trade_id {trade_id}, " + f"missing expected entry for key '{expected['key']}'\n" + f"Expected: {expected}\n" + ) + + # Validate key fields. + mismatches = [] + for field in ["key", "type", "value"]: + if matched_item[field] != expected[field]: + mismatches.append( + f"{field}: Expected {expected[field]}, Got {matched_item[field]}" + ) + # Check for field presence of created_at and updated_at without comparing values. + for field in ["created_at", "updated_at"]: + if field not in matched_item: + mismatches.append(f"Missing field: {field}") + + assert not mismatches, ( + f"Error in entry '{expected['key']}' for trade_id {trade_id}:\n" + + "\n".join(mismatches) + ) + + @pytest.mark.parametrize("is_short", [True, False]) def test_api_delete_trade(botclient, mocker, fee, markets, is_short): ftbot, client = botclient @@ -1998,8 +2222,8 @@ def test_api_pair_history(botclient, tmp_path, mocker): assert len(result["columns"]) == col_count assert len(result["all_columns"]) == 25 assert len(data[0]) == col_count - date_col_idx = [idx for idx, c in enumerate(result["columns"]) if c == "date"][0] - rsi_col_idx = [idx for idx, c in enumerate(result["columns"]) if c == "rsi"][0] + date_col_idx = next(idx for idx, c in enumerate(result["columns"]) if c == "date") + rsi_col_idx = next(idx for idx, c in enumerate(result["columns"]) if c == "rsi") assert data[0][date_col_idx] == "2018-01-11T00:00:00Z" assert data[0][rsi_col_idx] is not None @@ -2224,7 +2448,7 @@ def test_api_exchanges(botclient): response = rc.json() assert isinstance(response["exchanges"], list) assert len(response["exchanges"]) > 20 - okx = [x for x in response["exchanges"] if x["classname"] == "okx"][0] + okx = next(x for x in response["exchanges"] if x["classname"] == "okx") assert okx == { "classname": "okx", "name": "OKX", @@ -2240,7 +2464,7 @@ def test_api_exchanges(botclient): ], } - mexc = [x for x in response["exchanges"] if x["classname"] == "mexc"][0] + mexc = next(x for x in response["exchanges"] if x["classname"] == "mexc") assert mexc == { "classname": "mexc", "name": "MEXC Global", @@ -2252,7 +2476,7 @@ def test_api_exchanges(botclient): "alias_for": None, "trade_modes": [{"trading_mode": "spot", "margin_mode": ""}], } - waves = [x for x in response["exchanges"] if x["classname"] == "wavesexchange"][0] + waves = next(x for x in response["exchanges"] if x["classname"] == "wavesexchange") assert waves == { "classname": "wavesexchange", "name": "Waves.Exchange", @@ -2346,10 +2570,10 @@ def test_api_pairlists_available(botclient, tmp_path): assert len([r for r in response["pairlists"] if r["name"] == "VolumePairList"]) == 1 assert len([r for r in response["pairlists"] if r["name"] == "StaticPairList"]) == 1 - volumepl = [r for r in response["pairlists"] if r["name"] == "VolumePairList"][0] + volumepl = next(r for r in response["pairlists"] if r["name"] == "VolumePairList") assert volumepl["is_pairlist_generator"] is True assert len(volumepl["params"]) > 1 - age_pl = [r for r in response["pairlists"] if r["name"] == "AgeFilter"][0] + age_pl = next(r for r in response["pairlists"] if r["name"] == "AgeFilter") assert age_pl["is_pairlist_generator"] is False assert len(volumepl["params"]) > 2 @@ -2645,7 +2869,7 @@ def test_api_backtesting(botclient, mocker, fee, caplog, tmp_path): def test_api_backtest_history(botclient, mocker, testdatadir): ftbot, client = botclient mocker.patch( - "freqtrade.data.btanalysis._get_backtest_files", + "freqtrade.data.btanalysis.bt_fileutils._get_backtest_files", return_value=[ testdatadir / "backtest_results/backtest-result_multistrat.json", testdatadir / "backtest_results/backtest-result.json", diff --git a/tests/rpc/test_rpc_telegram.py b/tests/rpc/test_rpc_telegram.py index 1882e09c4..3409cc0e5 100644 --- a/tests/rpc/test_rpc_telegram.py +++ b/tests/rpc/test_rpc_telegram.py @@ -6,7 +6,7 @@ import asyncio import logging import re import threading -from datetime import datetime, timedelta, timezone +from datetime import timedelta from functools import reduce from random import choice, randint from string import ascii_uppercase @@ -16,7 +16,7 @@ import pytest import time_machine from pandas import DataFrame from sqlalchemy import select -from telegram import Chat, Message, ReplyKeyboardMarkup, Update +from telegram import Chat, Message, ReplyKeyboardMarkup, Update, User from telegram.error import BadRequest, NetworkError, TelegramError from freqtrade import __version__ @@ -67,7 +67,12 @@ def default_conf(default_conf) -> dict: @pytest.fixture def update(): - message = Message(0, datetime.now(timezone.utc), Chat(1235, 0)) + message = Message( + 0, + dt_now(), + Chat(1235, 0), + from_user=User(5432, "test", is_bot=False), + ) _update = Update(0, message=message) return _update @@ -164,7 +169,7 @@ def test_telegram_init(default_conf, mocker, caplog) -> None: "['stats'], ['daily'], ['weekly'], ['monthly'], " "['count'], ['locks'], ['delete_locks', 'unlock'], " "['reload_conf', 'reload_config'], ['show_conf', 'show_config'], " - "['stopbuy', 'stopentry'], ['whitelist'], ['blacklist'], " + "['pause', 'stopbuy', 'stopentry'], ['whitelist'], ['blacklist'], " "['bl_delete', 'blacklist_delete'], " "['logs'], ['edge'], ['health'], ['help'], ['version'], ['marketdir'], " "['order'], ['list_custom_data'], ['tg_info']]" @@ -232,8 +237,12 @@ async def test_authorized_only(default_conf, mocker, caplog, update) -> None: async def test_authorized_only_unauthorized(default_conf, mocker, caplog) -> None: patch_exchange(mocker) caplog.set_level(logging.DEBUG) - chat = Chat(0xDEADBEEF, 0) - message = Message(randint(1, 100), datetime.now(timezone.utc), chat) + message = Message( + randint(1, 100), + dt_now(), + Chat(0xDEADBEEF, 0), + from_user=User(5432, "test", is_bot=False), + ) update = Update(randint(1, 100), message=message) default_conf["telegram"]["enabled"] = False @@ -249,6 +258,42 @@ async def test_authorized_only_unauthorized(default_conf, mocker, caplog) -> Non assert not log_has("Exception occurred within Telegram module", caplog) +async def test_authorized_users(default_conf, mocker, caplog, update) -> None: + patch_exchange(mocker) + caplog.set_level(logging.DEBUG) + default_conf["telegram"]["enabled"] = False + default_conf["telegram"]["authorized_users"] = ["5432"] + bot = FreqtradeBot(default_conf) + rpc = RPC(bot) + dummy = DummyCls(rpc, default_conf) + + await dummy.dummy_handler(update=update, context=MagicMock()) + assert dummy.state["called"] is True + assert log_has("Executing handler: dummy_handler for chat_id: 1235", caplog) + caplog.clear() + # Test empty case + default_conf["telegram"]["authorized_users"] = [] + dummy1 = DummyCls(rpc, default_conf) + await dummy1.dummy_handler(update=update, context=MagicMock()) + assert dummy1.state["called"] is False + assert log_has_re(r"Unauthorized user tried to .*5432", caplog) + caplog.clear() + # Test wrong user + default_conf["telegram"]["authorized_users"] = ["1234"] + dummy1 = DummyCls(rpc, default_conf) + await dummy1.dummy_handler(update=update, context=MagicMock()) + assert dummy1.state["called"] is False + assert log_has_re(r"Unauthorized user tried to .*5432", caplog) + caplog.clear() + + # Test reverse case again + default_conf["telegram"]["authorized_users"] = ["5432"] + dummy1 = DummyCls(rpc, default_conf) + await dummy1.dummy_handler(update=update, context=MagicMock()) + assert dummy1.state["called"] is True + assert not log_has_re(r"Unauthorized user tried to .*5432", caplog) + + async def test_authorized_only_exception(default_conf, mocker, caplog, update) -> None: patch_exchange(mocker) @@ -638,7 +683,7 @@ async def test_daily_handle(default_conf_usdt, update, ticker, fee, mocker, time assert msg_mock.call_count == 1 assert "Daily Profit over the last 2 days:" in msg_mock.call_args_list[0][0][0] assert "Day " in msg_mock.call_args_list[0][0][0] - assert str(datetime.now(timezone.utc).date()) in msg_mock.call_args_list[0][0][0] + assert str(dt_now().date()) in msg_mock.call_args_list[0][0][0] assert " 6.83 USDT" in msg_mock.call_args_list[0][0][0] assert " 7.51 USD" in msg_mock.call_args_list[0][0][0] assert "(2)" in msg_mock.call_args_list[0][0][0] @@ -651,11 +696,8 @@ async def test_daily_handle(default_conf_usdt, update, ticker, fee, mocker, time await telegram._daily(update=update, context=context) assert msg_mock.call_count == 1 assert "Daily Profit over the last 7 days:" in msg_mock.call_args_list[0][0][0] - assert str(datetime.now(timezone.utc).date()) in msg_mock.call_args_list[0][0][0] - assert ( - str((datetime.now(timezone.utc) - timedelta(days=5)).date()) - in msg_mock.call_args_list[0][0][0] - ) + assert str(dt_now().date()) in msg_mock.call_args_list[0][0][0] + assert str((dt_now() - timedelta(days=5)).date()) in msg_mock.call_args_list[0][0][0] assert " 6.83 USDT" in msg_mock.call_args_list[0][0][0] assert " 7.51 USD" in msg_mock.call_args_list[0][0][0] assert "(2)" in msg_mock.call_args_list[0][0][0] @@ -725,7 +767,7 @@ async def test_weekly_handle(default_conf_usdt, update, ticker, fee, mocker, tim in msg_mock.call_args_list[0][0][0] ) assert "Monday " in msg_mock.call_args_list[0][0][0] - today = datetime.now(timezone.utc).date() + today = dt_now().date() first_iso_day_of_current_week = today - timedelta(days=today.weekday()) assert str(first_iso_day_of_current_week) in msg_mock.call_args_list[0][0][0] assert " 2.74 USDT" in msg_mock.call_args_list[0][0][0] @@ -793,7 +835,7 @@ async def test_monthly_handle(default_conf_usdt, update, ticker, fee, mocker, ti assert msg_mock.call_count == 1 assert "Monthly Profit over the last 2 months:" in msg_mock.call_args_list[0][0][0] assert "Month " in msg_mock.call_args_list[0][0][0] - today = datetime.now(timezone.utc).date() + today = dt_now().date() current_month = f"{today.year}-{today.month:02} " assert current_month in msg_mock.call_args_list[0][0][0] assert " 2.74 USDT" in msg_mock.call_args_list[0][0][0] @@ -898,7 +940,7 @@ async def test_telegram_profit_handle( trade.orders.append(oobj) trade.update_trade(oobj) - trade.close_date = datetime.now(timezone.utc) + trade.close_date = dt_now() trade.is_open = False Trade.commit() @@ -1180,15 +1222,15 @@ async def test_stop_handle_already_stopped(default_conf, update, mocker) -> None assert "already stopped" in msg_mock.call_args_list[0][0][0] -async def test_stopbuy_handle(default_conf, update, mocker) -> None: +async def test_pause_handle(default_conf, update, mocker) -> None: telegram, freqtradebot, msg_mock = get_telegram_testobject(mocker, default_conf) - assert freqtradebot.config["max_open_trades"] != 0 - await telegram._stopentry(update=update, context=MagicMock()) - assert freqtradebot.config["max_open_trades"] == 0 + assert freqtradebot.state == State.RUNNING + await telegram._pause(update=update, context=MagicMock()) + assert freqtradebot.state == State.PAUSED assert msg_mock.call_count == 1 assert ( - "No more entries will occur from now. Run /reload_config to reset." + "paused, no more entries will occur from now. Run /start to enable entries." in msg_mock.call_args_list[0][0][0] ) @@ -2861,9 +2903,7 @@ async def test_telegram_list_custom_data(default_conf_usdt, update, ticker, fee, context.args = ["1"] await telegram._list_custom_data(update=update, context=context) assert msg_mock.call_count == 1 - assert ( - "Didn't find any custom-data entries for Trade ID: `1`" in msg_mock.call_args_list[0][0][0] - ) + assert "No custom-data found for Trade ID: 1." in msg_mock.call_args_list[0][0][0] msg_mock.reset_mock() # Add some custom data @@ -2876,11 +2916,10 @@ async def test_telegram_list_custom_data(default_conf_usdt, update, ticker, fee, assert msg_mock.call_count == 3 assert "Found custom-data entries: " in msg_mock.call_args_list[0][0][0] assert ( - "*Key:* `test_int`\n*ID:* `1`\n*Trade ID:* `1`\n*Type:* `int`\n*Value:* `1`\n*Create Date:*" + "*Key:* `test_int`\n*Type:* `int`\n*Value:* `1`\n*Create Date:*" ) in msg_mock.call_args_list[1][0][0] assert ( - "*Key:* `test_dict`\n*ID:* `2`\n*Trade ID:* `1`\n*Type:* `dict`\n" - '*Value:* `{"test": "dict"}`\n*Create Date:* `' + "*Key:* `test_dict`\n*Type:* `dict`\n*Value:* `{'test': 'dict'}`\n*Create Date:* `" ) in msg_mock.call_args_list[2][0][0] msg_mock.reset_mock() diff --git a/tests/strategy/strats/broken_strats/broken_futures_strategies.py b/tests/strategy/strats/broken_strats/broken_futures_strategies.py index b2131e63e..a3e51bc50 100644 --- a/tests/strategy/strats/broken_strats/broken_futures_strategies.py +++ b/tests/strategy/strats/broken_strats/broken_futures_strategies.py @@ -21,10 +21,12 @@ class TestStrategyNoImplementSell(TestStrategyNoImplements): return super().populate_entry_trend(dataframe, metadata) -class TestStrategyImplementCustomSell(TestStrategyNoImplementSell): +class TestStrategyImplementEmptyWorking(TestStrategyNoImplementSell): def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: return super().populate_exit_trend(dataframe, metadata) + +class TestStrategyImplementCustomSell(TestStrategyImplementEmptyWorking): def custom_sell( self, pair: str, @@ -55,3 +57,34 @@ class TestStrategyImplementSellTimeout(TestStrategyNoImplementSell): self, pair: str, trade, order: Order, current_time: datetime, **kwargs ) -> bool: return False + + +class TestStrategyAdjustOrderPrice(TestStrategyImplementEmptyWorking): + def adjust_entry_price( + self, + trade, + order, + pair, + current_time, + proposed_rate, + current_order_rate, + entry_tag, + side, + **kwargs, + ): + return proposed_rate + + def adjust_order_price( + self, + trade, + order, + pair, + current_time, + proposed_rate, + current_order_rate, + entry_tag, + side, + is_entry, + **kwargs, + ): + return proposed_rate diff --git a/tests/strategy/test_strategy_loading.py b/tests/strategy/test_strategy_loading.py index 9b143ace6..927f33461 100644 --- a/tests/strategy/test_strategy_loading.py +++ b/tests/strategy/test_strategy_loading.py @@ -460,6 +460,10 @@ def test_missing_implements(default_conf, caplog): ): StrategyResolver.load_strategy(default_conf) + default_conf["strategy"] = "TestStrategyAdjustOrderPrice" + with pytest.raises(OperationalException, match=r"If you implement `adjust_order_price`.*"): + StrategyResolver.load_strategy(default_conf) + def test_call_deprecated_function(default_conf): default_location = Path(__file__).parent / "strats/broken_strats/" diff --git a/tests/test_arguments.py b/tests/test_arguments.py index 1d48acb96..913f4759d 100644 --- a/tests/test_arguments.py +++ b/tests/test_arguments.py @@ -5,11 +5,54 @@ from unittest.mock import MagicMock import pytest -from freqtrade.commands import Arguments -from freqtrade.commands.cli_options import check_int_nonzero, check_int_positive +from freqtrade.commands import Arguments, arguments +from freqtrade.commands.cli_options import ( + AVAILABLE_CLI_OPTIONS, + check_int_nonzero, + check_int_positive, +) from tests.conftest import CURRENT_TEST_STRATEGY +def test_available_cli_options(): + """ + AVAILABLE_CLI_OPTIONS has keys that are the union of the values in all ARGS_* - required by CLI + each of the ARGS_* lists has a list of members which is assumed to also + be in AVAILABLE_CLI_OPTIONS + """ + args_union = { + arg + for variable, value in vars(arguments).items() + if variable.startswith("ARGS_") + for arg in value + } + expected_options = set(AVAILABLE_CLI_OPTIONS) + only_in_command_args = expected_options.difference(args_union) + only_in_all_args = args_union.difference(expected_options) + if only_in_all_args or only_in_command_args: + pytest.fail( + "variables around command line arguments not kept in sync:\n" + f" * args only in some ARGS_* list but not AVAILABLE_CLI_OPTIONS: {only_in_all_args}\n" + " * args only in AVAILABLE_CLI_OPTIONS but not some ARGS_* list: " + f"{only_in_command_args}" + ) + + +def test_arguments_match_available_cli_options(monkeypatch): + """All entries in AVAILABLE_CLI_OPTIONS are used in argument parsing.""" + parsed_options = set() + actual_build_args = Arguments._build_args + + def build_args_monitor(self, optionlist, parser): + parsed_options.update(optionlist) + return actual_build_args(self, optionlist=optionlist, parser=parser) + + monkeypatch.setattr(Arguments, "_build_args", build_args_monitor) + # this will result in a parser being built so we can check the arguments used + Arguments([]).get_parsed_arg() + assert parsed_options == set(AVAILABLE_CLI_OPTIONS) + + # Parse common command-line-arguments. Used for all tools def test_parse_args_none() -> None: arguments = Arguments(["trade"]) diff --git a/tests/test_configuration.py b/tests/test_configuration.py index a8ca72d86..6c54ad350 100644 --- a/tests/test_configuration.py +++ b/tests/test_configuration.py @@ -603,7 +603,7 @@ def test_cli_verbose_with_params(default_conf, mocker, caplog) -> None: patched_configuration_load_config_file(mocker, default_conf) # Prevent setting loggers - mocker.patch("freqtrade.loggers.set_loggers", MagicMock) + mocker.patch("freqtrade.loggers.logging.config.dictConfig", MagicMock) arglist = ["trade", "-vvv"] args = Arguments(arglist).get_parsed_arg() @@ -614,7 +614,9 @@ def test_cli_verbose_with_params(default_conf, mocker, caplog) -> None: assert log_has("Verbosity set to 3", caplog) +@pytest.mark.usefixtures("keep_log_config_loggers") def test_set_logfile(default_conf, mocker, tmp_path): + default_conf["ft_tests_force_logging"] = True patched_configuration_load_config_file(mocker, default_conf) f = tmp_path / "test_file.log" assert not f.is_file() diff --git a/tests/test_log_setup.py b/tests/test_log_setup.py index d4bc63193..169a65005 100644 --- a/tests/test_log_setup.py +++ b/tests/test_log_setup.py @@ -1,4 +1,5 @@ import logging +import re import sys import pytest @@ -7,7 +8,6 @@ from freqtrade.exceptions import OperationalException from freqtrade.loggers import ( FTBufferingHandler, FtRichHandler, - set_loggers, setup_logging, setup_logging_pre, ) @@ -17,6 +17,7 @@ from freqtrade.loggers.set_log_levels import ( ) +@pytest.mark.usefixtures("keep_log_config_loggers") def test_set_loggers() -> None: # Reset Logging to Debug, otherwise this fails randomly as it's set globally logging.getLogger("requests").setLevel(logging.DEBUG) @@ -27,8 +28,11 @@ def test_set_loggers() -> None: previous_value1 = logging.getLogger("requests").level previous_value2 = logging.getLogger("ccxt.base.exchange").level previous_value3 = logging.getLogger("telegram").level - - set_loggers() + config = { + "verbosity": 1, + "ft_tests_force_logging": True, + } + setup_logging(config) value1 = logging.getLogger("requests").level assert previous_value1 is not value1 @@ -41,15 +45,17 @@ def test_set_loggers() -> None: value3 = logging.getLogger("telegram").level assert previous_value3 is not value3 assert value3 is logging.INFO - - set_loggers(verbosity=2) + config["verbosity"] = 2 + setup_logging(config) assert logging.getLogger("requests").level is logging.DEBUG assert logging.getLogger("ccxt.base.exchange").level is logging.INFO assert logging.getLogger("telegram").level is logging.INFO assert logging.getLogger("werkzeug").level is logging.INFO - set_loggers(verbosity=3, api_verbosity="error") + config["verbosity"] = 3 + config["api_server"] = {"verbosity": "error"} + setup_logging(config) assert logging.getLogger("requests").level is logging.DEBUG assert logging.getLogger("ccxt.base.exchange").level is logging.DEBUG @@ -58,12 +64,14 @@ def test_set_loggers() -> None: @pytest.mark.skipif(sys.platform == "win32", reason="does not run on windows") +@pytest.mark.usefixtures("keep_log_config_loggers") def test_set_loggers_syslog(): logger = logging.getLogger() orig_handlers = logger.handlers logger.handlers = [] config = { + "ft_tests_force_logging": True, "verbosity": 2, "logfile": "syslog:/dev/log", } @@ -82,12 +90,14 @@ def test_set_loggers_syslog(): @pytest.mark.skipif(sys.platform == "win32", reason="does not run on windows") +@pytest.mark.usefixtures("keep_log_config_loggers") def test_set_loggers_Filehandler(tmp_path): logger = logging.getLogger() orig_handlers = logger.handlers logger.handlers = [] logfile = tmp_path / "logs/ft_logfile.log" config = { + "ft_tests_force_logging": True, "verbosity": 2, "logfile": str(logfile), } @@ -108,6 +118,7 @@ def test_set_loggers_Filehandler(tmp_path): @pytest.mark.skipif(sys.platform == "win32", reason="does not run on windows") +@pytest.mark.usefixtures("keep_log_config_loggers") def test_set_loggers_Filehandler_without_permission(tmp_path): logger = logging.getLogger() orig_handlers = logger.handlers @@ -117,6 +128,7 @@ def test_set_loggers_Filehandler_without_permission(tmp_path): tmp_path.chmod(0o400) logfile = tmp_path / "logs/ft_logfile.log" config = { + "ft_tests_force_logging": True, "verbosity": 2, "logfile": str(logfile), } @@ -131,12 +143,14 @@ def test_set_loggers_Filehandler_without_permission(tmp_path): @pytest.mark.skip(reason="systemd is not installed on every system, so we're not testing this.") -def test_set_loggers_journald(mocker): +@pytest.mark.usefixtures("keep_log_config_loggers") +def test_set_loggers_journald(): logger = logging.getLogger() orig_handlers = logger.handlers logger.handlers = [] config = { + "ft_tests_force_logging": True, "verbosity": 2, "logfile": "journald", } @@ -150,12 +164,14 @@ def test_set_loggers_journald(mocker): logger.handlers = orig_handlers +@pytest.mark.usefixtures("keep_log_config_loggers") def test_set_loggers_journald_importerror(import_fails): logger = logging.getLogger() orig_handlers = logger.handlers logger.handlers = [] config = { + "ft_tests_force_logging": True, "verbosity": 2, "logfile": "journald", } @@ -164,6 +180,56 @@ def test_set_loggers_journald_importerror(import_fails): logger.handlers = orig_handlers +@pytest.mark.usefixtures("keep_log_config_loggers") +def test_set_loggers_json_format(capsys): + logger = logging.getLogger() + orig_handlers = logger.handlers + logger.handlers = [] + + config = { + "ft_tests_force_logging": True, + "verbosity": 2, + "log_config": { + "version": 1, + "formatters": { + "json": { + "()": "freqtrade.loggers.json_formatter.JsonFormatter", + "fmt_dict": { + "timestamp": "asctime", + "level": "levelname", + "logger": "name", + "message": "message", + }, + } + }, + "handlers": { + "json": { + "class": "logging.StreamHandler", + "formatter": "json", + } + }, + "root": { + "handlers": ["json"], + "level": "DEBUG", + }, + }, + } + + setup_logging_pre() + setup_logging(config) + assert len(logger.handlers) == 2 + assert [x for x in logger.handlers if type(x).__name__ == "StreamHandler"] + assert [x for x in logger.handlers if isinstance(x, FTBufferingHandler)] + + logger.info("Test message") + + captured = capsys.readouterr() + assert re.search(r'{"timestamp": ".*"Test message".*', captured.err) + + # reset handlers to not break pytest + logger.handlers = orig_handlers + + def test_reduce_verbosity(): setup_logging_pre() reduce_verbosity_for_bias_tester() diff --git a/tests/testdata/binance/binance_public_data/futures-APEUSDT-aggTrades-2024-10-18.zip b/tests/testdata/binance/binance_public_data/futures-APEUSDT-aggTrades-2024-10-18.zip new file mode 100644 index 000000000..ea734e4ca Binary files /dev/null and b/tests/testdata/binance/binance_public_data/futures-APEUSDT-aggTrades-2024-10-18.zip differ diff --git a/tests/testdata/binance/binance_public_data/spot-PEPEUSDT-aggTrades-2024-10-27.zip b/tests/testdata/binance/binance_public_data/spot-PEPEUSDT-aggTrades-2024-10-27.zip new file mode 100644 index 000000000..7cec1e299 Binary files /dev/null and b/tests/testdata/binance/binance_public_data/spot-PEPEUSDT-aggTrades-2024-10-27.zip differ