diff --git a/.dockerignore b/.dockerignore index abc5b82f0..3a79022fe 100644 --- a/.dockerignore +++ b/.dockerignore @@ -14,10 +14,11 @@ MANIFEST.in README.md freqtrade.service freqtrade.egg-info +.venv/ config.json* *.sqlite -user_data +user_data/ *.log .vscode diff --git a/.github/actions/docker-tags/action.yml b/.github/actions/docker-tags/action.yml new file mode 100644 index 000000000..1a563aade --- /dev/null +++ b/.github/actions/docker-tags/action.yml @@ -0,0 +1,92 @@ +name: 'docker-tags' +description: 'Set Docker default Tag environment variables' +# inputs: +outputs: + BRANCH_NAME: + description: 'The branch name' + value: ${{ steps.tags.outputs.BRANCH_NAME }} + TAG: + description: 'The Docker tag' + value: ${{ steps.tags.outputs.TAG }} + TAG_PLOT: + description: 'The Docker tag for the plot' + value: ${{ steps.tags.outputs.TAG_PLOT }} + TAG_FREQAI: + description: 'The Docker tag for the freqai' + value: ${{ steps.tags.outputs.TAG_FREQAI }} + TAG_FREQAI_RL: + description: 'The Docker tag for the freqai_rl' + value: ${{ steps.tags.outputs.TAG_FREQAI_RL }} + TAG_FREQAI_TORCH: + description: 'The Docker tag for the freqai_torch' + value: ${{ steps.tags.outputs.TAG_FREQAI_TORCH }} + TAG_ARM: + description: 'The Docker tag for the arm' + value: ${{ steps.tags.outputs.TAG_ARM }} + TAG_PLOT_ARM: + description: 'The Docker tag for the plot arm' + value: ${{ steps.tags.outputs.TAG_PLOT_ARM }} + TAG_FREQAI_ARM: + description: 'The Docker tag for the freqai arm' + value: ${{ steps.tags.outputs.TAG_FREQAI_ARM }} + TAG_FREQAI_RL_ARM: + description: 'The Docker tag for the freqai_rl arm' + value: ${{ steps.tags.outputs.TAG_FREQAI_RL_ARM }} + TAG_PI: + description: 'The Docker tag for the pi' + value: ${{ steps.tags.outputs.TAG_PI }} + CACHE_TAG_PI: + description: 'The Docker cache tag for the pi' + value: ${{ steps.tags.outputs.CACHE_TAG_PI }} +runs: + using: "composite" + steps: + - name: Extract branch name + shell: bash + id: tags + env: + BRANCH_NAME_INPUT: ${{ github.event.inputs.branch_name }} + run: | + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + BRANCH_NAME="${BRANCH_NAME_INPUT}" + else + BRANCH_NAME="${GITHUB_REF##*/}" + fi + + # Replace / with _ to create a valid tag + TAG=$(echo "${BRANCH_NAME}" | sed -e "s/\//_/g") + TAG_PLOT=${TAG}_plot + TAG_FREQAI=${TAG}_freqai + TAG_FREQAI_RL=${TAG_FREQAI}rl + TAG_FREQAI_TORCH=${TAG_FREQAI}torch + + TAG_ARM=${TAG}_arm + TAG_PLOT_ARM=${TAG_PLOT}_arm + TAG_FREQAI_ARM=${TAG_FREQAI}_arm + TAG_FREQAI_RL_ARM=${TAG_FREQAI_RL}_arm + + TAG_PI="${TAG}_pi" + + CACHE_TAG_PI=${CACHE_IMAGE}:${TAG_PI}_cache + + echo "BRANCH_NAME=${BRANCH_NAME}" >> "$GITHUB_OUTPUT" + echo "TAG=${TAG}" >> "$GITHUB_OUTPUT" + echo "TAG_PLOT=${TAG_PLOT}" >> "$GITHUB_OUTPUT" + echo "TAG_FREQAI=${TAG_FREQAI}" >> "$GITHUB_OUTPUT" + echo "TAG_FREQAI_RL=${TAG_FREQAI_RL}" >> "$GITHUB_OUTPUT" + echo "TAG_FREQAI_TORCH=${TAG_FREQAI_TORCH}" >> "$GITHUB_OUTPUT" + echo "TAG_ARM=${TAG_ARM}" >> "$GITHUB_OUTPUT" + echo "TAG_PLOT_ARM=${TAG_PLOT_ARM}" >> "$GITHUB_OUTPUT" + echo "TAG_FREQAI_ARM=${TAG_FREQAI_ARM}" >> "$GITHUB_OUTPUT" + echo "TAG_FREQAI_RL_ARM=${TAG_FREQAI_RL_ARM}" >> "$GITHUB_OUTPUT" + echo "TAG_PI=${TAG_PI}" >> "$GITHUB_OUTPUT" + + echo "CACHE_TAG_PI=${CACHE_TAG_PI}" >> "$GITHUB_OUTPUT" + + cat "$GITHUB_OUTPUT" + + - name: Save commit SHA to file + shell: bash + # Add commit to docker container + run: | + echo "${GITHUB_SHA}" > freqtrade_commit diff --git a/.github/workflows/binance-lev-tier-update.yml b/.github/workflows/binance-lev-tier-update.yml index e04f95ff5..9ec4c3ec0 100644 --- a/.github/workflows/binance-lev-tier-update.yml +++ b/.github/workflows/binance-lev-tier-update.yml @@ -19,7 +19,7 @@ jobs: with: persist-credentials: false - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v6 with: python-version: "3.12" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4a7b2a4b0..7fbfbc735 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,12 +19,12 @@ concurrency: permissions: repository-projects: read jobs: - build-linux: - + tests: + name: "Tests and Linting" runs-on: ${{ matrix.os }} strategy: matrix: - os: [ "ubuntu-22.04", "ubuntu-24.04" ] + os: [ "ubuntu-22.04", "ubuntu-24.04", "macos-14", "macos-15" , "windows-2022", "windows-2025" ] python-version: ["3.11", "3.12", "3.13"] steps: @@ -33,21 +33,27 @@ jobs: persist-credentials: false - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} - name: Install uv - uses: astral-sh/setup-uv@4959332f0f014c5280e7eac8b70c90cb574c9f9b # v6.6.0 + uses: astral-sh/setup-uv@b75a909f75acd358c2196fb9a5f1299a9a8868a4 # v6.7.0 with: activate-environment: true enable-cache: true python-version: ${{ matrix.python-version }} cache-dependency-glob: "requirements**.txt" cache-suffix: "${{ matrix.python-version }}" - prune-cache: false - - name: Installation - *nix + - name: Installation - macOS (Brew) + if: ${{ runner.os == 'macOS' }} + run: | + # brew update + # TODO: Should be the brew upgrade + brew install libomp + + - name: Installation (python) run: | uv pip install --upgrade wheel uv pip install -r requirements-dev.txt @@ -61,7 +67,7 @@ jobs: - name: Tests if: (!(runner.os == 'Linux' && matrix.python-version == '3.12' && matrix.os == 'ubuntu-24.04')) run: | - pytest --random-order + pytest --random-order --durations 20 -n auto - name: Tests with Coveralls if: (runner.os == 'Linux' && matrix.python-version == '3.12' && matrix.os == 'ubuntu-24.04') @@ -88,9 +94,9 @@ jobs: run: | python build_helpers/create_command_partials.py - - name: Check for repository changes + - name: Check for repository changes - *nix # TODO: python 3.13 slightly changed the output of argparse. - if: (matrix.python-version != '3.13') + if: ${{ (matrix.python-version != '3.13') && (runner.os != 'Windows') }} run: | if [ -n "$(git status --porcelain)" ]; then echo "Repository is dirty, changes detected:" @@ -101,13 +107,27 @@ jobs: echo "Repository is clean, no changes detected." fi + - name: Check for repository changes - Windows + if: ${{ runner.os == 'Windows' && (matrix.python-version != '3.13') }} + run: | + if (git status --porcelain) { + Write-Host "Repository is dirty, changes detected:" + git status + git diff + exit 1 + } + else { + Write-Host "Repository is clean, no changes detected." + } + - name: Backtesting (multi) run: | - cp tests/testdata/config.tests.json config.json freqtrade create-userdir --userdir user_data + cp tests/testdata/config.tests.json user_data/config.json freqtrade new-strategy -s AwesomeStrategy freqtrade new-strategy -s AwesomeStrategyMin --template minimal - freqtrade backtesting --datadir tests/testdata --strategy-list AwesomeStrategy AwesomeStrategyMin -i 5m + freqtrade new-strategy -s AwesomeStrategyAdv --template advanced + freqtrade backtesting --datadir tests/testdata --strategy-list AwesomeStrategy AwesomeStrategyMin AwesomeStrategyAdv -i 5m - name: Hyperopt run: | @@ -128,208 +148,13 @@ 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@c2597273488aeda841dd1e891321952b51f7996f #v2.2.1 - if: failure() && ( github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false) - with: - severity: error - details: Freqtrade CI failed on ${{ matrix.os }} - webhookUrl: ${{ secrets.DISCORD_WEBHOOK }} - - build-macos: - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ "macos-14", "macos-15" ] - python-version: ["3.11", "3.12", "3.13"] - - steps: - - uses: actions/checkout@v5 - with: - persist-credentials: false - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python-version }} - check-latest: true - - - name: Install uv - uses: astral-sh/setup-uv@4959332f0f014c5280e7eac8b70c90cb574c9f9b # v6.6.0 - with: - activate-environment: true - enable-cache: true - python-version: ${{ matrix.python-version }} - cache-dependency-glob: "requirements**.txt" - cache-suffix: "${{ matrix.python-version }}" - prune-cache: false - - - name: Installation - macOS (Brew) - run: | - # brew update - # TODO: Should be the brew upgrade - # homebrew fails to update python due to unlinking failures - # https://github.com/actions/runner-images/issues/6817 - rm /usr/local/bin/2to3 || true - rm /usr/local/bin/2to3-3.11 || true - rm /usr/local/bin/2to3-3.12 || true - rm /usr/local/bin/idle3 || true - rm /usr/local/bin/idle3.11 || true - rm /usr/local/bin/idle3.12 || true - rm /usr/local/bin/pydoc3 || true - rm /usr/local/bin/pydoc3.11 || true - rm /usr/local/bin/pydoc3.12 || true - rm /usr/local/bin/python3 || true - rm /usr/local/bin/python3.11 || true - rm /usr/local/bin/python3.12 || true - rm /usr/local/bin/python3-config || true - rm /usr/local/bin/python3.11-config || true - rm /usr/local/bin/python3.12-config || true - - brew install libomp - - - name: Installation (python) - run: | - uv pip install wheel - uv pip install -r requirements-dev.txt - uv pip install -e ft_client/ - uv pip install -e . - - - name: Tests - run: | - pytest --random-order - - - name: Check for repository changes - run: | - if [ -n "$(git status --porcelain)" ]; then - echo "Repository is dirty, changes detected:" - git status - git diff - exit 1 - else - echo "Repository is clean, no changes detected." - fi - - - name: Backtesting - run: | - cp tests/testdata/config.tests.json config.json - freqtrade create-userdir --userdir user_data - freqtrade new-strategy -s AwesomeStrategyAdv --template advanced - freqtrade backtesting --datadir tests/testdata --strategy AwesomeStrategyAdv - - - name: Hyperopt - run: | - cp tests/testdata/config.tests.json config.json - freqtrade create-userdir --userdir user_data - freqtrade hyperopt --datadir tests/testdata -e 5 --strategy SampleStrategy --hyperopt-loss SharpeHyperOptLossDaily --print-all - - - name: Sort imports (isort) - run: | - isort --check . - - - name: Run Ruff - run: | - ruff check --output-format=github - - - name: Run Ruff format check - run: | - ruff format --check - - - name: Mypy - if: matrix.os == 'macos-15' - run: | - mypy freqtrade scripts - - - name: Discord notification - uses: rjstone/discord-webhook-notify@c2597273488aeda841dd1e891321952b51f7996f #v2.2.1 - if: failure() && ( github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false) - with: - severity: info - details: Test Succeeded! - webhookUrl: ${{ secrets.DISCORD_WEBHOOK }} - - build-windows: - - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ "windows-2022", "windows-2025" ] - python-version: ["3.11", "3.12", "3.13"] - - steps: - - uses: actions/checkout@v5 - with: - persist-credentials: false - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python-version }} - - - name: Install uv - uses: astral-sh/setup-uv@4959332f0f014c5280e7eac8b70c90cb574c9f9b # v6.6.0 - with: - activate-environment: true - enable-cache: true - python-version: ${{ matrix.python-version }} - cache-dependency-glob: "requirements**.txt" - cache-suffix: "${{ matrix.python-version }}" - prune-cache: false - - - name: Installation - run: | - function uvpipFunction { uv pip $args } - Set-Alias -name pip -value uvpipFunction - - python -m pip install --upgrade pip - pip install -r requirements-dev.txt - pip install -e . - - - name: Tests - run: | - pytest --random-order --durations 20 -n auto - - - name: Check for repository changes - run: | - if (git status --porcelain) { - Write-Host "Repository is dirty, changes detected:" - git status - git diff - exit 1 - } - else { - Write-Host "Repository is clean, no changes detected." - } - - - name: Backtesting - run: | - cp tests/testdata/config.tests.json config.json - freqtrade create-userdir --userdir user_data - freqtrade backtesting --datadir tests/testdata --strategy SampleStrategy - - - name: Hyperopt - run: | - cp tests/testdata/config.tests.json config.json - freqtrade create-userdir --userdir user_data - freqtrade hyperopt --datadir tests/testdata -e 5 --strategy SampleStrategy --hyperopt-loss SharpeHyperOptLossDaily --print-all - - - name: Run Ruff - run: | - ruff check --output-format=github - - - name: Run Ruff format check - run: | - ruff format --check - - - name: Mypy + if: ${{ matrix.os == 'ubuntu-24.04' || matrix.os == 'macos-15' }} run: | mypy freqtrade scripts tests - name: Run Pester tests (PowerShell) + if: ${{ runner.os == 'Windows' }} + shell: powershell run: | $PSVersionTable Set-PSRepository psgallery -InstallationPolicy trusted @@ -338,25 +163,24 @@ jobs: Invoke-Pester -Path "tests" -CI if ($Error.Length -gt 0) {exit 1} - shell: powershell - - name: Discord notification uses: rjstone/discord-webhook-notify@c2597273488aeda841dd1e891321952b51f7996f #v2.2.1 - if: failure() && ( github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false) + if: ${{ failure() && ( github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false) }} with: severity: error - details: Test Failed + details: Freqtrade CI failed on ${{ matrix.os }} with Python ${{ matrix.python-version }}! webhookUrl: ${{ secrets.DISCORD_WEBHOOK }} mypy-version-check: - runs-on: ubuntu-22.04 + name: "Mypy Version Check" + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v5 with: persist-credentials: false - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: "3.12" @@ -366,18 +190,20 @@ jobs: python build_helpers/pre_commit_update.py pre-commit: + name: "Pre-commit checks" runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v5 with: persist-credentials: false - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v6 with: python-version: "3.12" - uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # v3.0.1 docs-check: + name: "Documentation build" runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v5 @@ -389,7 +215,7 @@ jobs: ./tests/test_docs.sh - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: "3.12" @@ -409,6 +235,7 @@ jobs: build-linux-online: # Run pytest with "live" checks + name: "Tests and Linting - Online tests" runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v5 @@ -416,19 +243,18 @@ jobs: persist-credentials: false - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: "3.12" - name: Install uv - uses: astral-sh/setup-uv@4959332f0f014c5280e7eac8b70c90cb574c9f9b # v6.6.0 + uses: astral-sh/setup-uv@b75a909f75acd358c2196fb9a5f1299a9a8868a4 # v6.7.0 with: activate-environment: true enable-cache: true python-version: "3.12" cache-dependency-glob: "requirements**.txt" cache-suffix: "3.12" - prune-cache: false - name: Installation - *nix run: | @@ -447,9 +273,7 @@ jobs: # Notify only once - when CI completes (and after deploy) in case it's successful notify-complete: needs: [ - build-linux, - build-macos, - build-windows, + tests, docs-check, mypy-version-check, pre-commit, @@ -481,7 +305,7 @@ jobs: build: name: "Build" - needs: [ build-linux, build-macos, build-windows, docs-check, mypy-version-check, pre-commit ] + needs: [ tests, docs-check, mypy-version-check, pre-commit ] runs-on: ubuntu-22.04 steps: @@ -490,7 +314,7 @@ jobs: persist-credentials: false - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: "3.12" @@ -544,7 +368,7 @@ jobs: merge-multiple: true - name: Publish to PyPI (Test) - uses: pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc # v1.12.4 + uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0 with: repository-url: https://test.pypi.org/legacy/ @@ -573,12 +397,17 @@ jobs: merge-multiple: true - name: Publish to PyPI - uses: pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc # v1.12.4 + uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0 docker-build: name: "Docker Build and Deploy" - needs: [ build-linux, build-macos, build-windows, docs-check, mypy-version-check, pre-commit ] + needs: [ + tests, + docs-check, + mypy-version-check, + pre-commit + ] if: (github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'release') && github.repository == 'freqtrade/freqtrade' uses: ./.github/workflows/docker-build.yml permissions: @@ -588,3 +417,14 @@ jobs: DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} + + + packages-cleanup: + name: "Docker Package Cleanup" + uses: ./.github/workflows/packages-cleanup.yml + # Only run on push, schedule, or release events + if: (github.event_name == 'push' || github.event_name == 'schedule') && github.repository == 'freqtrade/freqtrade' + permissions: + packages: write + with: + package_name: 'freqtrade' diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 15ab918bc..da033cfb8 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -24,7 +24,7 @@ jobs: persist-credentials: true - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: '3.12' diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index 30b078bb0..1fc50315b 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -20,6 +20,12 @@ on: permissions: contents: read +env: + IMAGE_NAME: "freqtradeorg/freqtrade" + CACHE_IMAGE: "freqtradeorg/freqtrade_cache" + GHCR_IMAGE_NAME: "ghcr.io/freqtrade/freqtrade" + PI_PLATFORM: "linux/arm/v7" + jobs: deploy-docker: name: "Deploy Docker x64 and armv7l" @@ -31,33 +37,20 @@ jobs: with: persist-credentials: false - - name: Set up Python - uses: actions/setup-python@v5 + - name: Set docker tag names + id: tags + uses: ./.github/actions/docker-tags + + - name: Login to Docker Hub + uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0 with: - python-version: "3.12" - - - name: Extract branch name - id: extract-branch - env: - BRANCH_NAME_INPUT: ${{ github.event.inputs.branch_name }} - run: | - if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then - BRANCH_NAME="${BRANCH_NAME_INPUT}" - else - BRANCH_NAME="${GITHUB_REF##*/}" - fi - echo "GITHUB_REF='${GITHUB_REF}'" - echo "branch=${BRANCH_NAME}" >> "$GITHUB_OUTPUT" - - - name: Dockerhub login - env: - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - run: | - echo "${DOCKER_PASSWORD}" | docker login --username ${DOCKER_USERNAME} --password-stdin + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} - name: Set up QEMU uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0 + with: + cache-image: false - name: Set up Docker Buildx id: buildx @@ -68,11 +61,86 @@ jobs: env: PLATFORMS: ${{ steps.buildx.outputs.platforms }} - - name: Build and test and push docker images + - name: Build image without cache + if: github.event_name == 'schedule' env: - BRANCH_NAME: ${{ steps.extract-branch.outputs.branch }} + TAG: ${{ steps.tags.outputs.TAG }} run: | - build_helpers/publish_docker_multi.sh + docker build -t ${CACHE_IMAGE}:${TAG} . + + - name: Build ARMHF image without cache + if: github.event_name == 'schedule' + env: + TAG_PI: ${{ steps.tags.outputs.TAG_PI }} + CACHE_TAG_PI: ${{ steps.tags.outputs.CACHE_TAG_PI }} + run: | + docker buildx build \ + --cache-to=type=registry,ref=${CACHE_TAG_PI} \ + -f docker/Dockerfile.armhf \ + --platform ${PI_PLATFORM} \ + -t ${IMAGE_NAME}:${TAG_PI} \ + --push \ + --provenance=false \ + . + + - name: Build image with cache + if: github.event_name != 'schedule' + env: + TAG: ${{ steps.tags.outputs.TAG }} + run: | + docker pull ${IMAGE_NAME}:${TAG} || true + docker build --cache-from ${IMAGE_NAME}:${TAG} -t ${CACHE_IMAGE}:${TAG} . + + - name: Build ARMHF image with cache + if: github.event_name != 'schedule' + # disable provenance due to https://github.com/docker/buildx/issues/1509 + env: + TAG_PI: ${{ steps.tags.outputs.TAG_PI }} + CACHE_TAG_PI: ${{ steps.tags.outputs.CACHE_TAG_PI }} + run: | + docker buildx build \ + --cache-from=type=registry,ref=${CACHE_TAG_PI} \ + --cache-to=type=registry,ref=${CACHE_TAG_PI} \ + -f docker/Dockerfile.armhf \ + --platform ${PI_PLATFORM} \ + -t ${IMAGE_NAME}:${TAG_PI} \ + --push \ + --provenance=false \ + . + + - name: Run build for AI images + env: + TAG: ${{ steps.tags.outputs.TAG }} + TAG_PLOT: ${{ steps.tags.outputs.TAG_PLOT }} + TAG_FREQAI: ${{ steps.tags.outputs.TAG_FREQAI }} + TAG_FREQAI_RL: ${{ steps.tags.outputs.TAG_FREQAI_RL }} + run: | + docker build --build-arg sourceimage=${CACHE_IMAGE} --build-arg sourcetag=${TAG} -t ${CACHE_IMAGE}:${TAG_PLOT} -f docker/Dockerfile.plot . + docker build --build-arg sourceimage=${CACHE_IMAGE} --build-arg sourcetag=${TAG} -t ${CACHE_IMAGE}:${TAG_FREQAI} -f docker/Dockerfile.freqai . + docker build --build-arg sourceimage=${CACHE_IMAGE} --build-arg sourcetag=${TAG_FREQAI} -t ${CACHE_IMAGE}:${TAG_FREQAI_RL} -f docker/Dockerfile.freqai_rl . + + + - name: Run backtest in Docker + env: + TAG: ${{ steps.tags.outputs.TAG }} + run: | + docker run --rm -v $(pwd)/tests/testdata/config.tests.json:/freqtrade/config.json:ro -v $(pwd)/tests:/tests ${CACHE_IMAGE}:${TAG} backtesting --datadir /tests/testdata --strategy-path /tests/strategy/strats/ --strategy StrategyTestV3 + + - name: Push cache images + env: + TAG: ${{ steps.tags.outputs.TAG }} + TAG_PLOT: ${{ steps.tags.outputs.TAG_PLOT }} + TAG_FREQAI: ${{ steps.tags.outputs.TAG_FREQAI }} + TAG_FREQAI_RL: ${{ steps.tags.outputs.TAG_FREQAI_RL }} + run: | + docker push ${CACHE_IMAGE}:$TAG + docker push ${CACHE_IMAGE}:$TAG_PLOT + docker push ${CACHE_IMAGE}:$TAG_FREQAI + docker push ${CACHE_IMAGE}:$TAG_FREQAI_RL + + - name: list Images + run: | + docker images deploy-arm: name: "Deploy Docker ARM64" @@ -88,33 +156,135 @@ jobs: with: persist-credentials: false - - name: Extract branch name - id: extract-branch - env: - BRANCH_NAME_INPUT: ${{ github.event.inputs.branch_name }} - run: | - if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then - BRANCH_NAME="${BRANCH_NAME_INPUT}" - else - BRANCH_NAME="${GITHUB_REF##*/}" - fi - echo "GITHUB_REF='${GITHUB_REF}'" - echo "branch=${BRANCH_NAME}" >> "$GITHUB_OUTPUT" + - name: Set docker tag names + id: tags + uses: ./.github/actions/docker-tags - - name: Dockerhub login - env: - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - run: | - echo "${DOCKER_PASSWORD}" | docker login --username ${DOCKER_USERNAME} --password-stdin + - name: Login to Docker Hub + uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} - - name: Build and test and push docker images + - name: Login to github + uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build image without cache + if: github.event_name == 'schedule' env: - BRANCH_NAME: ${{ steps.extract-branch.outputs.branch }} - GHCR_USERNAME: ${{ github.actor }} - GHCR_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TAG_ARM: ${{ steps.tags.outputs.TAG_ARM }} run: | - build_helpers/publish_docker_arm64.sh + docker build -t ${IMAGE_NAME}:${TAG_ARM} . + + - name: Build image with cache + if: github.event_name != 'schedule' + env: + TAG_ARM: ${{ steps.tags.outputs.TAG_ARM }} + run: | + docker pull ${IMAGE_NAME}:${TAG_ARM} || true + docker build --cache-from ${IMAGE_NAME}:${TAG_ARM} -t ${CACHE_IMAGE}:${TAG_ARM} . + + - name: Run build for AI images + env: + TAG_ARM: ${{ steps.tags.outputs.TAG_ARM }} + TAG_PLOT_ARM: ${{ steps.tags.outputs.TAG_PLOT_ARM }} + TAG_FREQAI_ARM: ${{ steps.tags.outputs.TAG_FREQAI_ARM }} + TAG_FREQAI_RL_ARM: ${{ steps.tags.outputs.TAG_FREQAI_RL_ARM }} + run: | + docker build --build-arg sourceimage=${CACHE_IMAGE} --build-arg sourcetag=${TAG_ARM} -t ${CACHE_IMAGE}:${TAG_PLOT_ARM} -f docker/Dockerfile.plot . + docker build --build-arg sourceimage=${CACHE_IMAGE} --build-arg sourcetag=${TAG_ARM} -t ${CACHE_IMAGE}:${TAG_FREQAI_ARM} -f docker/Dockerfile.freqai . + docker build --build-arg sourceimage=${CACHE_IMAGE} --build-arg sourcetag=${TAG_FREQAI_ARM} -t ${CACHE_IMAGE}:${TAG_FREQAI_RL_ARM} -f docker/Dockerfile.freqai_rl . + + + - name: Run backtest in Docker + env: + TAG_ARM: ${{ steps.tags.outputs.TAG_ARM }} + run: | + docker run --rm -v $(pwd)/tests/testdata/config.tests.json:/freqtrade/config.json:ro -v $(pwd)/tests:/tests ${CACHE_IMAGE}:${TAG_ARM} backtesting --datadir /tests/testdata --strategy-path /tests/strategy/strats/ --strategy StrategyTestV3 + + - name: Docker images + run: | + docker images + + - name: Push cache images + env: + TAG_ARM: ${{ steps.tags.outputs.TAG_ARM }} + TAG_PLOT_ARM: ${{ steps.tags.outputs.TAG_PLOT_ARM }} + TAG_FREQAI_ARM: ${{ steps.tags.outputs.TAG_FREQAI_ARM }} + TAG_FREQAI_RL_ARM: ${{ steps.tags.outputs.TAG_FREQAI_RL_ARM }} + run: | + docker push ${CACHE_IMAGE}:$TAG_PLOT_ARM + docker push ${CACHE_IMAGE}:$TAG_FREQAI_ARM + docker push ${CACHE_IMAGE}:$TAG_FREQAI_RL_ARM + docker push ${CACHE_IMAGE}:$TAG_ARM + + - name: Create manifests + env: + TAG_ARM: ${{ steps.tags.outputs.TAG_ARM }} + TAG: ${{ steps.tags.outputs.TAG }} + TAG_PI: ${{ steps.tags.outputs.TAG_PI }} + run: | + docker buildx imagetools create \ + --tag ${IMAGE_NAME}:${TAG} \ + --tag ${GHCR_IMAGE_NAME}:${TAG} \ + ${CACHE_IMAGE}:${TAG} ${CACHE_IMAGE}:${TAG_ARM} ${IMAGE_NAME}:${TAG_PI} + + - name: Create multiarch image - Plot + env: + TAG_PLOT: ${{ steps.tags.outputs.TAG_PLOT }} + TAG_PLOT_ARM: ${{ steps.tags.outputs.TAG_PLOT_ARM }} + run: | + docker buildx imagetools create \ + --tag ${IMAGE_NAME}:${TAG_PLOT} \ + --tag ${GHCR_IMAGE_NAME}:${TAG_PLOT} \ + ${CACHE_IMAGE}:${TAG_PLOT} ${CACHE_IMAGE}:${TAG_PLOT_ARM} + + - name: Create multiarch image - FreqAI + env: + TAG_FREQAI: ${{ steps.tags.outputs.TAG_FREQAI }} + TAG_FREQAI_ARM: ${{ steps.tags.outputs.TAG_FREQAI_ARM }} + run: | + docker buildx imagetools create \ + --tag ${IMAGE_NAME}:${TAG_FREQAI} \ + --tag ${GHCR_IMAGE_NAME}:${TAG_FREQAI} \ + ${CACHE_IMAGE}:${TAG_FREQAI} ${CACHE_IMAGE}:${TAG_FREQAI_ARM} + + - name: Create multiarch image - FreqAI RL + env: + TAG_FREQAI_RL: ${{ steps.tags.outputs.TAG_FREQAI_RL }} + TAG_FREQAI_RL_ARM: ${{ steps.tags.outputs.TAG_FREQAI_RL_ARM }} + TAG_FREQAI_TORCH: ${{ steps.tags.outputs.TAG_FREQAI_TORCH }} + run: | + # Create special Torch tag - which is identical to the RL tag. + docker buildx imagetools create \ + --tag ${IMAGE_NAME}:${TAG_FREQAI_RL} \ + --tag ${GHCR_IMAGE_NAME}:${TAG_FREQAI_RL} \ + --tag ${IMAGE_NAME}:${TAG_FREQAI_TORCH} \ + --tag ${GHCR_IMAGE_NAME}:${TAG_FREQAI_TORCH} \ + ${CACHE_IMAGE}:${TAG_FREQAI_RL} ${CACHE_IMAGE}:${TAG_FREQAI_RL_ARM} + + - name: Tag latest + if: env.TAG == 'develop' + env: + TAG: ${{ steps.tags.outputs.TAG }} + run: | + # Tag image as latest + docker buildx imagetools create \ + --tag ${GHCR_IMAGE_NAME}:${TAG} \ + --tag ${GHCR_IMAGE_NAME}:latest \ + ${IMAGE_NAME}:${TAG} + + - name: Docker images + run: | + docker images + + - name: Image cleanup + run: | + docker image prune -a --force --filter "until=24h" - name: Discord notification uses: rjstone/discord-webhook-notify@c2597273488aeda841dd1e891321952b51f7996f #v2.2.1 diff --git a/.github/workflows/packages-cleanup.yml b/.github/workflows/packages-cleanup.yml new file mode 100644 index 000000000..9d31504e9 --- /dev/null +++ b/.github/workflows/packages-cleanup.yml @@ -0,0 +1,46 @@ +name: Cleanup Packages + +on: + workflow_call: + inputs: + package_name: + description: 'Package name to clean up' + required: false + default: 'freqtrade' + type: string + + workflow_dispatch: + inputs: + package_name: + description: 'Package name to clean up' + required: false + default: 'freqtrade' + type: choice + options: + - 'freqtrade' + - 'freqtrade-devcontainer' + delete-untagged: + description: 'Whether to delete only untagged images' + required: false + default: true + type: boolean + +env: + PACKAGE_NAME: "freqtrade" + +jobs: + deploy-docker: + name: "Delete Packages" + runs-on: ubuntu-24.04 + if: github.repository == 'freqtrade/freqtrade' + permissions: + packages: write + + steps: + - name: "Delete untagged Package Versions" + uses: actions/delete-package-versions@v5 + with: + package-name: ${{ inputs.package_name || env.PACKAGE_NAME }} + package-type: 'container' + min-versions-to-keep: 10 + delete-only-untagged-versions: ${{ inputs.delete-untagged || 'true' }} diff --git a/.github/workflows/pre-commit-update.yml b/.github/workflows/pre-commit-update.yml index daba4dbf1..666207901 100644 --- a/.github/workflows/pre-commit-update.yml +++ b/.github/workflows/pre-commit-update.yml @@ -17,7 +17,7 @@ jobs: with: persist-credentials: false - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v6 with: python-version: "3.12" diff --git a/.github/workflows/zizmor.yml b/.github/workflows/zizmor.yml index 1cd1c1ac1..e3caca64b 100644 --- a/.github/workflows/zizmor.yml +++ b/.github/workflows/zizmor.yml @@ -26,4 +26,4 @@ jobs: persist-credentials: false - name: Run zizmor 🌈 - uses: zizmorcore/zizmor-action@5ca5fc7a4779c5263a3ffa0e1f693009994446d1 # v0.1.2 + uses: zizmorcore/zizmor-action@e673c3917a1aef3c65c972347ed84ccd013ecda4 # v0.2.0 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b29010fff..2d4a8e5ea 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -21,17 +21,17 @@ repos: # stages: [push] - repo: https://github.com/pre-commit/mirrors-mypy - rev: "v1.17.1" + rev: "v1.18.2" hooks: - id: mypy exclude: build_helpers additional_dependencies: - - types-cachetools==6.1.0.20250717 + - types-cachetools==6.2.0.20250827 - types-filelock==3.2.7 - - types-requests==2.32.4.20250809 + - types-requests==2.32.4.20250913 - types-tabulate==0.9.0.20241207 - types-python-dateutil==2.9.0.20250822 - - scipy-stubs==1.16.1.1 + - scipy-stubs==1.16.2.0 - SQLAlchemy==2.0.43 # stages: [push] @@ -44,7 +44,7 @@ repos: - repo: https://github.com/charliermarsh/ruff-pre-commit # Ruff version. - rev: 'v0.12.10' + rev: 'v0.13.1' hooks: - id: ruff - id: ruff-format @@ -83,6 +83,6 @@ repos: # Ensure github actions remain safe - repo: https://github.com/woodruffw/zizmor-pre-commit - rev: v1.12.1 + rev: v1.13.0 hooks: - id: zizmor diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 66ba4f830..62d823316 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,8 +9,10 @@ Issues labeled [good first issue](https://github.com/freqtrade/freqtrade/labels/ Few pointers for contributions: - Create your PR against the `develop` branch, not `stable`. -- New features need to contain unit tests, must conform to PEP8 (max-line-length = 100) and should be documented with the introduction PR. -- PR's can be declared as `[WIP]` - which signify Work in Progress Pull Requests (which are not finished). +- Stick to english in both commit messages, PR descriptions and code comments and variable names. +- New features need to contain unit tests, must pass CI (run pre-commit and pytest to get an early feedback) and should be documented with the introduction PR. +- PR's can be declared as draft - signaling Work in Progress for Pull Requests (which are not finished). We'll still aim to provide feedback on draft PR's in a timely manner. +- If you're using AI for your PR, please both mention it in the PR description and do a thorough review of the generated code. The final responsibility for the code with the PR author, not with the AI. If you are unsure, discuss the feature on our [discord server](https://discord.gg/p7nuUNVfP7) or in a [issue](https://github.com/freqtrade/freqtrade/issues) before a Pull Request. @@ -43,43 +45,43 @@ pytest tests/test_.py pytest tests/test_.py::test_ ``` -### 2. Test if your code is PEP8 compliant +### 2. Test if your code corresponds to our style guide -#### Run Ruff +We receive a lot of code that fails preliminary CI checks. +To help with that, we encourage contributors to install the git pre-commit hook that will let you know immediately when you try to commit code that fails these checks. + +You can manually run pre-commit with `pre-commit run -a` - or install the git hook with `pre-commit install` to have it run automatically on each commit. + +Running `pre-commit run -a` will run all checks, including `ruff`, `mypy` and `codespell` (among others). + +#### Additional styles applied + +- Have docstrings on all public methods +- Use double-quotes for docstrings +- Multiline docstrings should be indented to the level of the first quote +- Doc-strings should follow the reST format (`:param xxx: ...`, `:return: ...`, `:raises KeyError: ...`) + +#### Manually run the individual checks + +The following sections describe how to run the individual checks that are running as part of the pre-commit hook. + +##### Run ruff + +Check your code with ruff to ensure that it follows the style guide. ```bash ruff check . +ruff format . ``` -We receive a lot of code that fails the `ruff` checks. -To help with that, we encourage you to install the git pre-commit -hook that will warn you when you try to commit code that fails these checks. +##### Run mypy -you can manually run pre-commit with `pre-commit run -a`. - -##### Additional styles applied - -* Have docstrings on all public methods -* Use double-quotes for docstrings -* Multiline docstrings should be indented to the level of the first quote -* Doc-strings should follow the reST format (`:param xxx: ...`, `:return: ...`, `:raises KeyError: ... `) - -### 3. Test if all type-hints are correct - -#### Run mypy +Check your code with mypy to ensure that it follows the type-hinting rules. ``` bash mypy freqtrade ``` -### 4. Ensure formatting is correct - -#### Run ruff - -``` bash -ruff format . -``` - ## (Core)-Committer Guide ### Process: Pull Requests @@ -118,7 +120,7 @@ Exceptions: - Ensure cross-platform compatibility for every change that's accepted. Windows, Mac & Linux. - Ensure no malicious code is introduced into the core code. - Create issues for any major changes and enhancements that you wish to make. Discuss things transparently and get community feedback. -- Keep feature versions as small as possible, preferably one new feature per version. +- Keep feature PR's as small as possible, preferably one new feature per PR. - Be welcoming to newcomers and encourage diverse new contributors from all backgrounds. See the Python Community Code of Conduct (https://www.python.org/psf/codeofconduct/). ### Becoming a Committer @@ -130,6 +132,6 @@ Contributors may be given commit privileges. Preference will be given to those w 1. Access to resources for cross-platform development and testing. 1. Time to devote to the project regularly. -Being a Committer does not grant write permission on `develop` or `stable` for security reasons (Users trust Freqtrade with their Exchange API keys). +Being a Committer does not automatically grant write permission on `develop` or `stable` for security reasons (Users trust Freqtrade with their Exchange API keys). After being Committer for some time, a Committer may be named Core Committer and given full repository access. diff --git a/build_helpers/publish_docker_arm64.sh b/build_helpers/publish_docker_arm64.sh deleted file mode 100755 index 71fc01509..000000000 --- a/build_helpers/publish_docker_arm64.sh +++ /dev/null @@ -1,119 +0,0 @@ -#!/bin/sh - -# Use BuildKit, otherwise building on ARM fails -export DOCKER_BUILDKIT=1 - -IMAGE_NAME=freqtradeorg/freqtrade -CACHE_IMAGE=freqtradeorg/freqtrade_cache -GHCR_IMAGE_NAME=ghcr.io/freqtrade/freqtrade - -# Replace / with _ to create a valid tag -TAG=$(echo "${BRANCH_NAME}" | sed -e "s/\//_/g") -TAG_PLOT=${TAG}_plot -TAG_FREQAI=${TAG}_freqai -TAG_FREQAI_RL=${TAG_FREQAI}rl -TAG_FREQAI_TORCH=${TAG_FREQAI}torch -TAG_PI="${TAG}_pi" - -TAG_ARM=${TAG}_arm -TAG_PLOT_ARM=${TAG_PLOT}_arm -TAG_FREQAI_ARM=${TAG_FREQAI}_arm -TAG_FREQAI_RL_ARM=${TAG_FREQAI_RL}_arm - -echo "Running for ${TAG}" - -# Add commit and commit_message to docker container -echo "${GITHUB_SHA}" > freqtrade_commit - -if [ "${GITHUB_EVENT_NAME}" = "schedule" ]; then - echo "event ${GITHUB_EVENT_NAME}: full rebuild - skipping cache" - # Build regular image - docker build -t freqtrade:${TAG_ARM} . - -else - echo "event ${GITHUB_EVENT_NAME}: building with cache" - # Build regular image - docker pull ${IMAGE_NAME}:${TAG_ARM} - docker build --cache-from ${IMAGE_NAME}:${TAG_ARM} -t freqtrade:${TAG_ARM} . - -fi - -if [ $? -ne 0 ]; then - echo "failed building multiarch images" - return 1 -fi - -docker build --build-arg sourceimage=freqtrade --build-arg sourcetag=${TAG_ARM} -t freqtrade:${TAG_PLOT_ARM} -f docker/Dockerfile.plot . -docker build --build-arg sourceimage=freqtrade --build-arg sourcetag=${TAG_ARM} -t freqtrade:${TAG_FREQAI_ARM} -f docker/Dockerfile.freqai . -docker build --build-arg sourceimage=freqtrade --build-arg sourcetag=${TAG_FREQAI_ARM} -t freqtrade:${TAG_FREQAI_RL_ARM} -f docker/Dockerfile.freqai_rl . - -# Tag image for upload and next build step -docker tag freqtrade:$TAG_ARM ${CACHE_IMAGE}:$TAG_ARM -docker tag freqtrade:$TAG_PLOT_ARM ${CACHE_IMAGE}:$TAG_PLOT_ARM -docker tag freqtrade:$TAG_FREQAI_ARM ${CACHE_IMAGE}:$TAG_FREQAI_ARM -docker tag freqtrade:$TAG_FREQAI_RL_ARM ${CACHE_IMAGE}:$TAG_FREQAI_RL_ARM - -# Run backtest -docker run --rm -v $(pwd)/tests/testdata/config.tests.json:/freqtrade/config.json:ro -v $(pwd)/tests:/tests freqtrade:${TAG_ARM} backtesting --datadir /tests/testdata --strategy-path /tests/strategy/strats/ --strategy StrategyTestV3 - -if [ $? -ne 0 ]; then - echo "failed running backtest" - return 1 -fi - -docker images - -docker push ${CACHE_IMAGE}:$TAG_PLOT_ARM -docker push ${CACHE_IMAGE}:$TAG_FREQAI_ARM -docker push ${CACHE_IMAGE}:$TAG_FREQAI_RL_ARM -docker push ${CACHE_IMAGE}:$TAG_ARM - -# Create multi-arch image -# Make sure that all images contained here are pushed to github first. -# Otherwise installation might fail. -echo "create manifests" - -docker manifest create ${IMAGE_NAME}:${TAG} ${CACHE_IMAGE}:${TAG} ${CACHE_IMAGE}:${TAG_ARM} ${IMAGE_NAME}:${TAG_PI} -docker manifest push -p ${IMAGE_NAME}:${TAG} - -docker manifest create ${IMAGE_NAME}:${TAG_PLOT} ${CACHE_IMAGE}:${TAG_PLOT} ${CACHE_IMAGE}:${TAG_PLOT_ARM} -docker manifest push -p ${IMAGE_NAME}:${TAG_PLOT} - -docker manifest create ${IMAGE_NAME}:${TAG_FREQAI} ${CACHE_IMAGE}:${TAG_FREQAI} ${CACHE_IMAGE}:${TAG_FREQAI_ARM} -docker manifest push -p ${IMAGE_NAME}:${TAG_FREQAI} - -docker manifest create ${IMAGE_NAME}:${TAG_FREQAI_RL} ${CACHE_IMAGE}:${TAG_FREQAI_RL} ${CACHE_IMAGE}:${TAG_FREQAI_RL_ARM} -docker manifest push -p ${IMAGE_NAME}:${TAG_FREQAI_RL} - -# Create special Torch tag - which is identical to the RL tag. -docker manifest create ${IMAGE_NAME}:${TAG_FREQAI_TORCH} ${CACHE_IMAGE}:${TAG_FREQAI_RL} ${CACHE_IMAGE}:${TAG_FREQAI_RL_ARM} -docker manifest push -p ${IMAGE_NAME}:${TAG_FREQAI_TORCH} - -# copy images to ghcr.io - -alias crane="docker run --rm -i -v $(pwd)/.crane:/home/nonroot/.docker/ gcr.io/go-containerregistry/crane" -mkdir .crane -chmod a+rwx .crane - -echo "${GHCR_TOKEN}" | crane auth login ghcr.io -u "${GHCR_USERNAME}" --password-stdin - -crane copy ${IMAGE_NAME}:${TAG_FREQAI_RL} ${GHCR_IMAGE_NAME}:${TAG_FREQAI_RL} -crane copy ${IMAGE_NAME}:${TAG_FREQAI_RL} ${GHCR_IMAGE_NAME}:${TAG_FREQAI_TORCH} -crane copy ${IMAGE_NAME}:${TAG_FREQAI} ${GHCR_IMAGE_NAME}:${TAG_FREQAI} -crane copy ${IMAGE_NAME}:${TAG_PLOT} ${GHCR_IMAGE_NAME}:${TAG_PLOT} -crane copy ${IMAGE_NAME}:${TAG} ${GHCR_IMAGE_NAME}:${TAG} - -# Tag as latest for develop builds -if [ "${TAG}" = "develop" ]; then - echo 'Tagging image as latest' - docker manifest create ${IMAGE_NAME}:latest ${CACHE_IMAGE}:${TAG_ARM} ${IMAGE_NAME}:${TAG_PI} ${CACHE_IMAGE}:${TAG} - docker manifest push -p ${IMAGE_NAME}:latest - - crane copy ${IMAGE_NAME}:latest ${GHCR_IMAGE_NAME}:latest -fi - -docker images -rm -rf .crane - -# Cleanup old images from arm64 node. -docker image prune -a --force --filter "until=24h" diff --git a/build_helpers/publish_docker_multi.sh b/build_helpers/publish_docker_multi.sh deleted file mode 100755 index 34dc1faa3..000000000 --- a/build_helpers/publish_docker_multi.sh +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/sh - -# The below assumes a correctly setup docker buildx environment - -IMAGE_NAME=freqtradeorg/freqtrade -CACHE_IMAGE=freqtradeorg/freqtrade_cache -# Replace / with _ to create a valid tag -TAG=$(echo "${BRANCH_NAME}" | sed -e "s/\//_/g") -TAG_PLOT=${TAG}_plot -TAG_FREQAI=${TAG}_freqai -TAG_FREQAI_RL=${TAG_FREQAI}rl -TAG_PI="${TAG}_pi" - -PI_PLATFORM="linux/arm/v7" -echo "Running for ${TAG}" -CACHE_TAG=${CACHE_IMAGE}:${TAG_PI}_cache - -# Add commit and commit_message to docker container -echo "${GITHUB_SHA}" > freqtrade_commit - -if [ "${GITHUB_EVENT_NAME}" = "schedule" ]; then - echo "event ${GITHUB_EVENT_NAME}: full rebuild - skipping cache" - # Build regular image - docker build -t freqtrade:${TAG} . - # Build PI image - docker buildx build \ - --cache-to=type=registry,ref=${CACHE_TAG} \ - -f docker/Dockerfile.armhf \ - --platform ${PI_PLATFORM} \ - -t ${IMAGE_NAME}:${TAG_PI} \ - --push \ - --provenance=false \ - . -else - echo "event ${GITHUB_EVENT_NAME}: building with cache" - # Build regular image - docker pull ${IMAGE_NAME}:${TAG} - docker build --cache-from ${IMAGE_NAME}:${TAG} -t freqtrade:${TAG} . - - # Pull last build to avoid rebuilding the whole image - # docker pull --platform ${PI_PLATFORM} ${IMAGE_NAME}:${TAG} - # disable provenance due to https://github.com/docker/buildx/issues/1509 - docker buildx build \ - --cache-from=type=registry,ref=${CACHE_TAG} \ - --cache-to=type=registry,ref=${CACHE_TAG} \ - -f docker/Dockerfile.armhf \ - --platform ${PI_PLATFORM} \ - -t ${IMAGE_NAME}:${TAG_PI} \ - --push \ - --provenance=false \ - . -fi - -if [ $? -ne 0 ]; then - echo "failed building multiarch images" - return 1 -fi -# Tag image for upload and next build step -docker tag freqtrade:$TAG ${CACHE_IMAGE}:$TAG - -docker build --build-arg sourceimage=freqtrade --build-arg sourcetag=${TAG} -t freqtrade:${TAG_PLOT} -f docker/Dockerfile.plot . -docker build --build-arg sourceimage=freqtrade --build-arg sourcetag=${TAG} -t freqtrade:${TAG_FREQAI} -f docker/Dockerfile.freqai . -docker build --build-arg sourceimage=freqtrade --build-arg sourcetag=${TAG_FREQAI} -t freqtrade:${TAG_FREQAI_RL} -f docker/Dockerfile.freqai_rl . - -docker tag freqtrade:$TAG_PLOT ${CACHE_IMAGE}:$TAG_PLOT -docker tag freqtrade:$TAG_FREQAI ${CACHE_IMAGE}:$TAG_FREQAI -docker tag freqtrade:$TAG_FREQAI_RL ${CACHE_IMAGE}:$TAG_FREQAI_RL - -# Run backtest -docker run --rm -v $(pwd)/tests/testdata/config.tests.json:/freqtrade/config.json:ro -v $(pwd)/tests:/tests freqtrade:${TAG} backtesting --datadir /tests/testdata --strategy-path /tests/strategy/strats/ --strategy StrategyTestV3 - -if [ $? -ne 0 ]; then - echo "failed running backtest" - return 1 -fi - -docker images - -docker push ${CACHE_IMAGE}:$TAG -docker push ${CACHE_IMAGE}:$TAG_PLOT -docker push ${CACHE_IMAGE}:$TAG_FREQAI -docker push ${CACHE_IMAGE}:$TAG_FREQAI_RL - -docker images - -if [ $? -ne 0 ]; then - echo "failed building image" - return 1 -fi diff --git a/build_helpers/schema.json b/build_helpers/schema.json index 663a6191d..b644bc2f9 100644 --- a/build_helpers/schema.json +++ b/build_helpers/schema.json @@ -587,6 +587,7 @@ "RemotePairList", "MarketCapPairList", "AgeFilter", + "DelistFilter", "FullTradesFilter", "OffsetFilter", "PerformanceFilter", diff --git a/build_helpers/ta_lib-0.6.5-cp311-cp311-manylinux_2_31_armv7l.whl b/build_helpers/ta_lib-0.6.5-cp311-cp311-manylinux_2_31_armv7l.whl deleted file mode 100644 index 0c90c4328..000000000 Binary files a/build_helpers/ta_lib-0.6.5-cp311-cp311-manylinux_2_31_armv7l.whl and /dev/null differ diff --git a/build_helpers/ta_lib-0.6.7-cp311-cp311-manylinux_2_31_armv7l.whl b/build_helpers/ta_lib-0.6.7-cp311-cp311-manylinux_2_31_armv7l.whl new file mode 100644 index 000000000..0968e5276 Binary files /dev/null and b/build_helpers/ta_lib-0.6.7-cp311-cp311-manylinux_2_31_armv7l.whl differ diff --git a/config_examples/config_full.example.json b/config_examples/config_full.example.json index fd5b02089..983b9b3a1 100644 --- a/config_examples/config_full.example.json +++ b/config_examples/config_full.example.json @@ -25,10 +25,10 @@ "trading_mode": "spot", "margin_mode": "", "minimal_roi": { - "40": 0.0, - "30": 0.01, - "20": 0.02, - "0": 0.04 + "40": 0.0, + "30": 0.01, + "20": 0.02, + "0": 0.04 }, "stoploss": -0.10, "unfilledtimeout": { @@ -47,7 +47,7 @@ "bids_to_ask_delta": 1 } }, - "exit_pricing":{ + "exit_pricing": { "price_side": "same", "use_order_book": true, "order_book_top": 1, @@ -70,18 +70,38 @@ "exit": "GTC" }, "pairlists": [ - {"method": "StaticPairList"}, - {"method": "FullTradesFilter"}, + { + "method": "StaticPairList" + }, + { + "method": "DelistFilter", + "max_days_from_now": 0, + }, + { + "method": "FullTradesFilter" + }, { "method": "VolumePairList", "number_assets": 20, "sort_key": "quoteVolume", "refresh_period": 1800 }, - {"method": "AgeFilter", "min_days_listed": 10}, - {"method": "PrecisionFilter"}, - {"method": "PriceFilter", "low_price_ratio": 0.01, "min_price": 0.00000010}, - {"method": "SpreadFilter", "max_spread_ratio": 0.005}, + { + "method": "AgeFilter", + "min_days_listed": 10 + }, + { + "method": "PrecisionFilter" + }, + { + "method": "PriceFilter", + "low_price_ratio": 0.01, + "min_price": 0.00000010 + }, + { + "method": "SpreadFilter", + "max_spread_ratio": 0.005 + }, { "method": "RangeStabilityFilter", "lookback_days": 10, @@ -166,12 +186,12 @@ "external_message_consumer": { "enabled": false, "producers": [ - { - "name": "default", - "host": "127.0.0.2", - "port": 8080, - "ws_token": "secret_ws_t0ken." - } + { + "name": "default", + "host": "127.0.0.2", + "port": 8080, + "ws_token": "secret_ws_t0ken." + } ], "wait_timeout": 300, "ping_timeout": 10, @@ -195,4 +215,4 @@ "reduce_df_footprint": false, "dataformat_ohlcv": "feather", "dataformat_trades": "feather" -} +} \ No newline at end of file diff --git a/docker/Dockerfile.armhf b/docker/Dockerfile.armhf index 9ec944211..dd0c9d670 100644 --- a/docker/Dockerfile.armhf +++ b/docker/Dockerfile.armhf @@ -34,8 +34,7 @@ COPY build_helpers/* /tmp/ # Install dependencies COPY --chown=ftuser:ftuser requirements.txt /freqtrade/ USER ftuser -RUN pip install --user --prefer-binary --no-cache-dir "numpy<3.0" build \ - && pip install --user --no-index --find-links /tmp/ pyarrow TA-Lib \ +RUN pip install --user --only-binary=:all: --find-links /tmp/ pyarrow TA-Lib \ && pip install --user --no-cache-dir -r requirements.txt # Copy dependencies to runtime-image diff --git a/docs/commands/backtesting.md b/docs/commands/backtesting.md index 7082fb362..925b29da6 100644 --- a/docs/commands/backtesting.md +++ b/docs/commands/backtesting.md @@ -10,6 +10,7 @@ usage: freqtrade backtesting [-h] [-v] [--no-color] [--logfile FILE] [-V] [--stake-amount STAKE_AMOUNT] [--fee FLOAT] [-p PAIRS [PAIRS ...]] [--eps] [--enable-protections] + [--enable-dynamic-pairlist] [--dry-run-wallet DRY_RUN_WALLET] [--timeframe-detail TIMEFRAME_DETAIL] [--strategy-list STRATEGY_LIST [STRATEGY_LIST ...]] @@ -44,9 +45,14 @@ options: Allow buying the same pair multiple times (position stacking). --enable-protections, --enableprotections - Enable protections for backtesting.Will slow + Enable protections for backtesting. Will slow backtesting down by a considerable amount, but will include configured protections + --enable-dynamic-pairlist + Enables dynamic pairlist refreshes in backtesting. The + pairlist will be generated for each new candle if + you're using a pairlist handler that supports this + feature, for example, ShuffleFilter. --dry-run-wallet DRY_RUN_WALLET, --starting-balance DRY_RUN_WALLET Starting balance, used for backtesting / hyperopt and dry-runs. diff --git a/docs/commands/download-data.md b/docs/commands/download-data.md index ce80e704e..2975d0717 100644 --- a/docs/commands/download-data.md +++ b/docs/commands/download-data.md @@ -4,6 +4,7 @@ usage: freqtrade download-data [-h] [-v] [--no-color] [--logfile FILE] [-V] [-p PAIRS [PAIRS ...]] [--pairs-file FILE] [--days INT] [--new-pairs-days INT] [--include-inactive-pairs] + [--no-parallel-download] [--timerange TIMERANGE] [--dl-trades] [--convert] [--exchange EXCHANGE] [-t TIMEFRAMES [TIMEFRAMES ...]] [--erase] @@ -24,6 +25,9 @@ options: Default: `None`. --include-inactive-pairs Also download data from inactive pairs. + --no-parallel-download + Disable parallel startup download. Only use this if + you experience issues. --timerange TIMERANGE Specify what timerange of data to use. --dl-trades Download trades instead of OHLCV data. diff --git a/docs/commands/hyperopt.md b/docs/commands/hyperopt.md index f1c8b28b5..933082b9d 100644 --- a/docs/commands/hyperopt.md +++ b/docs/commands/hyperopt.md @@ -44,7 +44,7 @@ options: Allow buying the same pair multiple times (position stacking). --enable-protections, --enableprotections - Enable protections for backtesting.Will slow + Enable protections for backtesting. Will slow backtesting down by a considerable amount, but will include configured protections --dry-run-wallet DRY_RUN_WALLET, --starting-balance DRY_RUN_WALLET diff --git a/docs/commands/lookahead-analysis.md b/docs/commands/lookahead-analysis.md index 880c41ce1..e94876308 100644 --- a/docs/commands/lookahead-analysis.md +++ b/docs/commands/lookahead-analysis.md @@ -11,6 +11,7 @@ usage: freqtrade lookahead-analysis [-h] [-v] [--no-color] [--logfile FILE] [--stake-amount STAKE_AMOUNT] [--fee FLOAT] [-p PAIRS [PAIRS ...]] [--enable-protections] + [--enable-dynamic-pairlist] [--dry-run-wallet DRY_RUN_WALLET] [--timeframe-detail TIMEFRAME_DETAIL] [--strategy-list STRATEGY_LIST [STRATEGY_LIST ...]] @@ -21,6 +22,7 @@ usage: freqtrade lookahead-analysis [-h] [-v] [--no-color] [--logfile FILE] [--minimum-trade-amount INT] [--targeted-trade-amount INT] [--lookahead-analysis-exportfilename LOOKAHEAD_ANALYSIS_EXPORTFILENAME] + [--allow-limit-orders] options: -h, --help show this help message and exit @@ -43,9 +45,14 @@ options: Limit command to these pairs. Pairs are space- separated. --enable-protections, --enableprotections - Enable protections for backtesting.Will slow + Enable protections for backtesting. Will slow backtesting down by a considerable amount, but will include configured protections + --enable-dynamic-pairlist + Enables dynamic pairlist refreshes in backtesting. The + pairlist will be generated for each new candle if + you're using a pairlist handler that supports this + feature, for example, ShuffleFilter. --dry-run-wallet DRY_RUN_WALLET, --starting-balance DRY_RUN_WALLET Starting balance, used for backtesting / hyperopt and dry-runs. @@ -79,6 +86,8 @@ options: --lookahead-analysis-exportfilename LOOKAHEAD_ANALYSIS_EXPORTFILENAME Use this csv-filename to store lookahead-analysis- results + --allow-limit-orders Allow limit orders in lookahead analysis (could cause + false positives in lookahead analysis results). Common arguments: -v, --verbose Verbose mode (-vv for more, -vvv to get all messages). diff --git a/docs/exchanges.md b/docs/exchanges.md index 8d6b96405..859a6cbaf 100644 --- a/docs/exchanges.md +++ b/docs/exchanges.md @@ -2,6 +2,10 @@ This page combines common gotchas and Information which are exchange-specific and most likely don't apply to other exchanges. +## Quick overview of supported exchange features + +--8<-- "includes/exchange-features.md" + ## Exchange configuration Freqtrade is based on [CCXT library](https://github.com/ccxt/ccxt) that supports over 100 cryptocurrency diff --git a/docs/faq.md b/docs/faq.md index 9085a9226..f326b188a 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -297,6 +297,13 @@ Should you be asked to expose your exchange keys or send funds to some random wa Failing to follow these guidelines will not be responsibility of freqtrade. +## Support policy + +We provide free support for Freqtrade on our [Discord server](https://discord.gg/p7nuUNVfP7) and via GitHub issues. +We only support the most recent release (e.g. 2025.8) and the current development branch (e.g. 2025.9-dev). + +If you're on an older version, please follow the [upgrade instructions](updating.md) and see if your problem has already been addressed. + ## "Freqtrade token" Freqtrade does not have a Crypto token offering. diff --git a/docs/freq-ui.md b/docs/freq-ui.md index f1eec3cb9..ff9758888 100644 --- a/docs/freq-ui.md +++ b/docs/freq-ui.md @@ -4,7 +4,7 @@ Freqtrade provides a builtin webserver, which can serve [FreqUI](https://github. By default, the UI is automatically installed as part of the installation (script, docker). freqUI can also be manually installed by using the `freqtrade install-ui` command. -This same command can also be used to update freqUI to new new releases. +This same command can also be used to update freqUI to new releases. Once the bot is started in trade / dry-run mode (with `freqtrade trade`) - the UI will be available under the configured API port (by default `http://127.0.0.1:8080`). @@ -70,7 +70,16 @@ Things you can change (among others): ![FreqUI - Settings view](assets/frequi-settings-dark.png#only-dark) ![FreqUI - Settings view](assets/frequi-settings-light.png#only-light) -## Backtesting +## Webserver mode + +when freqtrade is started in [webserver mode](utils.md#webserver-mode) (freqtrade started with `freqtrade webserver`), the webserver will start in a special mode allowing for additional features, for example: + +* Downloading data +* Testing pairlists +* [Backtesting strategies](#backtesting) +* ... to be expanded + +### Backtesting When freqtrade is started in [webserver mode](utils.md#webserver-mode) (freqtrade started with `freqtrade webserver`), the backtesting view becomes available. This view allows you to backtest strategies and visualize the results. diff --git a/docs/includes/exchange-features.md b/docs/includes/exchange-features.md new file mode 100644 index 000000000..5d84f763b --- /dev/null +++ b/docs/includes/exchange-features.md @@ -0,0 +1,19 @@ + +| Exchange | Mode | Margin mode | Stoploss type | +|---------|---------|------|------------------| +| [Binance](exchanges.md#binance) | spot | | limit | +| [Binance](exchanges.md#binance) | futures | isolated, cross | market, limit | +| [Bingx](exchanges.md#bingx) | spot | | market, limit | +| [Bitmart](exchanges.md#bitmart) | spot | | ❌ (not supported) | +| [Bybit](exchanges.md#bybit) | spot | | ❌ (not supported) | +| [Bybit](exchanges.md#bybit) | futures | isolated | market, limit | +| [Gate.io](exchanges.md#gateio) | spot | | limit | +| [Gate.io](exchanges.md#gateio) | futures | isolated | limit | +| [HTX](exchanges.md#htx) | spot | | limit | +| [Hyperliquid](exchanges.md#hyperliquid) | spot | | ❌ (not supported) | +| [Hyperliquid](exchanges.md#hyperliquid) | futures | isolated | limit | +| [Kraken](exchanges.md#kraken) | spot | | market, limit | +| [OKX](exchanges.md#okx) | spot | | limit | +| [OKX](exchanges.md#okx) | futures | isolated | limit | +| [Bitvavo](exchanges.md#bitvavo) | spot | | ❌ (not supported) | +| [Kucoin](exchanges.md#kucoin) | spot | | market, limit | diff --git a/docs/includes/pairlists.md b/docs/includes/pairlists.md index 32e669065..77811e2b4 100644 --- a/docs/includes/pairlists.md +++ b/docs/includes/pairlists.md @@ -4,7 +4,7 @@ Pairlist Handlers define the list of pairs (pairlist) that the bot should trade. In your configuration, you can use Static Pairlist (defined by the [`StaticPairList`](#static-pair-list) Pairlist Handler) and Dynamic Pairlist (defined by the [`VolumePairList`](#volume-pair-list) and [`PercentChangePairList`](#percent-change-pair-list) Pairlist Handlers). -Additionally, [`AgeFilter`](#agefilter), [`PrecisionFilter`](#precisionfilter), [`PriceFilter`](#pricefilter), [`ShuffleFilter`](#shufflefilter), [`SpreadFilter`](#spreadfilter) and [`VolatilityFilter`](#volatilityfilter) act as Pairlist Filters, removing certain pairs and/or moving their positions in the pairlist. +Additionally, [`AgeFilter`](#agefilter), [`DelistFilter`](#delistfilter), [`PrecisionFilter`](#precisionfilter), [`PriceFilter`](#pricefilter), [`ShuffleFilter`](#shufflefilter), [`SpreadFilter`](#spreadfilter) and [`VolatilityFilter`](#volatilityfilter) act as Pairlist Filters, removing certain pairs and/or moving their positions in the pairlist. If multiple Pairlist Handlers are used, they are chained and a combination of all Pairlist Handlers forms the resulting pairlist the bot uses for trading and backtesting. Pairlist Handlers are executed in the sequence they are configured. You can define either `StaticPairList`, `VolumePairList`, `ProducerPairList`, `RemotePairList`, `MarketCapPairList` or `PercentChangePairList` as the starting Pairlist Handler. @@ -27,6 +27,7 @@ You may also use something like `.*DOWN/BTC` or `.*UP/BTC` to exclude leveraged * [`RemotePairList`](#remotepairlist) * [`MarketCapPairList`](#marketcappairlist) * [`AgeFilter`](#agefilter) +* [`DelistFilter`](#delistfilter) * [`FullTradesFilter`](#fulltradesfilter) * [`OffsetFilter`](#offsetfilter) * [`PerformanceFilter`](#performancefilter) @@ -38,7 +39,7 @@ You may also use something like `.*DOWN/BTC` or `.*UP/BTC` to exclude leveraged * [`VolatilityFilter`](#volatilityfilter) !!! Tip "Testing pairlists" - Pairlist configurations can be quite tricky to get right. Best use the [`test-pairlist`](utils.md#test-pairlist) utility sub-command to test your configuration quickly. + Pairlist configurations can be quite tricky to get right. Best use freqUI in [webserver mode](freq-ui.md#webserver-mode) or the [`test-pairlist`](utils.md#test-pairlist) utility sub-command to test your Pairlist configuration quickly. #### Static Pair List @@ -180,7 +181,7 @@ More sophisticated approach can be used, by using `lookback_timeframe` for candl * `refresh_period`: Defines the interval (in seconds) at which the pairlist will be refreshed. The default is 1800 seconds (30 minutes). * `lookback_days`: Number of days to look back. When `lookback_days` is selected, the `lookback_timeframe` is defaulted to 1 day. * `lookback_timeframe`: Timeframe to use for the lookback period. -* `lookback_period`: Number of periods to look back at. +* `lookback_period`: Number of periods to look back at. When PercentChangePairList is used after other Pairlist Handlers, it will operate on the outputs of those handlers. If it is the leading Pairlist Handler, it will select pairs from all available markets with the specified stake currency. @@ -270,7 +271,6 @@ You can limit the length of the pairlist with the optional parameter `number_ass ], ``` - !!! Tip "Combining pairlists" This pairlist can be combined with all other pairlists and filters for further pairlist reduction, and can also act as an "additional" pairlist, on top of already defined pairs. `ProducerPairList` can also be used multiple times in sequence, combining the pairs from multiple producers. @@ -312,7 +312,7 @@ The `pairlist_url` option specifies the URL of the remote server where the pairl The `save_to_file` option, when provided with a valid filename, saves the processed pairlist to that file in JSON format. This option is optional, and by default, the pairlist is not saved to a file. ??? Example "Multi bot with shared pairlist example" - + `save_to_file` can be used to save the pairlist to a file with Bot1: ```json @@ -407,6 +407,16 @@ be caught out buying before the pair has finished dropping in price. This filter allows freqtrade to ignore pairs until they have been listed for at least `min_days_listed` days and listed before `max_days_listed`. +#### DelistFilter + +Removes pairs that will be delisted on the exchange maximum `max_days_from_now` days from now (defaults to `0` which remove all future delisted pairs no matter how far from now). Currently this filter only supports following exchanges: + +!!! Note "Available exchanges" + Delist filter is only available on Binance, where Binance Futures will work for both dry and live modes, while Binance Spot is limited to live mode (for technical reasons). + +!!! Warning "Backtesting" + `DelistFilter` does not support backtesting mode. + #### FullTradesFilter Shrink whitelist to consist only in-trade pairs when the trade slots are full (when `max_open_trades` isn't being set to `-1` in the config). @@ -438,7 +448,7 @@ Example to remove the first 10 pairs from the pairlist, and takes the next 20 (t ``` !!! Warning - When `OffsetFilter` is used to split a larger pairlist among multiple bots in combination with `VolumeFilter` + When `OffsetFilter` is used to split a larger pairlist among multiple bots in combination with `VolumeFilter` it can not be guaranteed that pairs won't overlap due to slightly different refresh intervals for the `VolumeFilter`. @@ -601,7 +611,7 @@ Adding `"sort_direction": "asc"` or `"sort_direction": "desc"` enables sorting m ### Full example of Pairlist Handlers -The below example blacklists `BNB/BTC`, uses `VolumePairList` with `20` assets, sorting pairs by `quoteVolume` and applies [`PrecisionFilter`](#precisionfilter) and [`PriceFilter`](#pricefilter), filtering all assets where 1 price unit is > 1%. Then the [`SpreadFilter`](#spreadfilter) and [`VolatilityFilter`](#volatilityfilter) is applied and pairs are finally shuffled with the random seed set to some predefined value. +The below example blacklists `BNB/BTC`, uses `VolumePairList` with `20` assets, sorting pairs by `quoteVolume`, then filter future delisted pairs using [`DelistFilter`](#delistfilter) and [`AgeFilter`](#agefilter) to remove pairs that are listed less than 10 days ago. After that [`PrecisionFilter`](#precisionfilter) and [`PriceFilter`](#pricefilter) are applied, filtering all assets where 1 price unit is > 1%. Then the [`SpreadFilter`](#spreadfilter) and [`VolatilityFilter`](#volatilityfilter) are applied and pairs are finally shuffled with the random seed set to some predefined value. ```json "exchange": { @@ -614,6 +624,10 @@ The below example blacklists `BNB/BTC`, uses `VolumePairList` with `20` assets, "number_assets": 20, "sort_key": "quoteVolume" }, + { + "method": "DelistFilter", + "max_days_from_now": 0, + }, {"method": "AgeFilter", "min_days_listed": 10}, {"method": "PrecisionFilter"}, {"method": "PriceFilter", "low_price_ratio": 0.01}, diff --git a/docs/includes/showcase.md b/docs/includes/showcase.md index 6fb5f15cf..4821db01b 100644 --- a/docs/includes/showcase.md +++ b/docs/includes/showcase.md @@ -1,11 +1,11 @@ This section will highlight a few projects from members of the community. !!! Note - The projects below are for the most part not maintained by the freqtrade , therefore use your own caution before using them. + The projects below are for the most part not maintained by the freqtrade team, therefore use your own caution before using them. - [Example freqtrade strategies](https://github.com/freqtrade/freqtrade-strategies/) - [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). -- [TUI for freqtrade](https://github.com/froggleston/freqtrade-frogtrade9000) (by Froggleston). +- [FTUI - Terminal UI for freqtrade](https://github.com/freqtrade/ftui) (by Froggleston). - [Bot Academy](https://botacademy.ddns.net/) (by stash86) - Blog about crypto bot projects. diff --git a/docs/lookahead-analysis.md b/docs/lookahead-analysis.md index d8fb8b7bb..cf2eb9140 100644 --- a/docs/lookahead-analysis.md +++ b/docs/lookahead-analysis.md @@ -22,6 +22,7 @@ This is done by not looking at the strategy code itself, but at changed indicato - `--dry-run-wallet` is forced to be basically infinite (1 billion). - `--stake-amount` is forced to be a static 10000 (10k). - `--enable-protections` is forced to be off. +- `order_types` are forced to be "market" (late entries) unless `--lookahead-allow-limit-orders` is set. These are set to avoid users accidentally generating false positives. @@ -99,6 +100,9 @@ This would lead to a false-negative, i.e. the strategy will be reported as non-b Please don't use any options like enabling position stacking as this will distort the number of checked signals. If you decide to do so, then make doubly sure that you won't ever run out of `max_open_trades` slots, and that you have enough capital in the backtest wallet configuration. +- limit orders in combination with `custom_entry_price()` and `custom_exit_price()` callbacks can cause late / delayed entries and exists, causing false positives. +To avoid this - market orders are forced for this command. This implicitly means that `custom_entry_price()` and `custom_exit_price()` callbacks are not called. +Using `--lookahead-allow-limit-orders` will skip the override and use your configured order types - however has shown to eventually produce false positives. - In the results table, the `biased_indicators` column will falsely flag FreqAI target indicators defined in `set_freqai_targets()` as biased. **These are not biased and can safely be ignored.** diff --git a/docs/requirements-docs.txt b/docs/requirements-docs.txt index 71df421fc..8b9a40a03 100644 --- a/docs/requirements-docs.txt +++ b/docs/requirements-docs.txt @@ -1,6 +1,6 @@ -markdown==3.8.2 +markdown==3.9 mkdocs==1.6.1 -mkdocs-material==9.6.18 +mkdocs-material==9.6.20 mdx_truly_sane_lists==1.3 pymdown-extensions==10.16.1 jinja2==3.1.6 diff --git a/docs/rest-api.md b/docs/rest-api.md index 35a7af75a..796f84c4f 100644 --- a/docs/rest-api.md +++ b/docs/rest-api.md @@ -140,6 +140,11 @@ This method will work for all arguments - check the "show" command for a list of # Get the status of the bot ping = client.ping() print(ping) + + # Add pairs to blacklist + client.blacklist("BTC/USDT", "ETH/USDT") + # Add pairs to blacklist by supplying a list + client.blacklist(*listPairs) # ... ``` @@ -155,63 +160,63 @@ freqtrade-client help Possible commands: available_pairs - Return available pair (backtest data) based on timeframe / stake_currency selection + Return available pair (backtest data) based on timeframe / stake_currency selection :param timeframe: Only pairs with this timeframe available. :param stake_currency: Only pairs that include this timeframe balance - Get the account balance. + Get the account balance. blacklist - Show the current blacklist. + Show the current blacklist. :param add: List of coins to add (example: "BNB/BTC") cancel_open_order - Cancel open order for trade. + Cancel open order for trade. :param trade_id: Cancels open orders for this trade. count - Return the amount of open trades. + Return the amount of open trades. daily - Return the profits for each day, and amount of trades. + Return the profits for each day, and amount of trades. delete_lock - Delete (disable) lock from the database. + Delete (disable) lock from the database. :param lock_id: ID for the lock to delete delete_trade - Delete trade from the database. + Delete trade from the database. Tries to close open orders. Requires manual handling of this asset on the exchange. :param trade_id: Deletes the trade with this ID from the database. forcebuy - Buy an asset. + Buy an asset. :param pair: Pair to buy (ETH/BTC) :param price: Optional - price to buy forceenter - Force entering a trade + Force entering a trade :param pair: Pair to buy (ETH/BTC) :param side: 'long' or 'short' :param price: Optional - price to buy forceexit - Force-exit a trade. + Force-exit a trade. :param tradeid: Id of the trade (can be received via status command) :param ordertype: Order type to use (must be market or limit) :param amount: Amount to sell. Full sell if not given health - Provides a quick health check of the running bot. + Provides a quick health check of the running bot. lock_add Manually lock a specific pair @@ -222,22 +227,22 @@ lock_add :param reason: Reason for the lock locks - Return current locks + Return current locks logs - Show latest logs. + Show latest logs. :param limit: Limits log messages to the last logs. No limit to get the entire log. pair_candles - Return live dataframe for . + Return live dataframe for . :param pair: Pair to get data for :param timeframe: Only pairs with this timeframe available. :param limit: Limit result to the last n candles. pair_history - Return historic, analyzed dataframe + Return historic, analyzed dataframe :param pair: Pair to get data for :param timeframe: Only pairs with this timeframe available. @@ -245,59 +250,59 @@ pair_history :param timerange: Timerange to get data for (same format than --timerange endpoints) performance - Return the performance of the different coins. + Return the performance of the different coins. ping - simple ping + simple ping plot_config - Return plot configuration if the strategy defines one. + Return plot configuration if the strategy defines one. profit - Return the profit summary. + Return the profit summary. reload_config - Reload configuration. + Reload configuration. show_config - Returns part of the configuration, relevant for trading operations. + Returns part of the configuration, relevant for trading operations. start - Start the bot if it's in the stopped state. + 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. + 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). + Return the stats report (durations, sell-reasons). status - Get the status of open trades. + Get the status of open trades. stop - Stop the bot. Use `start` to restart. + Stop the bot. Use `start` to restart. stopbuy - Stop buying (but handle sells gracefully). Use `reload_config` to reset. + Stop buying (but handle sells gracefully). Use `reload_config` to reset. strategies - Lists available strategies + Lists available strategies strategy - Get strategy details + Get strategy details :param strategy: Strategy class name sysinfo - Provides system information (CPU, RAM usage) + Provides system information (CPU, RAM usage) trade - Return specific trade + Return specific trade :param trade_id: Specify which trade to get. trades - Return trades history, sorted by id + Return trades history, sorted by id :param limit: Limits trades to the X last trades. Max 500 trades. :param offset: Offset by this amount of trades. @@ -316,10 +321,10 @@ list_custom_data :param key: str, optional - Key of the custom-data version - Return the version of the bot. + Return the version of the bot. whitelist - Show the current whitelist. + Show the current whitelist. ``` @@ -339,32 +344,32 @@ All endpoints in the below table need to be prefixed with the base URL of the AP | `/reload_config` | POST | Reloads the configuration file. | `/trades` | GET | List last trades. Limited to 500 trades per call. | `/trade/` | GET | Get specific trade.
*Params:*
- `tradeid` (`int`) -| `/trades/` | DELETE | Remove trade from the database. Tries to close open orders. Requires manual handling of this trade on the exchange.
*Params:*
- `tradeid` (`int`) -| `/trades//open-order` | DELETE | Cancel open order for this trade.
*Params:*
- `tradeid` (`int`) -| `/trades//reload` | POST | Reload a trade from the Exchange. Only works in live, and can potentially help recover a trade that was manually sold on the exchange.
*Params:*
- `tradeid` (`int`) +| `/trades/` | DELETE | Remove trade from the database. Tries to close open orders. Requires manual handling of this trade on the exchange.
*Params:*
- `tradeid` (`int`) +| `/trades//open-order` | DELETE | Cancel open order for this trade.
*Params:*
- `tradeid` (`int`) +| `/trades//reload` | POST | Reload a trade from the Exchange. Only works in live, and can potentially help recover a trade that was manually sold on the exchange.
*Params:*
- `tradeid` (`int`) | `/show_config` | GET | Shows part of the current configuration with relevant settings to operation. | `/logs` | GET | Shows last log messages. | `/status` | GET | Lists all open trades. | `/count` | GET | Displays number of trades used and available. -| `/entries` | GET | Shows profit statistics for each enter tags for given pair (or all pairs if pair isn't given). Pair is optional.
*Params:*
- `pair` (`str`) -| `/exits` | GET | Shows profit statistics for each exit reasons for given pair (or all pairs if pair isn't given). Pair is optional.
*Params:*
- `pair` (`str`) -| `/mix_tags` | GET | Shows profit statistics for each combinations of enter tag + exit reasons for given pair (or all pairs if pair isn't given). Pair is optional.
*Params:*
- `pair` (`str`) +| `/entries` | GET | Shows profit statistics for each enter tags for given pair (or all pairs if pair isn't given). Pair is optional.
*Params:*
- `pair` (`str`) +| `/exits` | GET | Shows profit statistics for each exit reasons for given pair (or all pairs if pair isn't given). Pair is optional.
*Params:*
- `pair` (`str`) +| `/mix_tags` | GET | Shows profit statistics for each combinations of enter tag + exit reasons for given pair (or all pairs if pair isn't given). Pair is optional.
*Params:*
- `pair` (`str`) | `/locks` | GET | Displays currently locked pairs. -| `/locks` | POST | Locks a pair until "until". (Until will be rounded up to the nearest timeframe). Side is optional and is either `long` or `short` (default is `long`). Reason is optional.
*Params:*
- `` (`str`)
- `` (`datetime`)
- `[side]` (`str`)
- `[reason]` (`str`) -| `/locks/` | DELETE | Deletes (disables) the lock by id.
*Params:*
- `lockid` (`int`) +| `/locks` | POST | Locks a pair until "until". (Until will be rounded up to the nearest timeframe). Side is optional and is either `long` or `short` (default is `long`). Reason is optional.
*Params:*
- `` (`str`)
- `` (`datetime`)
- `[side]` (`str`)
- `[reason]` (`str`) +| `/locks/` | DELETE | Deletes (disables) the lock by id.
*Params:*
- `lockid` (`int`) | `/profit` | GET | Display a summary of your profit/loss from close trades and some stats about your performance. | `/forceexit` | POST | Instantly exits the given trade (ignoring `minimum_roi`), using the given order type ("market" or "limit", uses your config setting if not specified), and the chosen amount (full sell if not specified). If `all` is supplied as the `tradeid`, then all currently open trades will be forced to exit.
*Params:*
- `` (`int` or `str`)
- `` (`str`)
- `[amount]` (`float`) | `/forceenter` | POST | Instantly enters the given pair. Side is optional and is either `long` or `short` (default is `long`). Rate is optional. (`force_entry_enable` must be set to True)
*Params:*
- `` (`str`)
- `` (`str`)
- `[rate]` (`float`) | `/performance` | GET | Show performance of each finished trade grouped by pair. | `/balance` | GET | Show account balance per currency. -| `/daily` | GET | Shows profit or loss per day, over the last n days (n defaults to 7).
*Params:*
- `` (`int`) -| `/weekly` | GET | Shows profit or loss per week, over the last n days (n defaults to 4).
*Params:*
- `` (`int`) -| `/monthly` | GET | Shows profit or loss per month, over the last n days (n defaults to 3).
*Params:*
- `` (`int`) +| `/daily` | GET | Shows profit or loss per day, over the last n days (n defaults to 7).
*Params:*
- `timescale` (`int`) +| `/weekly` | GET | Shows profit or loss per week, over the last n days (n defaults to 4).
*Params:*
- `timescale` (`int`) +| `/monthly` | GET | Shows profit or loss per month, over the last n days (n defaults to 3).
*Params:*
- `timescale` (`int`) | `/stats` | GET | Display a summary of profit / loss reasons as well as average holding times. | `/whitelist` | GET | Show the current whitelist. | `/blacklist` | GET | Show the current blacklist. -| `/blacklist` | POST | Adds the specified pair to the blacklist.
*Params:*
- `pair` (`str`) -| `/blacklist` | DELETE | Deletes the specified list of pairs from the blacklist.
*Params:*
- `[pair,pair]` (`list[str]`) +| `/blacklist` | POST | Adds the specified pair to the blacklist.
*Params:*
- `blacklist` (`str`) +| `/blacklist` | DELETE | Deletes the specified list of pairs from the blacklist.
*Params:*
- `[pair,pair]` (`list[str]`) | `/pair_candles` | GET | Returns dataframe for a pair / timeframe combination while the bot is running. **Alpha** | `/pair_candles` | POST | Returns dataframe for a pair / timeframe combination while the bot is running, filtered by a provided list of columns to return. **Alpha**
*Params:*
- `` (`list[str]`) | `/pair_history` | GET | Returns an analyzed dataframe for a given timerange, analyzed by a given strategy. **Alpha** @@ -488,7 +493,7 @@ To properly configure your reverse proxy (securely), please consult it's documen ### OpenAPI interface To enable the builtin openAPI interface (Swagger UI), specify `"enable_openapi": true` in the api_server configuration. -This will enable the Swagger UI at the `/docs` endpoint. By default, that's running at http://localhost:8080/docs - but it'll depend on your settings. +This will enable the Swagger UI at the `/docs` endpoint. By default, that's running at - but it'll depend on your settings. ### Advanced API usage using JWT tokens diff --git a/docs/stoploss.md b/docs/stoploss.md index f1a1e487d..9eb3f9c90 100644 --- a/docs/stoploss.md +++ b/docs/stoploss.md @@ -26,18 +26,9 @@ These modes can be configured with these values: Stoploss on exchange is only supported for the following exchanges, and not all exchanges support both stop-limit and stop-market. The Order-type will be ignored if only one mode is available. -| Exchange | stop-loss type | -|----------|-------------| -| Binance | limit | -| Binance Futures | market, limit | -| Bingx | market, limit | -| Bitget | market, limit | -| HTX | limit | -| kraken | market, limit | -| Gate | limit | -| Okx | limit | -| Kucoin | stop-limit, stop-market| -| Hyperliquid (futures only) | limit | +??? info "Supported exchanges and stoploss types" + + --8<-- "includes/exchange-features.md" !!! Note "Tight stoploss" Do not set too low/tight stoploss value when using stop loss on exchange! diff --git a/docs/strategy-callbacks.md b/docs/strategy-callbacks.md index ecc2cbb9b..86219c0d9 100644 --- a/docs/strategy-callbacks.md +++ b/docs/strategy-callbacks.md @@ -1243,6 +1243,10 @@ class AwesomeStrategy(IStrategy): ``` +!!! Tip "Learn more about storing data" + You can learn more about storing data on the [Storing custom trade data](strategy-advanced.md#storing-information-persistent) section. + Please keep in mind that this is considered advanced usage, and should be used with care. + ## Plot annotations callback The plot annotations callback is called whenever freqUI requests data to display a chart. @@ -1261,6 +1265,7 @@ The full object looks like this: "y_start": 94000.2, // Price / y axis value "y_end": 98000, // Price / y axis value "color": "", + "z_level": 5, // z-level, higher values are drawn on top of lower values. Positions relative to the Chart elements need to be set in freqUI. "label": "some label" } ``` @@ -1352,6 +1357,7 @@ Entries will be validated, and won't be passed to the UI if they don't correspon "y_end": price * 1.01, "y_start": price * 0.99, "color": "rgba(0, 255, 0, 0.4)", + "z_level": 5, } ) diff --git a/docs/strategy-customization.md b/docs/strategy-customization.md index 6c09c4cfc..7eb63e64e 100644 --- a/docs/strategy-customization.md +++ b/docs/strategy-customization.md @@ -84,6 +84,7 @@ Check the [configuration documentation](configuration.md) about how to set the b **Always use dry mode when testing as this gives you an idea of how your strategy will work in reality without risking capital.** ## Diving in deeper + **For the following section we will use the [user_data/strategies/sample_strategy.py](https://github.com/freqtrade/freqtrade/blob/develop/freqtrade/templates/sample_strategy.py) file as reference.** @@ -99,9 +100,9 @@ file as reference.** Some common patterns for this are listed in the [Common Mistakes](#common-mistakes-when-developing-strategies) section of this document. ??? Hint "Lookahead and recursive analysis" - Freqtrade includes two helpful commands to help assess common lookahead (using future data) and - recursive bias (variance in indicator values) issues. Before running a strategy in dry or live more, - you should always use these commands first. Please check the relevant documentation for + Freqtrade includes two helpful commands to help assess common lookahead (using future data) and + recursive bias (variance in indicator values) issues. Before running a strategy in dry or live more, + you should always use these commands first. Please check the relevant documentation for [lookahead](lookahead-analysis.md) and [recursive](recursive-analysis.md) analysis. ### Dataframe @@ -154,7 +155,7 @@ Vectorized operations perform calculations across the whole range of data and ar !!! Warning "Trade order assumptions" In backtesting, signals are generated on candle close. Trades are then initiated immeditely on next candle open. - + In dry and live, this may be delayed due to all pair dataframes needing to be analysed first, then trade processing for each of those pairs happens. This means that in dry/live you need to be mindful of having as low a computation delay as possible, usually by running a low number of pairs and having a CPU with a good clock speed. @@ -284,7 +285,7 @@ It's important to always return the dataframe without removing/modifying the col This method will also define a new column, `"enter_long"` (`"enter_short"` for shorts), which needs to contain `1` for entries, and `0` for "no action". `enter_long` is a mandatory column that must be set even if the strategy is shorting only. -You can name your entry signals by using the `"enter_tag"` column, which can help debug and assess your strategy later. +You can name your entry signals by using the `"enter_tag"` column, which can help debug and assess your strategy later. Sample from `user_data/strategies/sample_strategy.py`: @@ -555,7 +556,7 @@ A full sample can be found [in the DataProvider section](#complete-dataprovider- ??? Note "Alternative candle types" Informative_pairs can also provide a 3rd tuple element defining the candle type explicitly. - Availability of alternative candle-types will depend on the trading-mode and the exchange. + Availability of alternative candle-types will depend on the trading-mode and the exchange. In general, spot pairs cannot be used in futures markets, and futures candles can't be used as informative pairs for spot bots. Details about this may vary, if they do, this can be found in the exchange documentation. @@ -783,6 +784,8 @@ Please always check the mode of operation to select the correct method to get da - `ohlcv(pair, timeframe)` - Currently cached candle (OHLCV) data for the pair, returns DataFrame or empty DataFrame. - [`orderbook(pair, maximum)`](#orderbookpair-maximum) - Returns latest orderbook data for the pair, a dict with bids/asks with a total of `maximum` entries. - [`ticker(pair)`](#tickerpair) - Returns current ticker data for the pair. See [ccxt documentation](https://github.com/ccxt/ccxt/wiki/Manual#price-tickers) for more details on the Ticker data structure. +- [`check_delisting(pair)`](#check_delistingpair) - Return Datetime of the pair delisting schedule if any, otherwise return None +- [`funding_rate(pair)`](#funding_ratepair) - Returns current funding rate data for the pair. - `runmode` - Property containing the current runmode. ### Example Usages @@ -854,6 +857,8 @@ dataframe, last_updated = self.dp.get_analyzed_dataframe(pair=metadata['pair'], ### *orderbook(pair, maximum)* +Retrieve the current order book for a pair. + ``` python if self.dp.runmode.value in ('live', 'dry_run'): ob = self.dp.orderbook(metadata['pair'], 1) @@ -903,6 +908,69 @@ if self.dp.runmode.value in ('live', 'dry_run'): !!! Warning "Warning about backtesting" This method will always return up-to-date / real-time values. As such, usage during backtesting / hyperopt without runmode checks will lead to wrong results, e.g. your whole dataframe will contain the same single value in all rows. +### *check_delisting(pair)* + +```python +def custom_exit(self, pair: str, trade: Trade, current_time: datetime, current_rate: float, current_profit: float, **kwargs): + if self.dp.runmode.value in ('live', 'dry_run'): + delisting_dt = self.dp.check_delisting(pair) + if delisting_dt is not None: + return "delist" +``` + +!!! Note "Availabiity of delisting information" + This method is only available for certain exchanges and will return `None` in cases this is not available or if the pair is not scheduled for delisting. + +!!! Warning "Warning about backtesting" + This method will always return up-to-date / real-time values. As such, usage during backtesting / hyperopt without runmode checks will lead to wrong results, e.g. your whole dataframe will contain the same single value in all rows. + +### *funding_rate(pair)* + +Retrieves the current funding rate for the pair and only works for futures pairs in the format of `base/quote:settle` (e.g. `ETH/USDT:USDT`). + +``` python +if self.dp.runmode.value in ('live', 'dry_run'): + funding_rate = self.dp.funding_rate(metadata['pair']) + dataframe['current_funding_rate'] = funding_rate['fundingRate'] + dataframe['next_funding_timestamp'] = funding_rate['fundingTimestamp'] + dataframe['next_funding_datetime'] = funding_rate['fundingDatetime'] +``` + +The funding rate structure is aligned with the funding rate structure from [ccxt](https://github.com/ccxt/ccxt/wiki/Manual#funding-rate-structure), so the result will be formatted as follows: + +``` python +{ + "info": { + # ... + }, + "symbol": "BTC/USDT:USDT", + "markPrice": 110730.7, + "indexPrice": 110782.52, + "interestRate": 0.0001, + "estimatedSettlePrice": 110822.67200153, + "timestamp": 1757146321001, + "datetime": "2025-09-06T08:12:01.001Z", + "fundingRate": 5.609e-05, + "fundingTimestamp": 1757174400000, + "fundingDatetime": "2025-09-06T16:00:00.000Z", + "nextFundingRate": None, + "nextFundingTimestamp": None, + "nextFundingDatetime": None, + "previousFundingRate": None, + "previousFundingTimestamp": None, + "previousFundingDatetime": None, + "interval": None, +} +``` + +Therefore, using `funding_rate['fundingRate']` as demonstrated above will use the current funding rate. +Actually available data will vary between exchanges, so this code may not work as expected across exchanges. + +!!! Warning "Warning about backtesting" + Current funding-rate is not part of the historic data which means backtesting and hyperopt will not work correctly if this method is used, as the method will return up-to-date values. + We recommend to use the historically available funding rate for backtesting (which is automatically downloaded, and is at the frequency of what the exchange provides, usually 4h or 8h). + `self.dp.get_pair_dataframe(pair=metadata['pair'], timeframe='8h', candle_type="funding_rate")` + ### Send Notification The dataprovider `.send_msg()` function allows you to send custom notifications from your strategy. diff --git a/docs/webhook-config.md b/docs/webhook-config.md index 6adf5da21..37b10fdbb 100644 --- a/docs/webhook-config.md +++ b/docs/webhook-config.md @@ -80,6 +80,29 @@ When using the Form-Encoded or JSON-Encoded configuration you can configure any The result would be a POST request with e.g. `Status: running` body and `Content-Type: text/plain` header. +### Nested Webhook Configuration + +Some webhook targets require a nested structure. +This can be accomplished by setting the content as dictionary or list instead of as text directly. + +This is only supported for the JSON format. + +```json +"webhook": { + "enabled": true, + "url": "https://", + "format": "json", + "status": { + "msgtype": "text", + "text": { + "content": "Status update: {status}" + } + } +} +``` + +The result would be a POST request with e.g. `{"msgtype":"text","text":{"content":"Status update: running"}}` body and `Content-Type: application/json` header. + ## Additional configurations The `webhook.retries` parameter can be set for the maximum number of retries the webhook request should attempt if it is unsuccessful (i.e. HTTP response status is not 200). By default this is set to `0` which is disabled. An additional `webhook.retry_delay` parameter can be set to specify the time in seconds between retry attempts. By default this is set to `0.1` (i.e. 100ms). Note that increasing the number of retries or retry delay may slow down the trader if there are connectivity issues with the webhook. diff --git a/freqtrade/__init__.py b/freqtrade/__init__.py index 12e87dd73..526eea458 100644 --- a/freqtrade/__init__.py +++ b/freqtrade/__init__.py @@ -1,6 +1,6 @@ """Freqtrade bot""" -__version__ = "2025.8" +__version__ = "2025.9" if "dev" in __version__: from pathlib import Path diff --git a/freqtrade/commands/arguments.py b/freqtrade/commands/arguments.py index f96148e3c..6f60e6f86 100755 --- a/freqtrade/commands/arguments.py +++ b/freqtrade/commands/arguments.py @@ -49,6 +49,7 @@ ARGS_BACKTEST = [ *ARGS_COMMON_OPTIMIZE, "position_stacking", "enable_protections", + "enable_dynamic_pairlist", "dry_run_wallet", "timeframe_detail", "strategy_list", @@ -164,6 +165,7 @@ ARGS_DOWNLOAD_DATA = [ "days", "new_pairs_days", "include_inactive", + "no_parallel_download", "timerange", "download_trades", "convert_trades", @@ -259,7 +261,12 @@ ARGS_LOOKAHEAD_ANALYSIS = [ a for a in ARGS_BACKTEST if a not in ("position_stacking", "backtest_cache", "backtest_breakdown", "backtest_notes") -] + ["minimum_trade_amount", "targeted_trade_amount", "lookahead_analysis_exportfilename"] +] + [ + "minimum_trade_amount", + "targeted_trade_amount", + "lookahead_analysis_exportfilename", + "lookahead_allow_limit_orders", +] ARGS_RECURSIVE_ANALYSIS = ["timeframe", "timerange", "dataformat_ohlcv", "pairs", "startup_candle"] diff --git a/freqtrade/commands/cli_options.py b/freqtrade/commands/cli_options.py index b4641597d..9df2c3128 100755 --- a/freqtrade/commands/cli_options.py +++ b/freqtrade/commands/cli_options.py @@ -184,12 +184,20 @@ AVAILABLE_CLI_OPTIONS = { "enable_protections": Arg( "--enable-protections", "--enableprotections", - help="Enable protections for backtesting." + help="Enable protections for backtesting. " "Will slow backtesting down by a considerable amount, but will include " "configured protections", action="store_true", default=False, ), + "enable_dynamic_pairlist": Arg( + "--enable-dynamic-pairlist", + help="Enables dynamic pairlist refreshes in backtesting. " + "The pairlist will be generated for each new candle if you're using a " + "pairlist handler that supports this feature, for example, ShuffleFilter.", + action="store_true", + default=False, + ), "strategy_list": Arg( "--strategy-list", help="Provide a space-separated list of strategies to backtest. " @@ -454,6 +462,11 @@ AVAILABLE_CLI_OPTIONS = { help="Also download data from inactive pairs.", action="store_true", ), + "no_parallel_download": Arg( + "--no-parallel-download", + help="Disable parallel startup download. Only use this if you experience issues.", + action="store_true", + ), "new_pairs_days": Arg( "--new-pairs-days", help="Download data of new pairs for given number of days. Default: `%(default)s`.", @@ -801,6 +814,14 @@ AVAILABLE_CLI_OPTIONS = { help="Specify startup candles to be checked (`199`, `499`, `999`, `1999`).", nargs="+", ), + "lookahead_allow_limit_orders": Arg( + "--allow-limit-orders", + help=( + "Allow limit orders in lookahead analysis (could cause false positives " + "in lookahead analysis results)." + ), + action="store_true", + ), "show_sensitive": Arg( "--show-sensitive", help="Show secrets in the output.", diff --git a/freqtrade/commands/list_commands.py b/freqtrade/commands/list_commands.py index 4bd2c0270..8d567d90e 100644 --- a/freqtrade/commands/list_commands.py +++ b/freqtrade/commands/list_commands.py @@ -66,7 +66,7 @@ def start_list_exchanges(args: dict[str, Any]) -> None: if exchange["is_alias"]: name.stylize("strike") classname.stylize("strike") - classname.append(f" (use {exchange['alias_for']})", style="italic") + classname.append(f"\n -> use {exchange['alias_for']}", style="italic") trade_modes = Text( ", ".join( diff --git a/freqtrade/configuration/config_validation.py b/freqtrade/configuration/config_validation.py index 4c14d3d4b..9e9f0ada9 100644 --- a/freqtrade/configuration/config_validation.py +++ b/freqtrade/configuration/config_validation.py @@ -113,7 +113,6 @@ def _validate_price_config(conf: dict[str, Any]) -> None: """ When using market orders, price sides must be using the "other" side of the price """ - # TODO: The below could be an enforced setting when using market orders if conf.get("order_types", {}).get("entry") == "market" and conf.get("entry_pricing", {}).get( "price_side" ) not in ("ask", "other"): diff --git a/freqtrade/configuration/configuration.py b/freqtrade/configuration/configuration.py index 5f1715d9a..4b95d004d 100644 --- a/freqtrade/configuration/configuration.py +++ b/freqtrade/configuration/configuration.py @@ -18,7 +18,10 @@ from freqtrade.constants import Config from freqtrade.enums import ( NON_UTIL_MODES, TRADE_MODES, + CandleType, + MarginMode, RunMode, + TradingMode, ) from freqtrade.exceptions import OperationalException from freqtrade.loggers import setup_logging @@ -230,6 +233,9 @@ class Configuration: config["exportdirectory"] = config["user_data_dir"] / "backtest_results" if not config.get("exportfilename"): config["exportfilename"] = None + if config.get("exportfilename"): + # ensure exportfilename is a Path object + config["exportfilename"] = Path(config["exportfilename"]) config["exportdirectory"] = Path(config["exportdirectory"]) if self.args.get("show_sensitive"): @@ -256,7 +262,13 @@ class Configuration: self._args_to_config( config, argname="enable_protections", - logstring="Parameter --enable-protections detected, enabling Protections. ...", + logstring="Parameter --enable-protections detected, enabling Protections ...", + ) + + self._args_to_config( + config, + argname="enable_dynamic_pairlist", + logstring="Parameter --enable-dynamic-pairlist detected, enabling dynamic pairlist ...", ) if self.args.get("max_open_trades"): @@ -312,7 +324,6 @@ class Configuration: "recursive_strategy_search", "Recursively searching for a strategy in the strategies folder.", ), - ("timeframe", "Overriding timeframe with Command line argument"), ("export", "Parameter --export detected: {} ..."), ("backtest_breakdown", "Parameter --breakdown detected ..."), ("backtest_cache", "Parameter --cache={} detected ..."), @@ -391,6 +402,7 @@ class Configuration: ("timeframes", "timeframes --timeframes: {}"), ("days", "Detected --days: {}"), ("include_inactive", "Detected --include-inactive-pairs: {}"), + ("no_parallel_download", "Detected --no-parallel-download: {}"), ("download_trades", "Detected --dl-trades: {}"), ("convert_trades", "Detected --convert: {} - Converting Trade data to OHCV {}"), ("dataformat_ohlcv", 'Using "{}" to store OHLCV data.'), @@ -406,6 +418,14 @@ class Configuration: self._args_to_config( config, argname="trading_mode", logstring="Detected --trading-mode: {}" ) + # TODO: The following 3 lines (candle_type_def, trading_mode, margin_mode) are actually + # set in the exchange class. They're however necessary as fallback to avoid + # random errors in commands that don't initialize an exchange. + config["candle_type_def"] = CandleType.get_default( + config.get("trading_mode", "spot") or "spot" + ) + config["trading_mode"] = TradingMode(config.get("trading_mode", "spot") or "spot") + config["margin_mode"] = MarginMode(config.get("margin_mode", "") or "") self._args_to_config( config, argname="candle_types", logstring="Detected --candle-types: {}" ) diff --git a/freqtrade/configuration/timerange.py b/freqtrade/configuration/timerange.py index 9a2b47504..2b18a2c65 100644 --- a/freqtrade/configuration/timerange.py +++ b/freqtrade/configuration/timerange.py @@ -80,6 +80,9 @@ class TimeRange: val = stopdt.strftime(DATETIME_PRINT_FORMAT) return val + def __repr__(self) -> str: + return f"TimeRange({self.timerange_str})" + def __eq__(self, other): """Override the default Equals behavior""" return ( diff --git a/freqtrade/constants.py b/freqtrade/constants.py index 807b0888b..6ce87793a 100644 --- a/freqtrade/constants.py +++ b/freqtrade/constants.py @@ -49,6 +49,7 @@ AVAILABLE_PAIRLISTS = [ "RemotePairList", "MarketCapPairList", "AgeFilter", + "DelistFilter", "FullTradesFilter", "OffsetFilter", "PerformanceFilter", diff --git a/freqtrade/data/converter/converter.py b/freqtrade/data/converter/converter.py index 48a07082e..4331519c2 100644 --- a/freqtrade/data/converter/converter.py +++ b/freqtrade/data/converter/converter.py @@ -181,7 +181,6 @@ def trim_dataframes( def order_book_to_dataframe(bids: list, asks: list) -> DataFrame: """ - TODO: This should get a dedicated test Gets order book list, returns dataframe with below format per suggested by creslin ------------------------------------------------------------------- b_sum b_size bids asks a_size a_sum diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index ed1da4ca2..dfab29c08 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -23,7 +23,7 @@ from freqtrade.data.history import get_datahandler, load_pair_history from freqtrade.enums import CandleType, RPCMessageType, RunMode, TradingMode from freqtrade.exceptions import ExchangeError, OperationalException from freqtrade.exchange import Exchange, timeframe_to_prev_date, timeframe_to_seconds -from freqtrade.exchange.exchange_types import OrderBook +from freqtrade.exchange.exchange_types import FundingRate, OrderBook from freqtrade.misc import append_candles_to_dataframe from freqtrade.rpc import RPCManager from freqtrade.rpc.rpc_types import RPCAnalyzedDFMsg @@ -498,7 +498,12 @@ class DataProvider: return DataFrame() def trades( - self, pair: str, timeframe: str | None = None, copy: bool = True, candle_type: str = "" + self, + pair: str, + timeframe: str | None = None, + copy: bool = True, + candle_type: str = "", + timerange: TimeRange | None = None, ) -> DataFrame: """ Get candle (TRADES) data for the given pair as DataFrame @@ -526,7 +531,7 @@ class DataProvider: self._config["datadir"], data_format=self._config["dataformat_trades"] ) trades_df = data_handler.trades_load( - pair, self._config.get("trading_mode", TradingMode.SPOT) + pair, self._config.get("trading_mode", TradingMode.SPOT), timerange=timerange ) return trades_df @@ -543,6 +548,7 @@ class DataProvider: def ticker(self, pair: str): """ Return last ticker data from exchange + Warning: Performs a network request - so use with common sense. :param pair: Pair to get the data for :return: Ticker dict from exchange or empty dict if ticker is not available for the pair """ @@ -556,7 +562,7 @@ class DataProvider: def orderbook(self, pair: str, maximum: int) -> OrderBook: """ Fetch latest l2 orderbook data - Warning: Does a network request - so use with common sense. + Warning: Performs a network request - so use with common sense. :param pair: pair to get the data for :param maximum: Maximum number of orderbook entries to query :return: dict including bids/asks with a total of `maximum` entries. @@ -565,6 +571,23 @@ class DataProvider: raise OperationalException(NO_EXCHANGE_EXCEPTION) return self._exchange.fetch_l2_order_book(pair, maximum) + def funding_rate(self, pair: str) -> FundingRate: + """ + Return Funding rate from the exchange + Warning: Performs a network request - so use with common sense. + :param pair: Pair to get the data for + :return: Funding rate dict from exchange or empty dict if funding rate is not available + If available, the "fundingRate" field will contain the funding rate. + "fundingTimestamp" and "fundingDatetime" will contain the next funding times. + Actually filled fields may vary between exchanges. + """ + if self._exchange is None: + raise OperationalException(NO_EXCHANGE_EXCEPTION) + try: + return self._exchange.fetch_funding_rate(pair) + except ExchangeError: + return {} + def send_msg(self, message: str, *, always_send: bool = False) -> None: """ Send custom RPC Notifications from your bot. @@ -581,3 +604,19 @@ class DataProvider: if always_send or message not in self.__msg_cache: self._msg_queue.append(message) self.__msg_cache[message] = True + + def check_delisting(self, pair: str) -> datetime | None: + """ + Check if a pair gonna be delisted on the exchange. + Will only return datetime if the pair is gonna be delisted. + :param pair: Pair to check + :return: Datetime of the pair's delisting, None otherwise + """ + if self._exchange is None: + raise OperationalException(NO_EXCHANGE_EXCEPTION) + + try: + return self._exchange.check_delisting_time(pair) + except ExchangeError: + logger.warning(f"Could not fetch market data for {pair}. Assuming no delisting.") + return None diff --git a/freqtrade/data/history/datahandlers/featherdatahandler.py b/freqtrade/data/history/datahandlers/featherdatahandler.py index 46fd7e3ae..ef293d6b2 100644 --- a/freqtrade/data/history/datahandlers/featherdatahandler.py +++ b/freqtrade/data/history/datahandlers/featherdatahandler.py @@ -1,6 +1,7 @@ import logging from pandas import DataFrame, read_feather, to_datetime +from pyarrow import dataset from freqtrade.configuration import TimeRange from freqtrade.constants import DEFAULT_DATAFRAME_COLUMNS, DEFAULT_TRADES_COLUMNS @@ -111,22 +112,71 @@ class FeatherDataHandler(IDataHandler): """ raise NotImplementedError() + def _build_arrow_time_filter(self, timerange: TimeRange | None): + """ + Build Arrow predicate filter for timerange filtering. + Treats 0 as unbounded (no filter on that side). + :param timerange: TimeRange object with start/stop timestamps + :return: Arrow filter expression or None if fully unbounded + """ + if not timerange: + return None + + # Treat 0 as unbounded + start_set = bool(timerange.startts and timerange.startts > 0) + stop_set = bool(timerange.stopts and timerange.stopts > 0) + + if not (start_set or stop_set): + return None + + ts_field = dataset.field("timestamp") + exprs = [] + + if start_set: + exprs.append(ts_field >= timerange.startts) + if stop_set: + exprs.append(ts_field <= timerange.stopts) + + if len(exprs) == 1: + return exprs[0] + else: + return exprs[0] & exprs[1] + def _trades_load( self, pair: str, trading_mode: TradingMode, timerange: TimeRange | None = None ) -> DataFrame: """ Load a pair from file, either .json.gz or .json - # TODO: respect timerange ... :param pair: Load trades for this pair :param trading_mode: Trading mode to use (used to determine the filename) - :param timerange: Timerange to load trades for - currently not implemented + :param timerange: Timerange to load trades for - filters data to this range if provided :return: Dataframe containing trades """ filename = self._pair_trades_filename(self._datadir, pair, trading_mode) if not filename.exists(): return DataFrame(columns=DEFAULT_TRADES_COLUMNS) - tradesdata = read_feather(filename) + # Use Arrow dataset with optional timerange filtering, fallback to read_feather + try: + dataset_reader = dataset.dataset(filename, format="feather") + time_filter = self._build_arrow_time_filter(timerange) + + if time_filter is not None and timerange is not None: + tradesdata = dataset_reader.to_table(filter=time_filter).to_pandas() + start_desc = timerange.startts if timerange.startts > 0 else "unbounded" + stop_desc = timerange.stopts if timerange.stopts > 0 else "unbounded" + logger.debug( + f"Loaded {len(tradesdata)} trades for {pair} " + f"(filtered start={start_desc}, stop={stop_desc})" + ) + else: + tradesdata = dataset_reader.to_table().to_pandas() + logger.debug(f"Loaded {len(tradesdata)} trades for {pair} (unfiltered)") + + except (ImportError, AttributeError, ValueError) as e: + # Fallback: load entire file + logger.warning(f"Unable to use Arrow filtering, loading entire trades file: {e}") + tradesdata = read_feather(filename) return tradesdata diff --git a/freqtrade/data/history/history_utils.py b/freqtrade/data/history/history_utils.py index 9cb14e3e0..3b93d2bdc 100644 --- a/freqtrade/data/history/history_utils.py +++ b/freqtrade/data/history/history_utils.py @@ -6,7 +6,14 @@ from pathlib import Path from pandas import DataFrame, concat from freqtrade.configuration import TimeRange -from freqtrade.constants import DATETIME_PRINT_FORMAT, DL_DATA_TIMEFRAMES, DOCS_LINK, Config +from freqtrade.constants import ( + DATETIME_PRINT_FORMAT, + DL_DATA_TIMEFRAMES, + DOCS_LINK, + Config, + ListPairsWithTimeframes, + PairWithTimeframe, +) from freqtrade.data.converter import ( clean_ohlcv_dataframe, convert_trades_to_ohlcv, @@ -17,6 +24,7 @@ from freqtrade.data.history.datahandlers import IDataHandler, get_datahandler from freqtrade.enums import CandleType, TradingMode from freqtrade.exceptions import OperationalException from freqtrade.exchange import Exchange +from freqtrade.exchange.exchange_utils import date_minus_candles from freqtrade.plugins.pairlist.pairlist_helpers import dynamic_expand_pairlist from freqtrade.util import dt_now, dt_ts, format_ms_time, format_ms_time_det from freqtrade.util.migrations import migrate_data @@ -226,6 +234,7 @@ def _download_pair_history( candle_type: CandleType, erase: bool = False, prepend: bool = False, + pair_candles: DataFrame | None = None, ) -> bool: """ Download latest candles from the exchange for the pair and timeframe passed in parameters @@ -238,6 +247,7 @@ def _download_pair_history( :param timerange: range of time to download :param candle_type: Any of the enum CandleType (must match trading mode!) :param erase: Erase existing data + :param pair_candles: Optional with "1 call" pair candles. :return: bool with success state """ data_handler = get_datahandler(datadir, data_handler=data_handler) @@ -271,21 +281,40 @@ def _download_pair_history( "Current End: %s", f"{data.iloc[-1]['date']:{DATETIME_PRINT_FORMAT}}" if not data.empty else "None", ) - - # Default since_ms to 30 days if nothing is given - new_dataframe = exchange.get_historic_ohlcv( - pair=pair, - timeframe=timeframe, - since_ms=( - since_ms - if since_ms - else int((datetime.now() - timedelta(days=new_pairs_days)).timestamp()) * 1000 - ), - is_new_pair=data.empty, - candle_type=candle_type, - until_ms=until_ms if until_ms else None, + # used to check if the passed in pair_candles (parallel downloaded) covers since_ms. + # If we need more data, we have to fall back to the standard method. + pair_candles_since_ms = ( + dt_ts(pair_candles.iloc[0]["date"]) + if pair_candles is not None and len(pair_candles.index) > 0 + else 0 ) - logger.info(f"Downloaded data for {pair} with length {len(new_dataframe)}.") + if ( + pair_candles is None + or len(pair_candles.index) == 0 + or data.empty + or prepend is True + or erase is True + or pair_candles_since_ms > (since_ms if since_ms else 0) + ): + new_dataframe = exchange.get_historic_ohlcv( + pair=pair, + timeframe=timeframe, + since_ms=( + since_ms + if since_ms + else int((datetime.now() - timedelta(days=new_pairs_days)).timestamp()) * 1000 + ), + is_new_pair=data.empty, + candle_type=candle_type, + until_ms=until_ms if until_ms else None, + ) + logger.info(f"Downloaded data for {pair} with length {len(new_dataframe)}.") + else: + new_dataframe = pair_candles + logger.info( + f"Downloaded data for {pair} with length {len(new_dataframe)}. Parallel Method." + ) + if data.empty: data = new_dataframe else: @@ -330,6 +359,7 @@ def refresh_backtest_ohlcv_data( data_format: str | None = None, prepend: bool = False, progress_tracker: CustomProgress | None = None, + no_parallel_download: bool = False, ) -> list[str]: """ Refresh stored ohlcv data for backtesting and hyperopt operations. @@ -339,6 +369,7 @@ def refresh_backtest_ohlcv_data( progress_tracker = retrieve_progress_tracker(progress_tracker) pairs_not_available = [] + fast_candles: dict[PairWithTimeframe, DataFrame] = {} data_handler = get_datahandler(datadir, data_format) candle_type = CandleType.get_default(trading_mode) with progress_tracker as progress: @@ -355,6 +386,30 @@ def refresh_backtest_ohlcv_data( logger.info(f"Skipping pair {pair}...") continue for timeframe in timeframes: + # Get fast candles via parallel method on first loop through per timeframe + # and candle type. Downloads all the pairs in the list and stores them. + if ( + not no_parallel_download + and exchange.get_option("download_data_parallel_quick", True) + and ( + ((pair, timeframe, candle_type) not in fast_candles) + and (erase is False) + and (prepend is False) + ) + ): + fast_candles.update( + _download_all_pairs_history_parallel( + exchange=exchange, + pairs=pairs, + timeframe=timeframe, + candle_type=candle_type, + timerange=timerange, + ) + ) + + # get the already downloaded pair candles if they exist + pair_candles = fast_candles.pop((pair, timeframe, candle_type), None) + progress.update(timeframe_task, description=f"Timeframe {timeframe}") logger.debug(f"Downloading pair {pair}, {candle_type}, interval {timeframe}.") _download_pair_history( @@ -368,6 +423,7 @@ def refresh_backtest_ohlcv_data( candle_type=candle_type, erase=erase, prepend=prepend, + pair_candles=pair_candles, # optional pass of dataframe of parallel candles ) progress.update(timeframe_task, advance=1) if trading_mode == "futures": @@ -404,6 +460,41 @@ def refresh_backtest_ohlcv_data( return pairs_not_available +def _download_all_pairs_history_parallel( + exchange: Exchange, + pairs: list[str], + timeframe: str, + candle_type: CandleType, + timerange: TimeRange | None = None, +) -> dict[PairWithTimeframe, DataFrame]: + """ + Allows to use the faster parallel async download method for many coins + but only if the data is short enough to be retrieved in one call. + Used by freqtrade download-data subcommand. + :return: Candle pairs with timeframes + """ + candles: dict[PairWithTimeframe, DataFrame] = {} + since = 0 + if timerange: + if timerange.starttype == "date": + since = timerange.startts * 1000 + + candle_limit = exchange.ohlcv_candle_limit(timeframe, candle_type) + one_call_min_time_dt = dt_ts(date_minus_candles(timeframe, candle_limit)) + # check if we can get all candles in one go, if so then we can download them in parallel + if since > one_call_min_time_dt: + logger.info( + f"Downloading parallel candles for {timeframe} for all pairs " + f"since {format_ms_time(since)}" + ) + needed_pairs: ListPairsWithTimeframes = [ + (p, timeframe, candle_type) for p in [p for p in pairs] + ] + candles = exchange.refresh_latest_ohlcv(needed_pairs, since_ms=since, cache=False) + + return candles + + def _download_trades_history( exchange: Exchange, pair: str, @@ -702,6 +793,7 @@ def download_data( trading_mode=config.get("trading_mode", "spot"), prepend=config.get("prepend_data", False), progress_tracker=progress_tracker, + no_parallel_download=config.get("no_parallel_download", False), ) finally: if pairs_not_available: diff --git a/freqtrade/exchange/binance.py b/freqtrade/exchange/binance.py index 67ae53997..2974adb0a 100644 --- a/freqtrade/exchange/binance.py +++ b/freqtrade/exchange/binance.py @@ -5,10 +5,11 @@ from datetime import UTC, datetime from pathlib import Path import ccxt +from cachetools import TTLCache from pandas import DataFrame from freqtrade.constants import DEFAULT_DATAFRAME_COLUMNS -from freqtrade.enums import CandleType, MarginMode, PriceType, TradingMode +from freqtrade.enums import TRADE_MODES, CandleType, MarginMode, PriceType, RunMode, TradingMode from freqtrade.exceptions import DDosProtection, OperationalException, TemporaryError from freqtrade.exchange import Exchange from freqtrade.exchange.binance_public_data import ( @@ -40,6 +41,7 @@ class Binance(Exchange): "fetch_orders_limit_minutes": None, "l2_limit_range": [5, 10, 20, 50, 100, 500, 1000], "ws_enabled": True, + "has_delisting": True, } _ft_has_futures: FtHas = { "funding_fee_candle_limit": 1000, @@ -68,6 +70,10 @@ class Binance(Exchange): (TradingMode.FUTURES, MarginMode.ISOLATED), ] + def __init__(self, *args, **kwargs) -> None: + super().__init__(*args, **kwargs) + self._spot_delist_schedule_cache: TTLCache = TTLCache(maxsize=100, ttl=300) + def get_proxy_coin(self) -> str: """ Get the proxy coin for the given coin @@ -391,7 +397,7 @@ class Binance(Exchange): 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=}") + logger.info(f"Fetching trades for {pair} from Binance, {from_id=}, {since=}, {until=}") if not self._config["exchange"].get("only_from_ccxt", False): if from_id is None or not since: @@ -432,3 +438,105 @@ class Binance(Exchange): return await super()._async_get_trade_history_id( pair, until=until, since=since, from_id=from_id ) + + def _check_delisting_futures(self, pair: str) -> datetime | None: + delivery_time = self.markets.get(pair, {}).get("info", {}).get("deliveryDate", None) + if delivery_time: + if isinstance(delivery_time, str) and (delivery_time != ""): + delivery_time = int(delivery_time) + + # Binance set a very high delivery time for all perpetuals. + # We compare with delivery time of BTC/USDT:USDT which assumed to never be delisted + btc_delivery_time = ( + self.markets.get("BTC/USDT:USDT", {}).get("info", {}).get("deliveryDate", None) + ) + + if delivery_time == btc_delivery_time: + return None + + delivery_time = dt_from_ts(delivery_time) + + return delivery_time + + def check_delisting_time(self, pair: str) -> datetime | None: + """ + Check if the pair gonna be delisted. + By default, it returns None. + :param pair: Market symbol + :return: Datetime if the pair gonna be delisted, None otherwise + """ + if self._config["runmode"] not in TRADE_MODES: + return None + + if self.trading_mode == TradingMode.FUTURES: + return self._check_delisting_futures(pair) + return self._get_spot_pair_delist_time(pair, refresh=False) + + def _get_spot_delist_schedule(self): + """ + Get the delisting schedule for spot pairs + Only works in live mode as it requires API keys, + Return sample: + [{ + "delistTime": "1759114800000", + "symbols": [ + "OMNIBTC", + "OMNIFDUSD", + "OMNITRY", + "OMNIUSDC", + "OMNIUSDT" + ] + }] + """ + try: + delist_schedule = self._api.sapi_get_spot_delist_schedule() + return delist_schedule + except ccxt.DDoSProtection as e: + raise DDosProtection(e) from e + except (ccxt.NetworkError, ccxt.OperationFailed, ccxt.ExchangeError) as e: + raise TemporaryError( + f"Could not get delist schedule {e.__class__.__name__}. Message: {e}" + ) from e + except ccxt.BaseError as e: + raise OperationalException(e) from e + + def _get_spot_pair_delist_time(self, pair: str, refresh: bool = False) -> datetime | None: + """ + Get the delisting time for a pair if it will be delisted + :param pair: Pair to get the delisting time for + :param refresh: true if you need fresh data + :return: int: delisting time None if not delisting + """ + + if not pair or not self._config["runmode"] == RunMode.LIVE: + # Endpoint only works in live mode as it requires API keys + return None + + cache = self._spot_delist_schedule_cache + + if not refresh: + if delist_time := cache.get(pair, None): + return delist_time + + delist_schedule = self._get_spot_delist_schedule() + + if delist_schedule is None: + return None + + for schedule in delist_schedule: + delist_dt = dt_from_ts(int(schedule["delistTime"])) + for symbol in schedule["symbols"]: + ft_symbol = next( + ( + pair + for pair, market in self.markets.items() + if market.get("id", None) == symbol + ), + None, + ) + if ft_symbol is None: + continue + + cache[ft_symbol] = delist_dt + + return cache.get(pair, None) diff --git a/freqtrade/exchange/binance_leverage_tiers.json b/freqtrade/exchange/binance_leverage_tiers.json index f878a09bd..dfe4a32d5 100644 --- a/freqtrade/exchange/binance_leverage_tiers.json +++ b/freqtrade/exchange/binance_leverage_tiers.json @@ -1,4 +1,159 @@ { + "0G/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "0G/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "20000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "0G/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "200000", + "notionalFloor": "20000", + "maintMarginRatio": "0.015", + "cum": "100.0" + } + }, + { + "tier": 3.0, + "symbol": "0G/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "1000000", + "notionalFloor": "200000", + "maintMarginRatio": "0.02", + "cum": "1100.0" + } + }, + { + "tier": 4.0, + "symbol": "0G/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.025", + "cum": "6100.0" + } + }, + { + "tier": 5.0, + "symbol": "0G/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.05", + "cum": "56100.0" + } + }, + { + "tier": 6.0, + "symbol": "0G/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "7500000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.1", + "cum": "306100.0" + } + }, + { + "tier": 7.0, + "symbol": "0G/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "10000000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.125", + "cum": "493600.0" + } + }, + { + "tier": 8.0, + "symbol": "0G/USDT:USDT", + "currency": "USDT", + "minNotional": 10000000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "12500000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1743600.0" + } + }, + { + "tier": 9.0, + "symbol": "0G/USDT:USDT", + "currency": "USDT", + "minNotional": 12500000.0, + "maxNotional": 15000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "15000000", + "notionalFloor": "12500000", + "maintMarginRatio": "0.5", + "cum": "4868600.0" + } + } + ], "1000000BOB/USDT:USDT": [ { "tier": 1.0, @@ -1020,13 +1175,13 @@ "symbol": "1000FLOKI/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "25000", + "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -1036,51 +1191,51 @@ "tier": 4.0, "symbol": "1000FLOKI/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "25000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "200.0" + "cum": "325.0" } }, { "tier": 5.0, "symbol": "1000FLOKI/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 100000.0, + "maxNotional": 175000.0, + "maintenanceMarginRate": 0.0333, + "maxLeverage": 15.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "125000", - "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1450.0" + "initialLeverage": "15", + "notionalCap": "175000", + "notionalFloor": "100000", + "maintMarginRatio": "0.0333", + "cum": "1155.0" } }, { "tier": 6.0, "symbol": "1000FLOKI/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 175000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "10", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.1", - "cum": "7700.0" + "notionalFloor": "175000", + "maintMarginRatio": "0.05", + "cum": "4077.5" } }, { @@ -1088,54 +1243,71 @@ "symbol": "1000FLOKI/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "500000", + "initialLeverage": "5", + "notionalCap": "750000", "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "13950.0" + "maintMarginRatio": "0.1", + "cum": "16577.5" } }, { "tier": 8.0, "symbol": "1000FLOKI/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "8", - "initialLeverage": "3", - "notionalCap": "4500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.1667", - "cum": "34800.0" + "initialLeverage": "4", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.125", + "cum": "35327.5" } }, { "tier": 9.0, "symbol": "1000FLOKI/USDT:USDT", "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "9", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.1667", + "cum": "97877.5" + } + }, + { + "tier": 10.0, + "symbol": "1000FLOKI/USDT:USDT", + "currency": "USDT", "minNotional": 4500000.0, "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "409650.0" + "cum": "472727.5" } }, { - "tier": 10.0, + "tier": 11.0, "symbol": "1000FLOKI/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -1143,12 +1315,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "11", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2284650.0" + "cum": "2347727.5" } } ], @@ -4050,15 +4222,15 @@ "symbol": "ACT/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 1000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "75", - "notionalCap": "1000", + "initialLeverage": "50", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.015", "cum": "0.0" } }, @@ -4066,123 +4238,89 @@ "tier": 2.0, "symbol": "ACT/USDT:USDT", "currency": "USDT", - "minNotional": 1000.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", - "notionalCap": "5000", - "notionalFloor": "1000", - "maintMarginRatio": "0.015", - "cum": "5.0" + "initialLeverage": "20", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { "tier": 3.0, "symbol": "ACT/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 9000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 10000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "9000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "30.0" + "initialLeverage": "10", + "notionalCap": "20000", + "notionalFloor": "10000", + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "ACT/USDT:USDT", "currency": "USDT", - "minNotional": 9000.0, - "maxNotional": 26000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "26000", - "notionalFloor": "9000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "ACT/USDT:USDT", "currency": "USDT", - "minNotional": 26000.0, - "maxNotional": 65000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 50000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "65000", - "notionalFloor": "26000", - "maintMarginRatio": "0.05", - "cum": "725.0" + "initialLeverage": "4", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "2550.0" } }, { "tier": 6.0, "symbol": "ACT/USDT:USDT", "currency": "USDT", - "minNotional": 65000.0, - "maxNotional": 138000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "6", - "initialLeverage": "5", - "notionalCap": "138000", - "notionalFloor": "65000", - "maintMarginRatio": "0.1", - "cum": "3975.0" - } - }, - { - "tier": 7.0, - "symbol": "ACT/USDT:USDT", - "currency": "USDT", - "minNotional": 138000.0, - "maxNotional": 360000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "7", - "initialLeverage": "4", - "notionalCap": "360000", - "notionalFloor": "138000", - "maintMarginRatio": "0.125", - "cum": "7425.0" - } - }, - { - "tier": 8.0, - "symbol": "ACT/USDT:USDT", - "currency": "USDT", - "minNotional": 360000.0, + "minNotional": 250000.0, "maxNotional": 4500000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", - "notionalFloor": "360000", + "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "22437.0" + "cum": "12975.0" } }, { - "tier": 9.0, + "tier": 7.0, "symbol": "ACT/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -4190,16 +4328,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "397287.0" + "cum": "387825.0" } }, { - "tier": 10.0, + "tier": 8.0, "symbol": "ACT/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -4207,12 +4345,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2272287.0" + "cum": "2262825.0" } } ], @@ -4722,15 +4860,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -4738,71 +4876,54 @@ "symbol": "AERGO/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "AERGO/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "AERGO/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "AERGO/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "AERGO/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -4810,16 +4931,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "AERGO/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -4827,16 +4948,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "AERGO/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -4844,12 +4965,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -5904,6 +6025,161 @@ } } ], + "AIA/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "AIA/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": "AIA/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": "AIA/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "AIA/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 62500.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "62500", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 5.0, + "symbol": "AIA/USDT:USDT", + "currency": "USDT", + "minNotional": 62500.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "125000", + "notionalFloor": "62500", + "maintMarginRatio": "0.1", + "cum": "3825.0" + } + }, + { + "tier": 6.0, + "symbol": "AIA/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.125", + "cum": "6950.0" + } + }, + { + "tier": 7.0, + "symbol": "AIA/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1667", + "cum": "17375.0" + } + }, + { + "tier": 8.0, + "symbol": "AIA/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "392225.0" + } + }, + { + "tier": 9.0, + "symbol": "AIA/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "2267225.0" + } + } + ], "AIN/USDT:USDT": [ { "tier": 1.0, @@ -6066,15 +6342,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -6082,71 +6358,54 @@ "symbol": "AIO/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "AIO/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "AIO/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "AIO/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "AIO/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -6154,16 +6413,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "AIO/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -6171,16 +6430,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "AIO/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -6188,12 +6447,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -9401,6 +9660,161 @@ } } ], + "ARIA/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "ARIA/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": "ARIA/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": "ARIA/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "ARIA/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 62500.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "62500", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 5.0, + "symbol": "ARIA/USDT:USDT", + "currency": "USDT", + "minNotional": 62500.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "125000", + "notionalFloor": "62500", + "maintMarginRatio": "0.1", + "cum": "3825.0" + } + }, + { + "tier": 6.0, + "symbol": "ARIA/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.125", + "cum": "6950.0" + } + }, + { + "tier": 7.0, + "symbol": "ARIA/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1667", + "cum": "17375.0" + } + }, + { + "tier": 8.0, + "symbol": "ARIA/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "392225.0" + } + }, + { + "tier": 9.0, + "symbol": "ARIA/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "2267225.0" + } + } + ], "ARK/USDT:USDT": [ { "tier": 1.0, @@ -9987,6 +10401,195 @@ } } ], + "ASTER/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "ASTER/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": "ASTER/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": "ASTER/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "50000", + "notionalFloor": "10000", + "maintMarginRatio": "0.02", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "ASTER/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.025", + "cum": "325.0" + } + }, + { + "tier": 5.0, + "symbol": "ASTER/USDT:USDT", + "currency": "USDT", + "minNotional": 100000.0, + "maxNotional": 175000.0, + "maintenanceMarginRate": 0.0333, + "maxLeverage": 15.0, + "info": { + "bracket": "5", + "initialLeverage": "15", + "notionalCap": "175000", + "notionalFloor": "100000", + "maintMarginRatio": "0.0333", + "cum": "1155.0" + } + }, + { + "tier": 6.0, + "symbol": "ASTER/USDT:USDT", + "currency": "USDT", + "minNotional": 175000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "6", + "initialLeverage": "10", + "notionalCap": "250000", + "notionalFloor": "175000", + "maintMarginRatio": "0.05", + "cum": "4077.5" + } + }, + { + "tier": 7.0, + "symbol": "ASTER/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "7", + "initialLeverage": "5", + "notionalCap": "750000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1", + "cum": "16577.5" + } + }, + { + "tier": 8.0, + "symbol": "ASTER/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "8", + "initialLeverage": "4", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.125", + "cum": "35327.5" + } + }, + { + "tier": 9.0, + "symbol": "ASTER/USDT:USDT", + "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "9", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.1667", + "cum": "97877.5" + } + }, + { + "tier": 10.0, + "symbol": "ASTER/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "10", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "472727.5" + } + }, + { + "tier": 11.0, + "symbol": "ASTER/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "11", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "2347727.5" + } + } + ], "ASTR/USDT:USDT": [ { "tier": 1.0, @@ -10320,13 +10923,13 @@ "symbol": "ATH/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "25000", + "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -10336,51 +10939,51 @@ "tier": 4.0, "symbol": "ATH/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "25000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "200.0" + "cum": "325.0" } }, { "tier": 5.0, "symbol": "ATH/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 100000.0, + "maxNotional": 175000.0, + "maintenanceMarginRate": 0.0333, + "maxLeverage": 15.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "125000", - "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1450.0" + "initialLeverage": "15", + "notionalCap": "175000", + "notionalFloor": "100000", + "maintMarginRatio": "0.0333", + "cum": "1155.0" } }, { "tier": 6.0, "symbol": "ATH/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 175000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "10", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.1", - "cum": "7700.0" + "notionalFloor": "175000", + "maintMarginRatio": "0.05", + "cum": "4077.5" } }, { @@ -10388,54 +10991,71 @@ "symbol": "ATH/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "500000", + "initialLeverage": "5", + "notionalCap": "750000", "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "13950.0" + "maintMarginRatio": "0.1", + "cum": "16577.5" } }, { "tier": 8.0, "symbol": "ATH/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "8", - "initialLeverage": "3", - "notionalCap": "4500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.1667", - "cum": "34800.0" + "initialLeverage": "4", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.125", + "cum": "35327.5" } }, { "tier": 9.0, "symbol": "ATH/USDT:USDT", "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "9", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.1667", + "cum": "97877.5" + } + }, + { + "tier": 10.0, + "symbol": "ATH/USDT:USDT", + "currency": "USDT", "minNotional": 4500000.0, "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "409650.0" + "cum": "472727.5" } }, { - "tier": 10.0, + "tier": 11.0, "symbol": "ATH/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -10443,12 +11063,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "11", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2284650.0" + "cum": "2347727.5" } } ], @@ -11416,6 +12036,178 @@ } } ], + "AVNT/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "AVNT/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": "AVNT/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": "AVNT/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": "AVNT/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": "AVNT/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": "AVNT/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": "AVNT/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": "AVNT/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34800.0" + } + }, + { + "tier": 9.0, + "symbol": "AVNT/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "409650.0" + } + }, + { + "tier": 10.0, + "symbol": "AVNT/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "2284650.0" + } + } + ], "AWE/USDT:USDT": [ { "tier": 1.0, @@ -12232,15 +13024,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -12248,71 +13040,54 @@ "symbol": "B3/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "B3/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "B3/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "B3/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "B3/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -12320,16 +13095,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "B3/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -12337,16 +13112,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "B3/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -12354,12 +13129,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -13673,6 +14448,178 @@ } } ], + "BARD/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "BARD/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": "BARD/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": "BARD/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": "BARD/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": "BARD/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": "BARD/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": "BARD/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": "BARD/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34800.0" + } + }, + { + "tier": 9.0, + "symbol": "BARD/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "409650.0" + } + }, + { + "tier": 10.0, + "symbol": "BARD/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "2284650.0" + } + } + ], "BAS/USDT:USDT": [ { "tier": 1.0, @@ -14970,13 +15917,13 @@ "symbol": "BERA/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "25000", + "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -14986,51 +15933,51 @@ "tier": 4.0, "symbol": "BERA/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "25000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "200.0" + "cum": "325.0" } }, { "tier": 5.0, "symbol": "BERA/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 100000.0, + "maxNotional": 175000.0, + "maintenanceMarginRate": 0.0333, + "maxLeverage": 15.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "125000", - "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1450.0" + "initialLeverage": "15", + "notionalCap": "175000", + "notionalFloor": "100000", + "maintMarginRatio": "0.0333", + "cum": "1155.0" } }, { "tier": 6.0, "symbol": "BERA/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 175000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "10", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.1", - "cum": "7700.0" + "notionalFloor": "175000", + "maintMarginRatio": "0.05", + "cum": "4077.5" } }, { @@ -15038,54 +15985,71 @@ "symbol": "BERA/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "500000", + "initialLeverage": "5", + "notionalCap": "750000", "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "13950.0" + "maintMarginRatio": "0.1", + "cum": "16577.5" } }, { "tier": 8.0, "symbol": "BERA/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "8", - "initialLeverage": "3", - "notionalCap": "4500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.1667", - "cum": "34800.0" + "initialLeverage": "4", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.125", + "cum": "35327.5" } }, { "tier": 9.0, "symbol": "BERA/USDT:USDT", "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "9", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.1667", + "cum": "97877.5" + } + }, + { + "tier": 10.0, + "symbol": "BERA/USDT:USDT", + "currency": "USDT", "minNotional": 4500000.0, "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "409650.0" + "cum": "472727.5" } }, { - "tier": 10.0, + "tier": 11.0, "symbol": "BERA/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -15093,12 +16057,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "11", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2284650.0" + "cum": "2347727.5" } } ], @@ -15928,6 +16892,161 @@ } } ], + "BLESS/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "BLESS/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": "BLESS/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": "BLESS/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "BLESS/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 62500.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "62500", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 5.0, + "symbol": "BLESS/USDT:USDT", + "currency": "USDT", + "minNotional": 62500.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "125000", + "notionalFloor": "62500", + "maintMarginRatio": "0.1", + "cum": "3825.0" + } + }, + { + "tier": 6.0, + "symbol": "BLESS/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.125", + "cum": "6950.0" + } + }, + { + "tier": 7.0, + "symbol": "BLESS/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1667", + "cum": "17375.0" + } + }, + { + "tier": 8.0, + "symbol": "BLESS/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "392225.0" + } + }, + { + "tier": 9.0, + "symbol": "BLESS/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "2267225.0" + } + } + ], "BLUR/USDT:USDT": [ { "tier": 1.0, @@ -16710,15 +17829,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -16726,71 +17845,54 @@ "symbol": "BNT/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "BNT/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "BNT/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "BNT/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "BNT/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -16798,16 +17900,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "BNT/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -16815,16 +17917,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "BNT/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -16832,12 +17934,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -21820,6 +22922,161 @@ } } ], + "COAI/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "COAI/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": "COAI/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": "COAI/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "COAI/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 62500.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "62500", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 5.0, + "symbol": "COAI/USDT:USDT", + "currency": "USDT", + "minNotional": 62500.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "125000", + "notionalFloor": "62500", + "maintMarginRatio": "0.1", + "cum": "3825.0" + } + }, + { + "tier": 6.0, + "symbol": "COAI/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.125", + "cum": "6950.0" + } + }, + { + "tier": 7.0, + "symbol": "COAI/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1667", + "cum": "17375.0" + } + }, + { + "tier": 8.0, + "symbol": "COAI/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "392225.0" + } + }, + { + "tier": 9.0, + "symbol": "COAI/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "2267225.0" + } + } + ], "COMBO/USDT:USDT": [ { "tier": 1.0, @@ -23222,15 +24479,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -23238,71 +24495,54 @@ "symbol": "CTK/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "CTK/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "CTK/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "CTK/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "CTK/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -23310,16 +24550,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "CTK/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -23327,16 +24567,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "CTK/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -23344,12 +24584,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -23687,15 +24927,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -23703,71 +24943,54 @@ "symbol": "CVC/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "CVC/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "CVC/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "CVC/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "CVC/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -23775,16 +24998,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "CVC/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -23792,16 +25015,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "CVC/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -23809,12 +25032,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -25048,15 +26271,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -25064,71 +26287,54 @@ "symbol": "DEGEN/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "DEGEN/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "DEGEN/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "DEGEN/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "DEGEN/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -25136,16 +26342,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "DEGEN/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -25153,16 +26359,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "DEGEN/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -25170,12 +26376,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -26823,14 +28029,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" } }, @@ -26840,14 +28046,14 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "50", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.015", "cum": "25.0" } }, @@ -26856,15 +28062,15 @@ "symbol": "DOLO/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "50000", + "initialLeverage": "25", + "notionalCap": "25000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.02", "cum": "75.0" } }, @@ -26872,21 +28078,38 @@ "tier": 4.0, "symbol": "DOLO/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": "DOLO/USDT:USDT", + "currency": "USDT", "minNotional": 50000.0, "maxNotional": 125000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { - "bracket": "4", + "bracket": "5", "initialLeverage": "10", "notionalCap": "125000", "notionalFloor": "50000", "maintMarginRatio": "0.05", - "cum": "1325.0" + "cum": "1450.0" } }, { - "tier": 5.0, + "tier": 6.0, "symbol": "DOLO/USDT:USDT", "currency": "USDT", "minNotional": 125000.0, @@ -26894,16 +28117,16 @@ "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { - "bracket": "5", + "bracket": "6", "initialLeverage": "5", "notionalCap": "250000", "notionalFloor": "125000", "maintMarginRatio": "0.1", - "cum": "7575.0" + "cum": "7700.0" } }, { - "tier": 6.0, + "tier": 7.0, "symbol": "DOLO/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -26911,16 +28134,16 @@ "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "4", "notionalCap": "500000", "notionalFloor": "250000", "maintMarginRatio": "0.125", - "cum": "13825.0" + "cum": "13950.0" } }, { - "tier": 7.0, + "tier": 8.0, "symbol": "DOLO/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, @@ -26928,16 +28151,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "500000", "maintMarginRatio": "0.1667", - "cum": "34675.0" + "cum": "34800.0" } }, { - "tier": 8.0, + "tier": 9.0, "symbol": "DOLO/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -26945,16 +28168,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "409525.0" + "cum": "409650.0" } }, { - "tier": 9.0, + "tier": 10.0, "symbol": "DOLO/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -26962,12 +28185,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2284525.0" + "cum": "2284650.0" } } ], @@ -28268,13 +29491,13 @@ "symbol": "EIGEN/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "25000", + "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -28284,51 +29507,51 @@ "tier": 4.0, "symbol": "EIGEN/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "25000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "200.0" + "cum": "325.0" } }, { "tier": 5.0, "symbol": "EIGEN/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 100000.0, + "maxNotional": 175000.0, + "maintenanceMarginRate": 0.0333, + "maxLeverage": 15.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "125000", - "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1450.0" + "initialLeverage": "15", + "notionalCap": "175000", + "notionalFloor": "100000", + "maintMarginRatio": "0.0333", + "cum": "1155.0" } }, { "tier": 6.0, "symbol": "EIGEN/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 175000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "10", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.1", - "cum": "7700.0" + "notionalFloor": "175000", + "maintMarginRatio": "0.05", + "cum": "4077.5" } }, { @@ -28336,54 +29559,71 @@ "symbol": "EIGEN/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "500000", + "initialLeverage": "5", + "notionalCap": "750000", "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "13950.0" + "maintMarginRatio": "0.1", + "cum": "16577.5" } }, { "tier": 8.0, "symbol": "EIGEN/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "8", - "initialLeverage": "3", - "notionalCap": "4500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.1667", - "cum": "34800.0" + "initialLeverage": "4", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.125", + "cum": "35327.5" } }, { "tier": 9.0, "symbol": "EIGEN/USDT:USDT", "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "9", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.1667", + "cum": "97877.5" + } + }, + { + "tier": 10.0, + "symbol": "EIGEN/USDT:USDT", + "currency": "USDT", "minNotional": 4500000.0, "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "409650.0" + "cum": "472727.5" } }, { - "tier": 10.0, + "tier": 11.0, "symbol": "EIGEN/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -28391,12 +29631,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "11", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2284650.0" + "cum": "2347727.5" } } ], @@ -29543,15 +30783,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -29559,71 +30799,54 @@ "symbol": "ESPORTS/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "ESPORTS/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "ESPORTS/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "ESPORTS/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "ESPORTS/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -29631,16 +30854,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "ESPORTS/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -29648,16 +30871,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "ESPORTS/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -29665,12 +30888,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -30901,13 +32124,13 @@ "symbol": "ETHFI/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "25000", + "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -30917,51 +32140,51 @@ "tier": 4.0, "symbol": "ETHFI/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "25000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "200.0" + "cum": "325.0" } }, { "tier": 5.0, "symbol": "ETHFI/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 100000.0, + "maxNotional": 175000.0, + "maintenanceMarginRate": 0.0333, + "maxLeverage": 15.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "125000", - "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1450.0" + "initialLeverage": "15", + "notionalCap": "175000", + "notionalFloor": "100000", + "maintMarginRatio": "0.0333", + "cum": "1155.0" } }, { "tier": 6.0, "symbol": "ETHFI/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 175000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "10", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.1", - "cum": "7700.0" + "notionalFloor": "175000", + "maintMarginRatio": "0.05", + "cum": "4077.5" } }, { @@ -30969,54 +32192,71 @@ "symbol": "ETHFI/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "500000", + "initialLeverage": "5", + "notionalCap": "750000", "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "13950.0" + "maintMarginRatio": "0.1", + "cum": "16577.5" } }, { "tier": 8.0, "symbol": "ETHFI/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "8", - "initialLeverage": "3", - "notionalCap": "4500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.1667", - "cum": "34800.0" + "initialLeverage": "4", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.125", + "cum": "35327.5" } }, { "tier": 9.0, "symbol": "ETHFI/USDT:USDT", "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "9", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.1667", + "cum": "97877.5" + } + }, + { + "tier": 10.0, + "symbol": "ETHFI/USDT:USDT", + "currency": "USDT", "minNotional": 4500000.0, "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "409650.0" + "cum": "472727.5" } }, { - "tier": 10.0, + "tier": 11.0, "symbol": "ETHFI/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -31024,12 +32264,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "11", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2284650.0" + "cum": "2347727.5" } } ], @@ -32721,6 +33961,178 @@ } } ], + "FLOCK/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "FLOCK/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": "FLOCK/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": "FLOCK/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": "FLOCK/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": "FLOCK/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": "FLOCK/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": "FLOCK/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": "FLOCK/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34800.0" + } + }, + { + "tier": 9.0, + "symbol": "FLOCK/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "409650.0" + } + }, + { + "tier": 10.0, + "symbol": "FLOCK/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "2284650.0" + } + } + ], "FLOW/USDT:USDT": [ { "tier": 1.0, @@ -32893,6 +34305,178 @@ } } ], + "FLUID/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "FLUID/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": "FLUID/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": "FLUID/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": "FLUID/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": "FLUID/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": "FLUID/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": "FLUID/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": "FLUID/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34800.0" + } + }, + { + "tier": 9.0, + "symbol": "FLUID/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "409650.0" + } + }, + { + "tier": 10.0, + "symbol": "FLUID/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "2284650.0" + } + } + ], "FLUX/USDT:USDT": [ { "tier": 1.0, @@ -34122,13 +35706,13 @@ "symbol": "GALA/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "25000", + "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -34138,51 +35722,51 @@ "tier": 4.0, "symbol": "GALA/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "25000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "200.0" + "cum": "325.0" } }, { "tier": 5.0, "symbol": "GALA/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 100000.0, + "maxNotional": 175000.0, + "maintenanceMarginRate": 0.0333, + "maxLeverage": 15.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "125000", - "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1450.0" + "initialLeverage": "15", + "notionalCap": "175000", + "notionalFloor": "100000", + "maintMarginRatio": "0.0333", + "cum": "1155.0" } }, { "tier": 6.0, "symbol": "GALA/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 175000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "10", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.1", - "cum": "7700.0" + "notionalFloor": "175000", + "maintMarginRatio": "0.05", + "cum": "4077.5" } }, { @@ -34190,54 +35774,71 @@ "symbol": "GALA/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "500000", + "initialLeverage": "5", + "notionalCap": "750000", "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "13950.0" + "maintMarginRatio": "0.1", + "cum": "16577.5" } }, { "tier": 8.0, "symbol": "GALA/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "8", - "initialLeverage": "3", - "notionalCap": "4500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.1667", - "cum": "34800.0" + "initialLeverage": "4", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.125", + "cum": "35327.5" } }, { "tier": 9.0, "symbol": "GALA/USDT:USDT", "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "9", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.1667", + "cum": "97877.5" + } + }, + { + "tier": 10.0, + "symbol": "GALA/USDT:USDT", + "currency": "USDT", "minNotional": 4500000.0, "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "409650.0" + "cum": "472727.5" } }, { - "tier": 10.0, + "tier": 11.0, "symbol": "GALA/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -34245,12 +35846,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "11", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2284650.0" + "cum": "2347727.5" } } ], @@ -35329,14 +36930,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.015", "cum": "0.0" } }, @@ -35346,14 +36947,14 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "25", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.02", "cum": "25.0" } }, @@ -35363,15 +36964,15 @@ "currency": "USDT", "minNotional": 10000.0, "maxNotional": 25000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "20", "notionalCap": "25000", "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" + "maintMarginRatio": "0.025", + "cum": "75.0" } }, { @@ -35379,50 +36980,50 @@ "symbol": "GPS/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxNotional": 62500.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", + "initialLeverage": "10", + "notionalCap": "62500", "notionalFloor": "25000", - "maintMarginRatio": "0.1", - "cum": "1525.0" + "maintMarginRatio": "0.05", + "cum": "700.0" } }, { "tier": 5.0, "symbol": "GPS/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 62500.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "100000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2775.0" + "initialLeverage": "5", + "notionalCap": "125000", + "notionalFloor": "62500", + "maintMarginRatio": "0.1", + "cum": "3825.0" } }, { "tier": 6.0, "symbol": "GPS/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, + "minNotional": 125000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "6", - "initialLeverage": "3", + "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "100000", - "maintMarginRatio": "0.1667", - "cum": "6945.0" + "notionalFloor": "125000", + "maintMarginRatio": "0.125", + "cum": "6950.0" } }, { @@ -35430,33 +37031,50 @@ "symbol": "GPS/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "7", - "initialLeverage": "2", - "notionalCap": "500000", + "initialLeverage": "3", + "notionalCap": "4500000", "notionalFloor": "250000", - "maintMarginRatio": "0.25", - "cum": "27770.0" + "maintMarginRatio": "0.1667", + "cum": "17375.0" } }, { "tier": 8.0, "symbol": "GPS/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 800000.0, + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "392225.0" + } + }, + { + "tier": 9.0, + "symbol": "GPS/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "800000", - "notionalFloor": "500000", + "notionalCap": "12500000", + "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "152770.0" + "cum": "2267225.0" } } ], @@ -36959,6 +38577,161 @@ } } ], + "HEMI/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "HEMI/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": "HEMI/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": "HEMI/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "HEMI/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 62500.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "62500", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 5.0, + "symbol": "HEMI/USDT:USDT", + "currency": "USDT", + "minNotional": 62500.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "125000", + "notionalFloor": "62500", + "maintMarginRatio": "0.1", + "cum": "3825.0" + } + }, + { + "tier": 6.0, + "symbol": "HEMI/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.125", + "cum": "6950.0" + } + }, + { + "tier": 7.0, + "symbol": "HEMI/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1667", + "cum": "17375.0" + } + }, + { + "tier": 8.0, + "symbol": "HEMI/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "392225.0" + } + }, + { + "tier": 9.0, + "symbol": "HEMI/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "2267225.0" + } + } + ], "HFT/USDT:USDT": [ { "tier": 1.0, @@ -37552,15 +39325,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -37568,71 +39341,54 @@ "symbol": "HIVE/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "HIVE/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "HIVE/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "HIVE/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "HIVE/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -37640,16 +39396,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "HIVE/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -37657,16 +39413,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "HIVE/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -37674,12 +39430,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -37821,6 +39577,178 @@ } } ], + "HOLO/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "HOLO/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": "HOLO/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": "HOLO/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": "HOLO/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": "HOLO/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": "HOLO/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": "HOLO/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": "HOLO/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34800.0" + } + }, + { + "tier": 9.0, + "symbol": "HOLO/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "409650.0" + } + }, + { + "tier": 10.0, + "symbol": "HOLO/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "2284650.0" + } + } + ], "HOME/USDT:USDT": [ { "tier": 1.0, @@ -38464,13 +40392,13 @@ "symbol": "HYPE/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 7500.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "7500", + "notionalCap": "20000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -38480,170 +40408,136 @@ "tier": 2.0, "symbol": "HYPE/USDT:USDT", "currency": "USDT", - "minNotional": 7500.0, - "maxNotional": 15000.0, + "minNotional": 20000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "15000", - "notionalFloor": "7500", + "notionalCap": "200000", + "notionalFloor": "20000", "maintMarginRatio": "0.015", - "cum": "37.5" + "cum": "100.0" } }, { "tier": 3.0, "symbol": "HYPE/USDT:USDT", "currency": "USDT", - "minNotional": 15000.0, - "maxNotional": 75000.0, + "minNotional": 200000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "75000", - "notionalFloor": "15000", + "notionalCap": "1000000", + "notionalFloor": "200000", "maintMarginRatio": "0.02", - "cum": "112.5" + "cum": "1100.0" } }, { "tier": 4.0, "symbol": "HYPE/USDT:USDT", "currency": "USDT", - "minNotional": 75000.0, - "maxNotional": 200000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "200000", - "notionalFloor": "75000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.025", - "cum": "487.5" + "cum": "6100.0" } }, { "tier": 5.0, "symbol": "HYPE/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 350000.0, - "maintenanceMarginRate": 0.0333, - "maxLeverage": 15.0, + "minNotional": 2000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "5", - "initialLeverage": "15", - "notionalCap": "350000", - "notionalFloor": "200000", - "maintMarginRatio": "0.0333", - "cum": "2147.5" + "initialLeverage": "10", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.05", + "cum": "56100.0" } }, { "tier": 6.0, "symbol": "HYPE/USDT:USDT", "currency": "USDT", - "minNotional": 350000.0, - "maxNotional": 750000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 5000000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "6", - "initialLeverage": "10", - "notionalCap": "750000", - "notionalFloor": "350000", - "maintMarginRatio": "0.05", - "cum": "7992.5" + "initialLeverage": "5", + "notionalCap": "7500000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.1", + "cum": "306100.0" } }, { "tier": 7.0, "symbol": "HYPE/USDT:USDT", "currency": "USDT", - "minNotional": 750000.0, - "maxNotional": 3000000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 7500000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "7", - "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "750000", - "maintMarginRatio": "0.1", - "cum": "45492.5" + "initialLeverage": "4", + "notionalCap": "10000000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.125", + "cum": "493600.0" } }, { "tier": 8.0, "symbol": "HYPE/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 10000000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "8", - "initialLeverage": "4", - "notionalCap": "4500000", - "notionalFloor": "3000000", - "maintMarginRatio": "0.125", - "cum": "120492.5" + "initialLeverage": "2", + "notionalCap": "12500000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1743600.0" } }, { "tier": 9.0, "symbol": "HYPE/USDT:USDT", "currency": "USDT", - "minNotional": 4500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "9", - "initialLeverage": "3", - "notionalCap": "7500000", - "notionalFloor": "4500000", - "maintMarginRatio": "0.1667", - "cum": "308142.5" - } - }, - { - "tier": 10.0, - "symbol": "HYPE/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "10", - "initialLeverage": "2", - "notionalCap": "12000000", - "notionalFloor": "7500000", - "maintMarginRatio": "0.25", - "cum": "932892.5" - } - }, - { - "tier": 11.0, - "symbol": "HYPE/USDT:USDT", - "currency": "USDT", - "minNotional": 12000000.0, - "maxNotional": 18000000.0, + "minNotional": 12500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "11", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "18000000", - "notionalFloor": "12000000", + "notionalCap": "15000000", + "notionalFloor": "12500000", "maintMarginRatio": "0.5", - "cum": "3932892.5" + "cum": "4868600.0" } } ], @@ -38843,15 +40737,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -38859,71 +40753,54 @@ "symbol": "ICNT/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "ICNT/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "ICNT/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "ICNT/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "ICNT/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -38931,16 +40808,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "ICNT/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -38948,16 +40825,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "ICNT/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -38965,12 +40842,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -40083,15 +41960,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -40099,71 +41976,54 @@ "symbol": "IN/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "IN/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "IN/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "IN/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "IN/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -40171,16 +42031,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "IN/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -40188,16 +42048,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "IN/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -40205,12 +42065,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -41373,13 +43233,13 @@ "symbol": "IP/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "5000", + "notionalCap": "20000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -41389,170 +43249,136 @@ "tier": 2.0, "symbol": "IP/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, + "minNotional": 20000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "10000", - "notionalFloor": "5000", + "notionalCap": "200000", + "notionalFloor": "20000", "maintMarginRatio": "0.015", - "cum": "25.0" + "cum": "100.0" } }, { "tier": 3.0, "symbol": "IP/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 50000.0, + "minNotional": 200000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "50000", - "notionalFloor": "10000", + "notionalCap": "1000000", + "notionalFloor": "200000", "maintMarginRatio": "0.02", - "cum": "75.0" + "cum": "1100.0" } }, { "tier": 4.0, "symbol": "IP/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "100000", - "notionalFloor": "50000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.025", - "cum": "325.0" + "cum": "6100.0" } }, { "tier": 5.0, "symbol": "IP/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 175000.0, - "maintenanceMarginRate": 0.0333, - "maxLeverage": 15.0, + "minNotional": 2000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "5", - "initialLeverage": "15", - "notionalCap": "175000", - "notionalFloor": "100000", - "maintMarginRatio": "0.0333", - "cum": "1155.0" + "initialLeverage": "10", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.05", + "cum": "56100.0" } }, { "tier": 6.0, "symbol": "IP/USDT:USDT", "currency": "USDT", - "minNotional": 175000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 5000000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "6", - "initialLeverage": "10", - "notionalCap": "250000", - "notionalFloor": "175000", - "maintMarginRatio": "0.05", - "cum": "4077.5" + "initialLeverage": "5", + "notionalCap": "7500000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.1", + "cum": "306100.0" } }, { "tier": 7.0, "symbol": "IP/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 750000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 7500000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "7", - "initialLeverage": "5", - "notionalCap": "750000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1", - "cum": "16577.5" + "initialLeverage": "4", + "notionalCap": "10000000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.125", + "cum": "493600.0" } }, { "tier": 8.0, "symbol": "IP/USDT:USDT", "currency": "USDT", - "minNotional": 750000.0, - "maxNotional": 1500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 10000000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "8", - "initialLeverage": "4", - "notionalCap": "1500000", - "notionalFloor": "750000", - "maintMarginRatio": "0.125", - "cum": "35327.5" + "initialLeverage": "2", + "notionalCap": "12500000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1743600.0" } }, { "tier": 9.0, "symbol": "IP/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "9", - "initialLeverage": "3", - "notionalCap": "4500000", - "notionalFloor": "1500000", - "maintMarginRatio": "0.1667", - "cum": "97877.5" - } - }, - { - "tier": 10.0, - "symbol": "IP/USDT:USDT", - "currency": "USDT", - "minNotional": 4500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "10", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "4500000", - "maintMarginRatio": "0.25", - "cum": "472727.5" - } - }, - { - "tier": 11.0, - "symbol": "IP/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 12500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "11", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "15000000", + "notionalFloor": "12500000", "maintMarginRatio": "0.5", - "cum": "2347727.5" + "cum": "4868600.0" } } ], @@ -41718,14 +43544,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "50", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.015", "cum": "0.0" } }, @@ -41743,7 +43569,7 @@ "notionalCap": "10000", "notionalFloor": "5000", "maintMarginRatio": "0.025", - "cum": "25.0" + "cum": "50.0" } }, { @@ -41751,23 +43577,23 @@ "symbol": "JELLYJELLY/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "3", "initialLeverage": "10", - "notionalCap": "25000", + "notionalCap": "20000", "notionalFloor": "10000", "maintMarginRatio": "0.05", - "cum": "275.0" + "cum": "300.0" } }, { "tier": 4.0, "symbol": "JELLYJELLY/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, + "minNotional": 20000.0, "maxNotional": 50000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, @@ -41775,9 +43601,9 @@ "bracket": "4", "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "25000", + "notionalFloor": "20000", "maintMarginRatio": "0.1", - "cum": "1525.0" + "cum": "1300.0" } }, { @@ -41785,67 +43611,67 @@ "symbol": "JELLYJELLY/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 100000.0, + "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "5", "initialLeverage": "4", - "notionalCap": "100000", + "notionalCap": "250000", "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "2775.0" + "cum": "2550.0" } }, { "tier": 6.0, "symbol": "JELLYJELLY/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 250000.0, + "minNotional": 250000.0, + "maxNotional": 4500000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { "bracket": "6", "initialLeverage": "3", - "notionalCap": "250000", - "notionalFloor": "100000", + "notionalCap": "4500000", + "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "6945.0" + "cum": "12975.0" } }, { "tier": 7.0, "symbol": "JELLYJELLY/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, + "minNotional": 4500000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "7", "initialLeverage": "2", - "notionalCap": "500000", - "notionalFloor": "250000", + "notionalCap": "7500000", + "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "27770.0" + "cum": "387825.0" } }, { "tier": 8.0, "symbol": "JELLYJELLY/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 800000.0, + "minNotional": 7500000.0, + "maxNotional": 12500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "8", "initialLeverage": "1", - "notionalCap": "800000", - "notionalFloor": "500000", + "notionalCap": "12500000", + "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "152770.0" + "cum": "2262825.0" } } ], @@ -42904,13 +44730,13 @@ "symbol": "KAITO/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "25000", + "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -42920,51 +44746,51 @@ "tier": 4.0, "symbol": "KAITO/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "25000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "200.0" + "cum": "325.0" } }, { "tier": 5.0, "symbol": "KAITO/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 100000.0, + "maxNotional": 175000.0, + "maintenanceMarginRate": 0.0333, + "maxLeverage": 15.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "125000", - "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1450.0" + "initialLeverage": "15", + "notionalCap": "175000", + "notionalFloor": "100000", + "maintMarginRatio": "0.0333", + "cum": "1155.0" } }, { "tier": 6.0, "symbol": "KAITO/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 175000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "10", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.1", - "cum": "7700.0" + "notionalFloor": "175000", + "maintMarginRatio": "0.05", + "cum": "4077.5" } }, { @@ -42972,54 +44798,71 @@ "symbol": "KAITO/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "500000", + "initialLeverage": "5", + "notionalCap": "750000", "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "13950.0" + "maintMarginRatio": "0.1", + "cum": "16577.5" } }, { "tier": 8.0, "symbol": "KAITO/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "8", - "initialLeverage": "3", - "notionalCap": "4500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.1667", - "cum": "34800.0" + "initialLeverage": "4", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.125", + "cum": "35327.5" } }, { "tier": 9.0, "symbol": "KAITO/USDT:USDT", "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "9", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.1667", + "cum": "97877.5" + } + }, + { + "tier": 10.0, + "symbol": "KAITO/USDT:USDT", + "currency": "USDT", "minNotional": 4500000.0, "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "409650.0" + "cum": "472727.5" } }, { - "tier": 10.0, + "tier": 11.0, "symbol": "KAITO/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -43027,12 +44870,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "11", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2284650.0" + "cum": "2347727.5" } } ], @@ -45276,6 +47119,195 @@ } } ], + "LINEA/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "LINEA/USDT:USDT", + "currency": "USDT", + "minNotional": 0.0, + "maxNotional": 7500.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "7500", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "LINEA/USDT:USDT", + "currency": "USDT", + "minNotional": 7500.0, + "maxNotional": 15000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "15000", + "notionalFloor": "7500", + "maintMarginRatio": "0.015", + "cum": "37.5" + } + }, + { + "tier": 3.0, + "symbol": "LINEA/USDT:USDT", + "currency": "USDT", + "minNotional": 15000.0, + "maxNotional": 75000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "75000", + "notionalFloor": "15000", + "maintMarginRatio": "0.02", + "cum": "112.5" + } + }, + { + "tier": 4.0, + "symbol": "LINEA/USDT:USDT", + "currency": "USDT", + "minNotional": 75000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "200000", + "notionalFloor": "75000", + "maintMarginRatio": "0.025", + "cum": "487.5" + } + }, + { + "tier": 5.0, + "symbol": "LINEA/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 350000.0, + "maintenanceMarginRate": 0.0333, + "maxLeverage": 15.0, + "info": { + "bracket": "5", + "initialLeverage": "15", + "notionalCap": "350000", + "notionalFloor": "200000", + "maintMarginRatio": "0.0333", + "cum": "2147.5" + } + }, + { + "tier": 6.0, + "symbol": "LINEA/USDT:USDT", + "currency": "USDT", + "minNotional": 350000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "6", + "initialLeverage": "10", + "notionalCap": "750000", + "notionalFloor": "350000", + "maintMarginRatio": "0.05", + "cum": "7992.5" + } + }, + { + "tier": 7.0, + "symbol": "LINEA/USDT:USDT", + "currency": "USDT", + "minNotional": 750000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "7", + "initialLeverage": "5", + "notionalCap": "3000000", + "notionalFloor": "750000", + "maintMarginRatio": "0.1", + "cum": "45492.5" + } + }, + { + "tier": 8.0, + "symbol": "LINEA/USDT:USDT", + "currency": "USDT", + "minNotional": 3000000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "8", + "initialLeverage": "4", + "notionalCap": "4500000", + "notionalFloor": "3000000", + "maintMarginRatio": "0.125", + "cum": "120492.5" + } + }, + { + "tier": 9.0, + "symbol": "LINEA/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "9", + "initialLeverage": "3", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.1667", + "cum": "308142.5" + } + }, + { + "tier": 10.0, + "symbol": "LINEA/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "10", + "initialLeverage": "2", + "notionalCap": "12000000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.25", + "cum": "932892.5" + } + }, + { + "tier": 11.0, + "symbol": "LINEA/USDT:USDT", + "currency": "USDT", + "minNotional": 12000000.0, + "maxNotional": 18000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "11", + "initialLeverage": "1", + "notionalCap": "18000000", + "notionalFloor": "12000000", + "maintMarginRatio": "0.5", + "cum": "3932892.5" + } + } + ], "LINK/USDC:USDC": [ { "tier": 1.0, @@ -46661,15 +48693,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -46677,71 +48709,54 @@ "symbol": "LSK/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "LSK/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "LSK/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "LSK/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "LSK/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -46749,16 +48764,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "LSK/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -46766,16 +48781,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "LSK/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -46783,12 +48798,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -49417,14 +51432,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" } }, @@ -49434,14 +51449,14 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "50", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.015", "cum": "25.0" } }, @@ -49451,14 +51466,14 @@ "currency": "USDT", "minNotional": 10000.0, "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "20", + "initialLeverage": "25", "notionalCap": "25000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.02", "cum": "75.0" } }, @@ -49467,33 +51482,33 @@ "symbol": "MERL/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", + "initialLeverage": "20", + "notionalCap": "50000", "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "maintMarginRatio": "0.025", + "cum": "200.0" } }, { "tier": 5.0, "symbol": "MERL/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, + "minNotional": 50000.0, "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "5", - "initialLeverage": "5", + "initialLeverage": "10", "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1450.0" } }, { @@ -49502,15 +51517,15 @@ "currency": "USDT", "minNotional": 125000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "6", - "initialLeverage": "4", + "initialLeverage": "5", "notionalCap": "250000", "notionalFloor": "125000", - "maintMarginRatio": "0.125", - "cum": "6950.0" + "maintMarginRatio": "0.1", + "cum": "7700.0" } }, { @@ -49518,37 +51533,54 @@ "symbol": "MERL/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "7", - "initialLeverage": "3", - "notionalCap": "4500000", + "initialLeverage": "4", + "notionalCap": "500000", "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "17375.0" + "maintMarginRatio": "0.125", + "cum": "13950.0" } }, { "tier": 8.0, "symbol": "MERL/USDT:USDT", "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34800.0" + } + }, + { + "tier": 9.0, + "symbol": "MERL/USDT:USDT", + "currency": "USDT", "minNotional": 4500000.0, "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "409650.0" } }, { - "tier": 9.0, + "tier": 10.0, "symbol": "MERL/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -49556,12 +51588,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2284650.0" } } ], @@ -50185,6 +52217,161 @@ } } ], + "MITO/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "MITO/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": "MITO/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": "MITO/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "MITO/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 62500.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "62500", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 5.0, + "symbol": "MITO/USDT:USDT", + "currency": "USDT", + "minNotional": 62500.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "125000", + "notionalFloor": "62500", + "maintMarginRatio": "0.1", + "cum": "3825.0" + } + }, + { + "tier": 6.0, + "symbol": "MITO/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.125", + "cum": "6950.0" + } + }, + { + "tier": 7.0, + "symbol": "MITO/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1667", + "cum": "17375.0" + } + }, + { + "tier": 8.0, + "symbol": "MITO/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "392225.0" + } + }, + { + "tier": 9.0, + "symbol": "MITO/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "2267225.0" + } + } + ], "MKR/USDT:USDT": [ { "tier": 1.0, @@ -50707,13 +52894,13 @@ "symbol": "MOODENG/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "25000", + "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -50723,51 +52910,51 @@ "tier": 4.0, "symbol": "MOODENG/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "25000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "200.0" + "cum": "325.0" } }, { "tier": 5.0, "symbol": "MOODENG/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 100000.0, + "maxNotional": 175000.0, + "maintenanceMarginRate": 0.0333, + "maxLeverage": 15.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "125000", - "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1450.0" + "initialLeverage": "15", + "notionalCap": "175000", + "notionalFloor": "100000", + "maintMarginRatio": "0.0333", + "cum": "1155.0" } }, { "tier": 6.0, "symbol": "MOODENG/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 175000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "10", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.1", - "cum": "7700.0" + "notionalFloor": "175000", + "maintMarginRatio": "0.05", + "cum": "4077.5" } }, { @@ -50775,54 +52962,71 @@ "symbol": "MOODENG/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "500000", + "initialLeverage": "5", + "notionalCap": "750000", "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "13950.0" + "maintMarginRatio": "0.1", + "cum": "16577.5" } }, { "tier": 8.0, "symbol": "MOODENG/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "8", - "initialLeverage": "3", - "notionalCap": "4500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.1667", - "cum": "34800.0" + "initialLeverage": "4", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.125", + "cum": "35327.5" } }, { "tier": 9.0, "symbol": "MOODENG/USDT:USDT", "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "9", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.1667", + "cum": "97877.5" + } + }, + { + "tier": 10.0, + "symbol": "MOODENG/USDT:USDT", + "currency": "USDT", "minNotional": 4500000.0, "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "409650.0" + "cum": "472727.5" } }, { - "tier": 10.0, + "tier": 11.0, "symbol": "MOODENG/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -50830,12 +53034,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "11", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2284650.0" + "cum": "2347727.5" } } ], @@ -51362,15 +53566,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -51378,71 +53582,54 @@ "symbol": "MTL/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "MTL/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "MTL/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "MTL/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "MTL/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -51450,16 +53637,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "MTL/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -51467,16 +53654,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "MTL/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -51484,12 +53671,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -51516,105 +53703,88 @@ "symbol": "MUBARAK/USDT:USDT", "currency": "USDT", "minNotional": 5000.0, - "maxNotional": 6000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "6000", + "initialLeverage": "20", + "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { "tier": 3.0, "symbol": "MUBARAK/USDT:USDT", "currency": "USDT", - "minNotional": 6000.0, - "maxNotional": 14000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 10000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "14000", - "notionalFloor": "6000", - "maintMarginRatio": "0.025", - "cum": "55.0" + "initialLeverage": "10", + "notionalCap": "20000", + "notionalFloor": "10000", + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "MUBARAK/USDT:USDT", "currency": "USDT", - "minNotional": 14000.0, - "maxNotional": 35000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "35000", - "notionalFloor": "14000", - "maintMarginRatio": "0.05", - "cum": "405.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "MUBARAK/USDT:USDT", "currency": "USDT", - "minNotional": 35000.0, - "maxNotional": 82000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 50000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "5", - "notionalCap": "82000", - "notionalFloor": "35000", - "maintMarginRatio": "0.1", - "cum": "2155.0" + "initialLeverage": "4", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "2550.0" } }, { "tier": 6.0, "symbol": "MUBARAK/USDT:USDT", "currency": "USDT", - "minNotional": 82000.0, - "maxNotional": 290000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "6", - "initialLeverage": "4", - "notionalCap": "290000", - "notionalFloor": "82000", - "maintMarginRatio": "0.125", - "cum": "4205.0" - } - }, - { - "tier": 7.0, - "symbol": "MUBARAK/USDT:USDT", - "currency": "USDT", - "minNotional": 290000.0, + "minNotional": 250000.0, "maxNotional": 4500000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", - "notionalFloor": "290000", + "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "16298.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "MUBARAK/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -51622,16 +53792,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "391148.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "MUBARAK/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -51639,12 +53809,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2266148.0" + "cum": "2262825.0" } } ], @@ -51792,15 +53962,15 @@ "symbol": "MYX/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "10", + "notionalCap": "10000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -51808,136 +53978,85 @@ "tier": 2.0, "symbol": "MYX/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 10000.0, + "maxNotional": 60000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "initialLeverage": "5", + "notionalCap": "60000", + "notionalFloor": "10000", + "maintMarginRatio": "0.1", + "cum": "500.0" } }, { "tier": 3.0, "symbol": "MYX/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 60000.0, + "maxNotional": 70000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "initialLeverage": "4", + "notionalCap": "70000", + "notionalFloor": "60000", + "maintMarginRatio": "0.125", + "cum": "2000.0" } }, { "tier": 4.0, "symbol": "MYX/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 70000.0, + "maxNotional": 700000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "3", + "notionalCap": "700000", + "notionalFloor": "70000", + "maintMarginRatio": "0.1667", + "cum": "4919.0" } }, { "tier": 5.0, "symbol": "MYX/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 700000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" + "initialLeverage": "2", + "notionalCap": "5000000", + "notionalFloor": "700000", + "maintMarginRatio": "0.25", + "cum": "63229.0" } }, { "tier": 6.0, "symbol": "MYX/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "6", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.125", - "cum": "6950.0" - } - }, - { - "tier": 7.0, - "symbol": "MYX/USDT:USDT", - "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "7", - "initialLeverage": "3", - "notionalCap": "4500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "17375.0" - } - }, - { - "tier": 8.0, - "symbol": "MYX/USDT:USDT", - "currency": "USDT", - "minNotional": 4500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "8", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "4500000", - "maintMarginRatio": "0.25", - "cum": "392225.0" - } - }, - { - "tier": 9.0, - "symbol": "MYX/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 5000000.0, + "maxNotional": 9500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "9500000", + "notionalFloor": "5000000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "1313229.0" } } ], @@ -52567,15 +54686,15 @@ "symbol": "NEIROETH/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "5", + "notionalCap": "50000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.1", "cum": "0.0" } }, @@ -52583,136 +54702,68 @@ "tier": 2.0, "symbol": "NEIROETH/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "initialLeverage": "4", + "notionalCap": "100000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "1250.0" } }, { "tier": 3.0, "symbol": "NEIROETH/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 100000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "initialLeverage": "3", + "notionalCap": "250000", + "notionalFloor": "100000", + "maintMarginRatio": "0.1667", + "cum": "5420.0" } }, { "tier": 4.0, "symbol": "NEIROETH/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 250000.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "2", + "notionalCap": "500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.25", + "cum": "26245.0" } }, { "tier": 5.0, "symbol": "NEIROETH/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "NEIROETH/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "6", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.125", - "cum": "6950.0" - } - }, - { - "tier": 7.0, - "symbol": "NEIROETH/USDT:USDT", - "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "7", - "initialLeverage": "3", - "notionalCap": "4500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "17375.0" - } - }, - { - "tier": 8.0, - "symbol": "NEIROETH/USDT:USDT", - "currency": "USDT", - "minNotional": 4500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "8", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "4500000", - "maintMarginRatio": "0.25", - "cum": "392225.0" - } - }, - { - "tier": 9.0, - "symbol": "NEIROETH/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 500000.0, + "maxNotional": 800000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "5", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "800000", + "notionalFloor": "500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "151245.0" } } ], @@ -53703,13 +55754,13 @@ "symbol": "NMR/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "25000", + "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -53719,51 +55770,51 @@ "tier": 4.0, "symbol": "NMR/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "25000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "200.0" + "cum": "325.0" } }, { "tier": 5.0, "symbol": "NMR/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 100000.0, + "maxNotional": 175000.0, + "maintenanceMarginRate": 0.0333, + "maxLeverage": 15.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "125000", - "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1450.0" + "initialLeverage": "15", + "notionalCap": "175000", + "notionalFloor": "100000", + "maintMarginRatio": "0.0333", + "cum": "1155.0" } }, { "tier": 6.0, "symbol": "NMR/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 175000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "10", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.1", - "cum": "7700.0" + "notionalFloor": "175000", + "maintMarginRatio": "0.05", + "cum": "4077.5" } }, { @@ -53771,54 +55822,71 @@ "symbol": "NMR/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "500000", + "initialLeverage": "5", + "notionalCap": "750000", "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "13950.0" + "maintMarginRatio": "0.1", + "cum": "16577.5" } }, { "tier": 8.0, "symbol": "NMR/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "8", - "initialLeverage": "3", - "notionalCap": "4500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.1667", - "cum": "34800.0" + "initialLeverage": "4", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.125", + "cum": "35327.5" } }, { "tier": 9.0, "symbol": "NMR/USDT:USDT", "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "9", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.1667", + "cum": "97877.5" + } + }, + { + "tier": 10.0, + "symbol": "NMR/USDT:USDT", + "currency": "USDT", "minNotional": 4500000.0, "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "409650.0" + "cum": "472727.5" } }, { - "tier": 10.0, + "tier": 11.0, "symbol": "NMR/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -53826,12 +55894,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "11", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2284650.0" + "cum": "2347727.5" } } ], @@ -55633,13 +57701,13 @@ "symbol": "ONDO/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, + "maxNotional": 7500.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "5000", + "notionalCap": "7500", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -55649,170 +57717,170 @@ "tier": 2.0, "symbol": "ONDO/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, + "minNotional": 7500.0, + "maxNotional": 15000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "10000", - "notionalFloor": "5000", + "notionalCap": "15000", + "notionalFloor": "7500", "maintMarginRatio": "0.015", - "cum": "25.0" + "cum": "37.5" } }, { "tier": 3.0, "symbol": "ONDO/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 50000.0, + "minNotional": 15000.0, + "maxNotional": 75000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "50000", - "notionalFloor": "10000", + "notionalCap": "75000", + "notionalFloor": "15000", "maintMarginRatio": "0.02", - "cum": "75.0" + "cum": "112.5" } }, { "tier": 4.0, "symbol": "ONDO/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, + "minNotional": 75000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "100000", - "notionalFloor": "50000", + "notionalCap": "200000", + "notionalFloor": "75000", "maintMarginRatio": "0.025", - "cum": "325.0" + "cum": "487.5" } }, { "tier": 5.0, "symbol": "ONDO/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 175000.0, + "minNotional": 200000.0, + "maxNotional": 350000.0, "maintenanceMarginRate": 0.0333, "maxLeverage": 15.0, "info": { "bracket": "5", "initialLeverage": "15", - "notionalCap": "175000", - "notionalFloor": "100000", + "notionalCap": "350000", + "notionalFloor": "200000", "maintMarginRatio": "0.0333", - "cum": "1155.0" + "cum": "2147.5" } }, { "tier": 6.0, "symbol": "ONDO/USDT:USDT", "currency": "USDT", - "minNotional": 175000.0, - "maxNotional": 250000.0, + "minNotional": 350000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "6", "initialLeverage": "10", - "notionalCap": "250000", - "notionalFloor": "175000", + "notionalCap": "750000", + "notionalFloor": "350000", "maintMarginRatio": "0.05", - "cum": "4077.5" + "cum": "7992.5" } }, { "tier": 7.0, "symbol": "ONDO/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 750000.0, + "minNotional": 750000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "7", "initialLeverage": "5", - "notionalCap": "750000", - "notionalFloor": "250000", + "notionalCap": "3000000", + "notionalFloor": "750000", "maintMarginRatio": "0.1", - "cum": "16577.5" + "cum": "45492.5" } }, { "tier": 8.0, "symbol": "ONDO/USDT:USDT", "currency": "USDT", - "minNotional": 750000.0, - "maxNotional": 1500000.0, + "minNotional": 3000000.0, + "maxNotional": 4500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "8", "initialLeverage": "4", - "notionalCap": "1500000", - "notionalFloor": "750000", + "notionalCap": "4500000", + "notionalFloor": "3000000", "maintMarginRatio": "0.125", - "cum": "35327.5" + "cum": "120492.5" } }, { "tier": 9.0, "symbol": "ONDO/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 4500000.0, + "minNotional": 4500000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { "bracket": "9", "initialLeverage": "3", - "notionalCap": "4500000", - "notionalFloor": "1500000", + "notionalCap": "7500000", + "notionalFloor": "4500000", "maintMarginRatio": "0.1667", - "cum": "97877.5" + "cum": "308142.5" } }, { "tier": 10.0, "symbol": "ONDO/USDT:USDT", "currency": "USDT", - "minNotional": 4500000.0, - "maxNotional": 7500000.0, + "minNotional": 7500000.0, + "maxNotional": 12000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "10", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "4500000", + "notionalCap": "12000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.25", - "cum": "472727.5" + "cum": "932892.5" } }, { "tier": 11.0, "symbol": "ONDO/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12000000.0, + "minNotional": 12000000.0, + "maxNotional": 18000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "11", "initialLeverage": "1", - "notionalCap": "12000000", - "notionalFloor": "7500000", + "notionalCap": "18000000", + "notionalFloor": "12000000", "maintMarginRatio": "0.5", - "cum": "2347727.5" + "cum": "3932892.5" } } ], @@ -56470,6 +58538,178 @@ } } ], + "OPEN/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "OPEN/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": "OPEN/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": "OPEN/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": "OPEN/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": "OPEN/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": "OPEN/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": "OPEN/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": "OPEN/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34800.0" + } + }, + { + "tier": 9.0, + "symbol": "OPEN/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "409650.0" + } + }, + { + "tier": 10.0, + "symbol": "OPEN/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "2284650.0" + } + } + ], "ORBS/USDT:USDT": [ { "tier": 1.0, @@ -57148,15 +59388,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -57164,71 +59404,54 @@ "symbol": "OXT/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "OXT/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "OXT/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "OXT/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "OXT/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -57236,16 +59459,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "OXT/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -57253,16 +59476,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "OXT/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -57270,12 +59493,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -57285,15 +59508,15 @@ "symbol": "PARTI/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 1000.0, - "maintenanceMarginRate": 0.01, - "maxLeverage": 75.0, + "maxNotional": 5000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "1", - "initialLeverage": "75", - "notionalCap": "1000", + "initialLeverage": "50", + "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.01", + "maintMarginRatio": "0.015", "cum": "0.0" } }, @@ -57301,123 +59524,89 @@ "tier": 2.0, "symbol": "PARTI/USDT:USDT", "currency": "USDT", - "minNotional": 1000.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "minNotional": 5000.0, + "maxNotional": 10000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", - "notionalCap": "5000", - "notionalFloor": "1000", - "maintMarginRatio": "0.015", - "cum": "5.0" + "initialLeverage": "20", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { "tier": 3.0, "symbol": "PARTI/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 9000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 10000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "9000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "30.0" + "initialLeverage": "10", + "notionalCap": "20000", + "notionalFloor": "10000", + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "PARTI/USDT:USDT", "currency": "USDT", - "minNotional": 9000.0, - "maxNotional": 26000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "20", - "notionalCap": "26000", - "notionalFloor": "9000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "PARTI/USDT:USDT", "currency": "USDT", - "minNotional": 26000.0, - "maxNotional": 65000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 50000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "65000", - "notionalFloor": "26000", - "maintMarginRatio": "0.05", - "cum": "725.0" + "initialLeverage": "4", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "2550.0" } }, { "tier": 6.0, "symbol": "PARTI/USDT:USDT", "currency": "USDT", - "minNotional": 65000.0, - "maxNotional": 138000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "6", - "initialLeverage": "5", - "notionalCap": "138000", - "notionalFloor": "65000", - "maintMarginRatio": "0.1", - "cum": "3975.0" - } - }, - { - "tier": 7.0, - "symbol": "PARTI/USDT:USDT", - "currency": "USDT", - "minNotional": 138000.0, - "maxNotional": 360000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "7", - "initialLeverage": "4", - "notionalCap": "360000", - "notionalFloor": "138000", - "maintMarginRatio": "0.125", - "cum": "7425.0" - } - }, - { - "tier": 8.0, - "symbol": "PARTI/USDT:USDT", - "currency": "USDT", - "minNotional": 360000.0, + "minNotional": 250000.0, "maxNotional": 4500000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", - "notionalFloor": "360000", + "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "22437.0" + "cum": "12975.0" } }, { - "tier": 9.0, + "tier": 7.0, "symbol": "PARTI/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -57425,16 +59614,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "397287.0" + "cum": "387825.0" } }, { - "tier": 10.0, + "tier": 8.0, "symbol": "PARTI/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -57442,12 +59631,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2272287.0" + "cum": "2262825.0" } } ], @@ -57457,13 +59646,13 @@ "symbol": "PAXG/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 7500.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "7500", + "notionalCap": "20000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -57473,170 +59662,136 @@ "tier": 2.0, "symbol": "PAXG/USDT:USDT", "currency": "USDT", - "minNotional": 7500.0, - "maxNotional": 15000.0, + "minNotional": 20000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "15000", - "notionalFloor": "7500", + "notionalCap": "200000", + "notionalFloor": "20000", "maintMarginRatio": "0.015", - "cum": "37.5" + "cum": "100.0" } }, { "tier": 3.0, "symbol": "PAXG/USDT:USDT", "currency": "USDT", - "minNotional": 15000.0, - "maxNotional": 75000.0, + "minNotional": 200000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "75000", - "notionalFloor": "15000", + "notionalCap": "1000000", + "notionalFloor": "200000", "maintMarginRatio": "0.02", - "cum": "112.5" + "cum": "1100.0" } }, { "tier": 4.0, "symbol": "PAXG/USDT:USDT", "currency": "USDT", - "minNotional": 75000.0, - "maxNotional": 200000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "200000", - "notionalFloor": "75000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.025", - "cum": "487.5" + "cum": "6100.0" } }, { "tier": 5.0, "symbol": "PAXG/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 350000.0, - "maintenanceMarginRate": 0.0333, - "maxLeverage": 15.0, + "minNotional": 2000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "5", - "initialLeverage": "15", - "notionalCap": "350000", - "notionalFloor": "200000", - "maintMarginRatio": "0.0333", - "cum": "2147.5" + "initialLeverage": "10", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.05", + "cum": "56100.0" } }, { "tier": 6.0, "symbol": "PAXG/USDT:USDT", "currency": "USDT", - "minNotional": 350000.0, - "maxNotional": 750000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 5000000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "6", - "initialLeverage": "10", - "notionalCap": "750000", - "notionalFloor": "350000", - "maintMarginRatio": "0.05", - "cum": "7992.5" + "initialLeverage": "5", + "notionalCap": "7500000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.1", + "cum": "306100.0" } }, { "tier": 7.0, "symbol": "PAXG/USDT:USDT", "currency": "USDT", - "minNotional": 750000.0, - "maxNotional": 3000000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 7500000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "7", - "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "750000", - "maintMarginRatio": "0.1", - "cum": "45492.5" + "initialLeverage": "4", + "notionalCap": "10000000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.125", + "cum": "493600.0" } }, { "tier": 8.0, "symbol": "PAXG/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 10000000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "8", - "initialLeverage": "4", - "notionalCap": "4500000", - "notionalFloor": "3000000", - "maintMarginRatio": "0.125", - "cum": "120492.5" + "initialLeverage": "2", + "notionalCap": "12500000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1743600.0" } }, { "tier": 9.0, "symbol": "PAXG/USDT:USDT", "currency": "USDT", - "minNotional": 4500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "9", - "initialLeverage": "3", - "notionalCap": "7500000", - "notionalFloor": "4500000", - "maintMarginRatio": "0.1667", - "cum": "308142.5" - } - }, - { - "tier": 10.0, - "symbol": "PAXG/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "10", - "initialLeverage": "2", - "notionalCap": "12000000", - "notionalFloor": "7500000", - "maintMarginRatio": "0.25", - "cum": "932892.5" - } - }, - { - "tier": 11.0, - "symbol": "PAXG/USDT:USDT", - "currency": "USDT", - "minNotional": 12000000.0, - "maxNotional": 18000000.0, + "minNotional": 12500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "11", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "18000000", - "notionalFloor": "12000000", + "notionalCap": "15000000", + "notionalFloor": "12500000", "maintMarginRatio": "0.5", - "cum": "3932892.5" + "cum": "4868600.0" } } ], @@ -58007,13 +60162,13 @@ "symbol": "PENGU/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 7500.0, + "maxNotional": 20000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "7500", + "notionalCap": "20000", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -58023,170 +60178,136 @@ "tier": 2.0, "symbol": "PENGU/USDT:USDT", "currency": "USDT", - "minNotional": 7500.0, - "maxNotional": 15000.0, + "minNotional": 20000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "15000", - "notionalFloor": "7500", + "notionalCap": "200000", + "notionalFloor": "20000", "maintMarginRatio": "0.015", - "cum": "37.5" + "cum": "100.0" } }, { "tier": 3.0, "symbol": "PENGU/USDT:USDT", "currency": "USDT", - "minNotional": 15000.0, - "maxNotional": 75000.0, + "minNotional": 200000.0, + "maxNotional": 1000000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "75000", - "notionalFloor": "15000", + "notionalCap": "1000000", + "notionalFloor": "200000", "maintMarginRatio": "0.02", - "cum": "112.5" + "cum": "1100.0" } }, { "tier": 4.0, "symbol": "PENGU/USDT:USDT", "currency": "USDT", - "minNotional": 75000.0, - "maxNotional": 200000.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "200000", - "notionalFloor": "75000", + "notionalCap": "2000000", + "notionalFloor": "1000000", "maintMarginRatio": "0.025", - "cum": "487.5" + "cum": "6100.0" } }, { "tier": 5.0, "symbol": "PENGU/USDT:USDT", "currency": "USDT", - "minNotional": 200000.0, - "maxNotional": 350000.0, - "maintenanceMarginRate": 0.0333, - "maxLeverage": 15.0, + "minNotional": 2000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "5", - "initialLeverage": "15", - "notionalCap": "350000", - "notionalFloor": "200000", - "maintMarginRatio": "0.0333", - "cum": "2147.5" + "initialLeverage": "10", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.05", + "cum": "56100.0" } }, { "tier": 6.0, "symbol": "PENGU/USDT:USDT", "currency": "USDT", - "minNotional": 350000.0, - "maxNotional": 750000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 5000000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "6", - "initialLeverage": "10", - "notionalCap": "750000", - "notionalFloor": "350000", - "maintMarginRatio": "0.05", - "cum": "7992.5" + "initialLeverage": "5", + "notionalCap": "7500000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.1", + "cum": "306100.0" } }, { "tier": 7.0, "symbol": "PENGU/USDT:USDT", "currency": "USDT", - "minNotional": 750000.0, - "maxNotional": 3000000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 7500000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "7", - "initialLeverage": "5", - "notionalCap": "3000000", - "notionalFloor": "750000", - "maintMarginRatio": "0.1", - "cum": "45492.5" + "initialLeverage": "4", + "notionalCap": "10000000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.125", + "cum": "493600.0" } }, { "tier": 8.0, "symbol": "PENGU/USDT:USDT", "currency": "USDT", - "minNotional": 3000000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 10000000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "8", - "initialLeverage": "4", - "notionalCap": "4500000", - "notionalFloor": "3000000", - "maintMarginRatio": "0.125", - "cum": "120492.5" + "initialLeverage": "2", + "notionalCap": "12500000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1743600.0" } }, { "tier": 9.0, "symbol": "PENGU/USDT:USDT", "currency": "USDT", - "minNotional": 4500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "9", - "initialLeverage": "3", - "notionalCap": "7500000", - "notionalFloor": "4500000", - "maintMarginRatio": "0.1667", - "cum": "308142.5" - } - }, - { - "tier": 10.0, - "symbol": "PENGU/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12000000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "10", - "initialLeverage": "2", - "notionalCap": "12000000", - "notionalFloor": "7500000", - "maintMarginRatio": "0.25", - "cum": "932892.5" - } - }, - { - "tier": 11.0, - "symbol": "PENGU/USDT:USDT", - "currency": "USDT", - "minNotional": 12000000.0, - "maxNotional": 18000000.0, + "minNotional": 12500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "11", + "bracket": "9", "initialLeverage": "1", - "notionalCap": "18000000", - "notionalFloor": "12000000", + "notionalCap": "15000000", + "notionalFloor": "12500000", "maintMarginRatio": "0.5", - "cum": "3932892.5" + "cum": "4868600.0" } } ], @@ -59110,15 +61231,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -59126,71 +61247,54 @@ "symbol": "PLAY/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "PLAY/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "PLAY/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "PLAY/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "PLAY/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -59198,16 +61302,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "PLAY/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -59215,16 +61319,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "PLAY/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -59232,12 +61336,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -59763,13 +61867,13 @@ "symbol": "POL/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, + "maxNotional": 7500.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "5000", + "notionalCap": "7500", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -59779,170 +61883,170 @@ "tier": 2.0, "symbol": "POL/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, + "minNotional": 7500.0, + "maxNotional": 15000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "10000", - "notionalFloor": "5000", + "notionalCap": "15000", + "notionalFloor": "7500", "maintMarginRatio": "0.015", - "cum": "25.0" + "cum": "37.5" } }, { "tier": 3.0, "symbol": "POL/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 50000.0, + "minNotional": 15000.0, + "maxNotional": 75000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "50000", - "notionalFloor": "10000", + "notionalCap": "75000", + "notionalFloor": "15000", "maintMarginRatio": "0.02", - "cum": "75.0" + "cum": "112.5" } }, { "tier": 4.0, "symbol": "POL/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, + "minNotional": 75000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "100000", - "notionalFloor": "50000", + "notionalCap": "200000", + "notionalFloor": "75000", "maintMarginRatio": "0.025", - "cum": "325.0" + "cum": "487.5" } }, { "tier": 5.0, "symbol": "POL/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 175000.0, + "minNotional": 200000.0, + "maxNotional": 350000.0, "maintenanceMarginRate": 0.0333, "maxLeverage": 15.0, "info": { "bracket": "5", "initialLeverage": "15", - "notionalCap": "175000", - "notionalFloor": "100000", + "notionalCap": "350000", + "notionalFloor": "200000", "maintMarginRatio": "0.0333", - "cum": "1155.0" + "cum": "2147.5" } }, { "tier": 6.0, "symbol": "POL/USDT:USDT", "currency": "USDT", - "minNotional": 175000.0, - "maxNotional": 250000.0, + "minNotional": 350000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "6", "initialLeverage": "10", - "notionalCap": "250000", - "notionalFloor": "175000", + "notionalCap": "750000", + "notionalFloor": "350000", "maintMarginRatio": "0.05", - "cum": "4077.5" + "cum": "7992.5" } }, { "tier": 7.0, "symbol": "POL/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 750000.0, + "minNotional": 750000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "7", "initialLeverage": "5", - "notionalCap": "750000", - "notionalFloor": "250000", + "notionalCap": "3000000", + "notionalFloor": "750000", "maintMarginRatio": "0.1", - "cum": "16577.5" + "cum": "45492.5" } }, { "tier": 8.0, "symbol": "POL/USDT:USDT", "currency": "USDT", - "minNotional": 750000.0, - "maxNotional": 1500000.0, + "minNotional": 3000000.0, + "maxNotional": 4500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "8", "initialLeverage": "4", - "notionalCap": "1500000", - "notionalFloor": "750000", + "notionalCap": "4500000", + "notionalFloor": "3000000", "maintMarginRatio": "0.125", - "cum": "35327.5" + "cum": "120492.5" } }, { "tier": 9.0, "symbol": "POL/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 4500000.0, + "minNotional": 4500000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { "bracket": "9", "initialLeverage": "3", - "notionalCap": "4500000", - "notionalFloor": "1500000", + "notionalCap": "7500000", + "notionalFloor": "4500000", "maintMarginRatio": "0.1667", - "cum": "97877.5" + "cum": "308142.5" } }, { "tier": 10.0, "symbol": "POL/USDT:USDT", "currency": "USDT", - "minNotional": 4500000.0, - "maxNotional": 7500000.0, + "minNotional": 7500000.0, + "maxNotional": 12000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "10", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "4500000", + "notionalCap": "12000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.25", - "cum": "472727.5" + "cum": "932892.5" } }, { "tier": 11.0, "symbol": "POL/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12000000.0, + "minNotional": 12000000.0, + "maxNotional": 18000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "11", "initialLeverage": "1", - "notionalCap": "12000000", - "notionalFloor": "7500000", + "notionalCap": "18000000", + "notionalFloor": "12000000", "maintMarginRatio": "0.5", - "cum": "2347727.5" + "cum": "3932892.5" } } ], @@ -60125,15 +62229,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -60141,71 +62245,54 @@ "symbol": "PONKE/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "PONKE/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "PONKE/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "PONKE/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "PONKE/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -60213,16 +62300,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "PONKE/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -60230,16 +62317,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "PONKE/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -60247,12 +62334,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -60728,15 +62815,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -60744,71 +62831,54 @@ "symbol": "POWR/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "POWR/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "POWR/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "POWR/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "POWR/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -60816,16 +62886,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "POWR/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -60833,16 +62903,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "POWR/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -60850,12 +62920,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -61375,6 +63445,161 @@ } } ], + "PTB/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "PTB/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": "PTB/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": "PTB/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "PTB/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 62500.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "62500", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 5.0, + "symbol": "PTB/USDT:USDT", + "currency": "USDT", + "minNotional": 62500.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "125000", + "notionalFloor": "62500", + "maintMarginRatio": "0.1", + "cum": "3825.0" + } + }, + { + "tier": 6.0, + "symbol": "PTB/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.125", + "cum": "6950.0" + } + }, + { + "tier": 7.0, + "symbol": "PTB/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1667", + "cum": "17375.0" + } + }, + { + "tier": 8.0, + "symbol": "PTB/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "392225.0" + } + }, + { + "tier": 9.0, + "symbol": "PTB/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "2267225.0" + } + } + ], "PUFFER/USDT:USDT": [ { "tier": 1.0, @@ -61967,13 +64192,13 @@ "symbol": "PYTH/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, + "maxNotional": 7500.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "5000", + "notionalCap": "7500", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -61983,119 +64208,119 @@ "tier": 2.0, "symbol": "PYTH/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, + "minNotional": 7500.0, + "maxNotional": 15000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "10000", - "notionalFloor": "5000", + "notionalCap": "15000", + "notionalFloor": "7500", "maintMarginRatio": "0.015", - "cum": "25.0" + "cum": "37.5" } }, { "tier": 3.0, "symbol": "PYTH/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 25000.0, + "minNotional": 15000.0, + "maxNotional": 75000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "25000", - "notionalFloor": "10000", + "notionalCap": "75000", + "notionalFloor": "15000", "maintMarginRatio": "0.02", - "cum": "75.0" + "cum": "112.5" } }, { "tier": 4.0, "symbol": "PYTH/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, + "minNotional": 75000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "25000", + "notionalCap": "200000", + "notionalFloor": "75000", "maintMarginRatio": "0.025", - "cum": "200.0" + "cum": "487.5" } }, { "tier": 5.0, "symbol": "PYTH/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 200000.0, + "maxNotional": 350000.0, + "maintenanceMarginRate": 0.0333, + "maxLeverage": 15.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "125000", - "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1450.0" + "initialLeverage": "15", + "notionalCap": "350000", + "notionalFloor": "200000", + "maintMarginRatio": "0.0333", + "cum": "2147.5" } }, { "tier": 6.0, "symbol": "PYTH/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 350000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "6", - "initialLeverage": "5", - "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.1", - "cum": "7700.0" + "initialLeverage": "10", + "notionalCap": "750000", + "notionalFloor": "350000", + "maintMarginRatio": "0.05", + "cum": "7992.5" } }, { "tier": 7.0, "symbol": "PYTH/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 750000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "13950.0" + "initialLeverage": "5", + "notionalCap": "3000000", + "notionalFloor": "750000", + "maintMarginRatio": "0.1", + "cum": "45492.5" } }, { "tier": 8.0, "symbol": "PYTH/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, + "minNotional": 3000000.0, "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "8", - "initialLeverage": "3", + "initialLeverage": "4", "notionalCap": "4500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.1667", - "cum": "34800.0" + "notionalFloor": "3000000", + "maintMarginRatio": "0.125", + "cum": "120492.5" } }, { @@ -62104,15 +64329,15 @@ "currency": "USDT", "minNotional": 4500000.0, "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "9", - "initialLeverage": "2", + "initialLeverage": "3", "notionalCap": "7500000", "notionalFloor": "4500000", - "maintMarginRatio": "0.25", - "cum": "409650.0" + "maintMarginRatio": "0.1667", + "cum": "308142.5" } }, { @@ -62120,16 +64345,188 @@ "symbol": "PYTH/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, + "maxNotional": 12000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "10", + "initialLeverage": "2", + "notionalCap": "12000000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.25", + "cum": "932892.5" + } + }, + { + "tier": 11.0, + "symbol": "PYTH/USDT:USDT", + "currency": "USDT", + "minNotional": 12000000.0, + "maxNotional": 18000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "11", + "initialLeverage": "1", + "notionalCap": "18000000", + "notionalFloor": "12000000", + "maintMarginRatio": "0.5", + "cum": "3932892.5" + } + } + ], + "Q/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "Q/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": "Q/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": "Q/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "Q/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 62500.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "62500", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 5.0, + "symbol": "Q/USDT:USDT", + "currency": "USDT", + "minNotional": 62500.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "125000", + "notionalFloor": "62500", + "maintMarginRatio": "0.1", + "cum": "3825.0" + } + }, + { + "tier": 6.0, + "symbol": "Q/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.125", + "cum": "6950.0" + } + }, + { + "tier": 7.0, + "symbol": "Q/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1667", + "cum": "17375.0" + } + }, + { + "tier": 8.0, + "symbol": "Q/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "392225.0" + } + }, + { + "tier": 9.0, + "symbol": "Q/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, "maxNotional": 12500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "9", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2284650.0" + "cum": "2267225.0" } } ], @@ -63295,14 +65692,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" } }, @@ -63312,14 +65709,14 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "50", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.015", "cum": "25.0" } }, @@ -63329,14 +65726,14 @@ "currency": "USDT", "minNotional": 10000.0, "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "20", + "initialLeverage": "25", "notionalCap": "25000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.02", "cum": "75.0" } }, @@ -63345,33 +65742,33 @@ "symbol": "RED/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", + "initialLeverage": "20", + "notionalCap": "50000", "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "maintMarginRatio": "0.025", + "cum": "200.0" } }, { "tier": 5.0, "symbol": "RED/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, + "minNotional": 50000.0, "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "5", - "initialLeverage": "5", + "initialLeverage": "10", "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1450.0" } }, { @@ -63380,15 +65777,15 @@ "currency": "USDT", "minNotional": 125000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "6", - "initialLeverage": "4", + "initialLeverage": "5", "notionalCap": "250000", "notionalFloor": "125000", - "maintMarginRatio": "0.125", - "cum": "6950.0" + "maintMarginRatio": "0.1", + "cum": "7700.0" } }, { @@ -63396,37 +65793,54 @@ "symbol": "RED/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "7", - "initialLeverage": "3", - "notionalCap": "4500000", + "initialLeverage": "4", + "notionalCap": "500000", "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "17375.0" + "maintMarginRatio": "0.125", + "cum": "13950.0" } }, { "tier": 8.0, "symbol": "RED/USDT:USDT", "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34800.0" + } + }, + { + "tier": 9.0, + "symbol": "RED/USDT:USDT", + "currency": "USDT", "minNotional": 4500000.0, "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "409650.0" } }, { - "tier": 9.0, + "tier": 10.0, "symbol": "RED/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -63434,12 +65848,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2284650.0" } } ], @@ -64312,15 +66726,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -64328,71 +66742,54 @@ "symbol": "RIF/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "RIF/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "RIF/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "RIF/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "RIF/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -64400,16 +66797,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "RIF/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -64417,16 +66814,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "RIF/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -64434,12 +66831,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -64450,14 +66847,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" } }, @@ -64467,14 +66864,14 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "50", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.015", "cum": "25.0" } }, @@ -64484,14 +66881,14 @@ "currency": "USDT", "minNotional": 10000.0, "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "20", + "initialLeverage": "25", "notionalCap": "25000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.02", "cum": "75.0" } }, @@ -64500,33 +66897,33 @@ "symbol": "RLC/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", + "initialLeverage": "20", + "notionalCap": "50000", "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "maintMarginRatio": "0.025", + "cum": "200.0" } }, { "tier": 5.0, "symbol": "RLC/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, + "minNotional": 50000.0, "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "5", - "initialLeverage": "5", + "initialLeverage": "10", "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1450.0" } }, { @@ -64535,15 +66932,15 @@ "currency": "USDT", "minNotional": 125000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "6", - "initialLeverage": "4", + "initialLeverage": "5", "notionalCap": "250000", "notionalFloor": "125000", - "maintMarginRatio": "0.125", - "cum": "6950.0" + "maintMarginRatio": "0.1", + "cum": "7700.0" } }, { @@ -64551,37 +66948,54 @@ "symbol": "RLC/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "7", - "initialLeverage": "3", - "notionalCap": "4500000", + "initialLeverage": "4", + "notionalCap": "500000", "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "17375.0" + "maintMarginRatio": "0.125", + "cum": "13950.0" } }, { "tier": 8.0, "symbol": "RLC/USDT:USDT", "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34800.0" + } + }, + { + "tier": 9.0, + "symbol": "RLC/USDT:USDT", + "currency": "USDT", "minNotional": 4500000.0, "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "409650.0" } }, { - "tier": 9.0, + "tier": 10.0, "symbol": "RLC/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -64589,12 +67003,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2284650.0" } } ], @@ -66358,13 +68772,13 @@ "symbol": "SAND/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "25000", + "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -66374,51 +68788,51 @@ "tier": 4.0, "symbol": "SAND/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "25000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "200.0" + "cum": "325.0" } }, { "tier": 5.0, "symbol": "SAND/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 100000.0, + "maxNotional": 175000.0, + "maintenanceMarginRate": 0.0333, + "maxLeverage": 15.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "125000", - "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1450.0" + "initialLeverage": "15", + "notionalCap": "175000", + "notionalFloor": "100000", + "maintMarginRatio": "0.0333", + "cum": "1155.0" } }, { "tier": 6.0, "symbol": "SAND/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 175000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "10", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.1", - "cum": "7700.0" + "notionalFloor": "175000", + "maintMarginRatio": "0.05", + "cum": "4077.5" } }, { @@ -66426,54 +68840,71 @@ "symbol": "SAND/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "500000", + "initialLeverage": "5", + "notionalCap": "750000", "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "13950.0" + "maintMarginRatio": "0.1", + "cum": "16577.5" } }, { "tier": 8.0, "symbol": "SAND/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "8", - "initialLeverage": "3", - "notionalCap": "4500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.1667", - "cum": "34800.0" + "initialLeverage": "4", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.125", + "cum": "35327.5" } }, { "tier": 9.0, "symbol": "SAND/USDT:USDT", "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "9", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.1667", + "cum": "97877.5" + } + }, + { + "tier": 10.0, + "symbol": "SAND/USDT:USDT", + "currency": "USDT", "minNotional": 4500000.0, "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "409650.0" + "cum": "472727.5" } }, { - "tier": 10.0, + "tier": 11.0, "symbol": "SAND/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -66481,12 +68912,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "11", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2284650.0" + "cum": "2347727.5" } } ], @@ -67186,13 +69617,13 @@ "symbol": "SEI/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, + "maxNotional": 7500.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "5000", + "notionalCap": "7500", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -67202,170 +69633,170 @@ "tier": 2.0, "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, + "minNotional": 7500.0, + "maxNotional": 15000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "10000", - "notionalFloor": "5000", + "notionalCap": "15000", + "notionalFloor": "7500", "maintMarginRatio": "0.015", - "cum": "25.0" + "cum": "37.5" } }, { "tier": 3.0, "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 50000.0, + "minNotional": 15000.0, + "maxNotional": 75000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "50000", - "notionalFloor": "10000", + "notionalCap": "75000", + "notionalFloor": "15000", "maintMarginRatio": "0.02", - "cum": "75.0" + "cum": "112.5" } }, { "tier": 4.0, "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, + "minNotional": 75000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "100000", - "notionalFloor": "50000", + "notionalCap": "200000", + "notionalFloor": "75000", "maintMarginRatio": "0.025", - "cum": "325.0" + "cum": "487.5" } }, { "tier": 5.0, "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 175000.0, + "minNotional": 200000.0, + "maxNotional": 350000.0, "maintenanceMarginRate": 0.0333, "maxLeverage": 15.0, "info": { "bracket": "5", "initialLeverage": "15", - "notionalCap": "175000", - "notionalFloor": "100000", + "notionalCap": "350000", + "notionalFloor": "200000", "maintMarginRatio": "0.0333", - "cum": "1155.0" + "cum": "2147.5" } }, { "tier": 6.0, "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 175000.0, - "maxNotional": 250000.0, + "minNotional": 350000.0, + "maxNotional": 750000.0, "maintenanceMarginRate": 0.05, "maxLeverage": 10.0, "info": { "bracket": "6", "initialLeverage": "10", - "notionalCap": "250000", - "notionalFloor": "175000", + "notionalCap": "750000", + "notionalFloor": "350000", "maintMarginRatio": "0.05", - "cum": "4077.5" + "cum": "7992.5" } }, { "tier": 7.0, "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 750000.0, + "minNotional": 750000.0, + "maxNotional": 3000000.0, "maintenanceMarginRate": 0.1, "maxLeverage": 5.0, "info": { "bracket": "7", "initialLeverage": "5", - "notionalCap": "750000", - "notionalFloor": "250000", + "notionalCap": "3000000", + "notionalFloor": "750000", "maintMarginRatio": "0.1", - "cum": "16577.5" + "cum": "45492.5" } }, { "tier": 8.0, "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 750000.0, - "maxNotional": 1500000.0, + "minNotional": 3000000.0, + "maxNotional": 4500000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { "bracket": "8", "initialLeverage": "4", - "notionalCap": "1500000", - "notionalFloor": "750000", + "notionalCap": "4500000", + "notionalFloor": "3000000", "maintMarginRatio": "0.125", - "cum": "35327.5" + "cum": "120492.5" } }, { "tier": 9.0, "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 1500000.0, - "maxNotional": 4500000.0, + "minNotional": 4500000.0, + "maxNotional": 7500000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { "bracket": "9", "initialLeverage": "3", - "notionalCap": "4500000", - "notionalFloor": "1500000", + "notionalCap": "7500000", + "notionalFloor": "4500000", "maintMarginRatio": "0.1667", - "cum": "97877.5" + "cum": "308142.5" } }, { "tier": 10.0, "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 4500000.0, - "maxNotional": 7500000.0, + "minNotional": 7500000.0, + "maxNotional": 12000000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "10", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "4500000", + "notionalCap": "12000000", + "notionalFloor": "7500000", "maintMarginRatio": "0.25", - "cum": "472727.5" + "cum": "932892.5" } }, { "tier": 11.0, "symbol": "SEI/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12000000.0, + "minNotional": 12000000.0, + "maxNotional": 18000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "11", "initialLeverage": "1", - "notionalCap": "12000000", - "notionalFloor": "7500000", + "notionalCap": "18000000", + "notionalFloor": "12000000", "maintMarginRatio": "0.5", - "cum": "2347727.5" + "cum": "3932892.5" } } ], @@ -67858,15 +70289,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -67874,71 +70305,54 @@ "symbol": "SIREN/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "SIREN/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "SIREN/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "SIREN/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "SIREN/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -67946,16 +70360,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "SIREN/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -67963,16 +70377,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "SIREN/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -67980,12 +70394,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -68282,6 +70696,161 @@ } } ], + "SKY/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "SKY/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": "SKY/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "25000", + "notionalFloor": "5000", + "maintMarginRatio": "0.015", + "cum": "25.0" + } + }, + { + "tier": 3.0, + "symbol": "SKY/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 400000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "400000", + "notionalFloor": "25000", + "maintMarginRatio": "0.02", + "cum": "150.0" + } + }, + { + "tier": 4.0, + "symbol": "SKY/USDT:USDT", + "currency": "USDT", + "minNotional": 400000.0, + "maxNotional": 800000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "800000", + "notionalFloor": "400000", + "maintMarginRatio": "0.025", + "cum": "2150.0" + } + }, + { + "tier": 5.0, + "symbol": "SKY/USDT:USDT", + "currency": "USDT", + "minNotional": 800000.0, + "maxNotional": 4000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "4000000", + "notionalFloor": "800000", + "maintMarginRatio": "0.05", + "cum": "22150.0" + } + }, + { + "tier": 6.0, + "symbol": "SKY/USDT:USDT", + "currency": "USDT", + "minNotional": 4000000.0, + "maxNotional": 8000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "8000000", + "notionalFloor": "4000000", + "maintMarginRatio": "0.1", + "cum": "222150.0" + } + }, + { + "tier": 7.0, + "symbol": "SKY/USDT:USDT", + "currency": "USDT", + "minNotional": 8000000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "10000000", + "notionalFloor": "8000000", + "maintMarginRatio": "0.125", + "cum": "422150.0" + } + }, + { + "tier": 8.0, + "symbol": "SKY/USDT:USDT", + "currency": "USDT", + "minNotional": 10000000.0, + "maxNotional": 12000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "12000000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1672150.0" + } + }, + { + "tier": 9.0, + "symbol": "SKY/USDT:USDT", + "currency": "USDT", + "minNotional": 12000000.0, + "maxNotional": 14000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "14000000", + "notionalFloor": "12000000", + "maintMarginRatio": "0.5", + "cum": "4672150.0" + } + } + ], "SKYAI/USDT:USDT": [ { "tier": 1.0, @@ -68306,15 +70875,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -68322,50 +70891,50 @@ "symbol": "SKYAI/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "50000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "SKYAI/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "125000", - "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1325.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "SKYAI/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "5", + "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.1", - "cum": "7575.0" + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "2550.0" } }, { @@ -68373,37 +70942,20 @@ "symbol": "SKYAI/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": "SKYAI/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, "maxNotional": 4500000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", - "notionalFloor": "500000", + "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "34675.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "SKYAI/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -68411,16 +70963,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "409525.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "SKYAI/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -68428,12 +70980,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2284525.0" + "cum": "2262825.0" } } ], @@ -68582,14 +71134,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" } }, @@ -68599,15 +71151,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "50", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.015", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -68615,33 +71167,33 @@ "symbol": "SLP/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "25", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.02", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "SLP/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, + "minNotional": 20000.0, "maxNotional": 50000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "20", + "initialLeverage": "5", "notionalCap": "50000", - "notionalFloor": "25000", - "maintMarginRatio": "0.025", - "cum": "200.0" + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { @@ -68649,71 +71201,37 @@ "symbol": "SLP/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "125000", + "initialLeverage": "4", + "notionalCap": "250000", "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1450.0" + "maintMarginRatio": "0.125", + "cum": "2550.0" } }, { "tier": 6.0, "symbol": "SLP/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": "SLP/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": "SLP/USDT:USDT", - "currency": "USDT", - "minNotional": 500000.0, "maxNotional": 4500000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "8", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", - "notionalFloor": "500000", + "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "34800.0" + "cum": "12975.0" } }, { - "tier": 9.0, + "tier": 7.0, "symbol": "SLP/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -68721,16 +71239,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "409650.0" + "cum": "387825.0" } }, { - "tier": 10.0, + "tier": 8.0, "symbol": "SLP/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -68738,12 +71256,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2284650.0" + "cum": "2262825.0" } } ], @@ -69580,14 +72098,14 @@ "currency": "USDT", "minNotional": 0.0, "maxNotional": 5000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "25", + "initialLeverage": "75", "notionalCap": "5000", "notionalFloor": "0", - "maintMarginRatio": "0.02", + "maintMarginRatio": "0.01", "cum": "0.0" } }, @@ -69597,14 +72115,14 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "50", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", + "maintMarginRatio": "0.015", "cum": "25.0" } }, @@ -69614,15 +72132,15 @@ "currency": "USDT", "minNotional": 10000.0, "maxNotional": 25000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "10", + "initialLeverage": "25", "notionalCap": "25000", "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "275.0" + "maintMarginRatio": "0.02", + "cum": "75.0" } }, { @@ -69631,15 +72149,15 @@ "currency": "USDT", "minNotional": 25000.0, "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "4", - "initialLeverage": "5", + "initialLeverage": "20", "notionalCap": "50000", "notionalFloor": "25000", - "maintMarginRatio": "0.1", - "cum": "1525.0" + "maintMarginRatio": "0.025", + "cum": "200.0" } }, { @@ -69647,33 +72165,33 @@ "symbol": "SOMI/USDT:USDT", "currency": "USDT", "minNotional": 50000.0, - "maxNotional": 100000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "100000", + "initialLeverage": "10", + "notionalCap": "125000", "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2775.0" + "maintMarginRatio": "0.05", + "cum": "1450.0" } }, { "tier": 6.0, "symbol": "SOMI/USDT:USDT", "currency": "USDT", - "minNotional": 100000.0, + "minNotional": 125000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "6", - "initialLeverage": "3", + "initialLeverage": "5", "notionalCap": "250000", - "notionalFloor": "100000", - "maintMarginRatio": "0.1667", - "cum": "6945.0" + "notionalFloor": "125000", + "maintMarginRatio": "0.1", + "cum": "7700.0" } }, { @@ -69682,15 +72200,15 @@ "currency": "USDT", "minNotional": 250000.0, "maxNotional": 500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "7", - "initialLeverage": "2", + "initialLeverage": "4", "notionalCap": "500000", "notionalFloor": "250000", - "maintMarginRatio": "0.25", - "cum": "27770.0" + "maintMarginRatio": "0.125", + "cum": "13950.0" } }, { @@ -69698,16 +72216,50 @@ "symbol": "SOMI/USDT:USDT", "currency": "USDT", "minNotional": 500000.0, - "maxNotional": 800000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34800.0" + } + }, + { + "tier": 9.0, + "symbol": "SOMI/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "409650.0" + } + }, + { + "tier": 10.0, + "symbol": "SOMI/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "10", "initialLeverage": "1", - "notionalCap": "800000", - "notionalFloor": "500000", + "notionalCap": "12500000", + "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "152770.0" + "cum": "2284650.0" } } ], @@ -70594,13 +73146,13 @@ "symbol": "SPX/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "25000", + "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -70610,51 +73162,51 @@ "tier": 4.0, "symbol": "SPX/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "25000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "200.0" + "cum": "325.0" } }, { "tier": 5.0, "symbol": "SPX/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 100000.0, + "maxNotional": 175000.0, + "maintenanceMarginRate": 0.0333, + "maxLeverage": 15.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "125000", - "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1450.0" + "initialLeverage": "15", + "notionalCap": "175000", + "notionalFloor": "100000", + "maintMarginRatio": "0.0333", + "cum": "1155.0" } }, { "tier": 6.0, "symbol": "SPX/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 175000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "10", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.1", - "cum": "7700.0" + "notionalFloor": "175000", + "maintMarginRatio": "0.05", + "cum": "4077.5" } }, { @@ -70662,54 +73214,71 @@ "symbol": "SPX/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "500000", + "initialLeverage": "5", + "notionalCap": "750000", "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "13950.0" + "maintMarginRatio": "0.1", + "cum": "16577.5" } }, { "tier": 8.0, "symbol": "SPX/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "8", - "initialLeverage": "3", - "notionalCap": "4500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.1667", - "cum": "34800.0" + "initialLeverage": "4", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.125", + "cum": "35327.5" } }, { "tier": 9.0, "symbol": "SPX/USDT:USDT", "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "9", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.1667", + "cum": "97877.5" + } + }, + { + "tier": 10.0, + "symbol": "SPX/USDT:USDT", + "currency": "USDT", "minNotional": 4500000.0, "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "409650.0" + "cum": "472727.5" } }, { - "tier": 10.0, + "tier": 11.0, "symbol": "SPX/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -70717,12 +73286,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "11", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2284650.0" + "cum": "2347727.5" } } ], @@ -70750,15 +73319,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -70766,71 +73335,54 @@ "symbol": "SQD/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "SQD/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "SQD/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "SQD/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "SQD/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -70838,16 +73390,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "SQD/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -70855,16 +73407,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "SQD/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -70872,12 +73424,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -71053,6 +73605,161 @@ } } ], + "STBL/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "STBL/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": "STBL/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": "STBL/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "STBL/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 62500.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "62500", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 5.0, + "symbol": "STBL/USDT:USDT", + "currency": "USDT", + "minNotional": 62500.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "125000", + "notionalFloor": "62500", + "maintMarginRatio": "0.1", + "cum": "3825.0" + } + }, + { + "tier": 6.0, + "symbol": "STBL/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.125", + "cum": "6950.0" + } + }, + { + "tier": 7.0, + "symbol": "STBL/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1667", + "cum": "17375.0" + } + }, + { + "tier": 8.0, + "symbol": "STBL/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "392225.0" + } + }, + { + "tier": 9.0, + "symbol": "STBL/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "2267225.0" + } + } + ], "STEEM/USDT:USDT": [ { "tier": 1.0, @@ -71077,15 +73784,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -71093,71 +73800,54 @@ "symbol": "STEEM/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "STEEM/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "STEEM/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "STEEM/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "STEEM/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -71165,16 +73855,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "STEEM/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -71182,16 +73872,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "STEEM/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -71199,12 +73889,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -74351,15 +77041,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -74367,71 +77057,54 @@ "symbol": "TA/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "TA/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "TA/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "TA/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "TA/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -74439,16 +77112,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "TA/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -74456,16 +77129,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "TA/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -74473,12 +77146,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -74799,6 +77472,144 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "2", + "initialLeverage": "20", + "notionalCap": "10000", + "notionalFloor": "5000", + "maintMarginRatio": "0.025", + "cum": "50.0" + } + }, + { + "tier": 3.0, + "symbol": "TAIKO/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "3", + "initialLeverage": "10", + "notionalCap": "20000", + "notionalFloor": "10000", + "maintMarginRatio": "0.05", + "cum": "300.0" + } + }, + { + "tier": 4.0, + "symbol": "TAIKO/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "4", + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" + } + }, + { + "tier": 5.0, + "symbol": "TAIKO/USDT:USDT", + "currency": "USDT", + "minNotional": 50000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "5", + "initialLeverage": "4", + "notionalCap": "250000", + "notionalFloor": "50000", + "maintMarginRatio": "0.125", + "cum": "2550.0" + } + }, + { + "tier": 6.0, + "symbol": "TAIKO/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "6", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1667", + "cum": "12975.0" + } + }, + { + "tier": 7.0, + "symbol": "TAIKO/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "7", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "387825.0" + } + }, + { + "tier": 8.0, + "symbol": "TAIKO/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "8", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "2262825.0" + } + } + ], + "TAKE/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "TAKE/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": "TAKE/USDT:USDT", + "currency": "USDT", + "minNotional": 5000.0, + "maxNotional": 10000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { @@ -74812,7 +77623,7 @@ }, { "tier": 3.0, - "symbol": "TAIKO/USDT:USDT", + "symbol": "TAKE/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, "maxNotional": 25000.0, @@ -74829,7 +77640,7 @@ }, { "tier": 4.0, - "symbol": "TAIKO/USDT:USDT", + "symbol": "TAKE/USDT:USDT", "currency": "USDT", "minNotional": 25000.0, "maxNotional": 62500.0, @@ -74846,7 +77657,7 @@ }, { "tier": 5.0, - "symbol": "TAIKO/USDT:USDT", + "symbol": "TAKE/USDT:USDT", "currency": "USDT", "minNotional": 62500.0, "maxNotional": 125000.0, @@ -74863,7 +77674,7 @@ }, { "tier": 6.0, - "symbol": "TAIKO/USDT:USDT", + "symbol": "TAKE/USDT:USDT", "currency": "USDT", "minNotional": 125000.0, "maxNotional": 250000.0, @@ -74880,7 +77691,7 @@ }, { "tier": 7.0, - "symbol": "TAIKO/USDT:USDT", + "symbol": "TAKE/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, "maxNotional": 4500000.0, @@ -74897,7 +77708,7 @@ }, { "tier": 8.0, - "symbol": "TAIKO/USDT:USDT", + "symbol": "TAKE/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, "maxNotional": 7500000.0, @@ -74914,7 +77725,7 @@ }, { "tier": 9.0, - "symbol": "TAIKO/USDT:USDT", + "symbol": "TAKE/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, "maxNotional": 12500000.0, @@ -76005,15 +78816,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -76021,71 +78832,54 @@ "symbol": "TNSR/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "TNSR/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "TNSR/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "TNSR/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "TNSR/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -76093,16 +78887,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "TNSR/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -76110,16 +78904,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "TNSR/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -76127,12 +78921,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -76429,6 +79223,178 @@ } } ], + "TOSHI/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "TOSHI/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": "TOSHI/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": "TOSHI/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": "TOSHI/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": "TOSHI/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": "TOSHI/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": "TOSHI/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": "TOSHI/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34800.0" + } + }, + { + "tier": 9.0, + "symbol": "TOSHI/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "409650.0" + } + }, + { + "tier": 10.0, + "symbol": "TOSHI/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "2284650.0" + } + } + ], "TOWNS/USDT:USDT": [ { "tier": 1.0, @@ -76601,6 +79567,161 @@ } } ], + "TRADOOR/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "TRADOOR/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": "TRADOOR/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": "TRADOOR/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "TRADOOR/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 62500.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "62500", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 5.0, + "symbol": "TRADOOR/USDT:USDT", + "currency": "USDT", + "minNotional": 62500.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "125000", + "notionalFloor": "62500", + "maintMarginRatio": "0.1", + "cum": "3825.0" + } + }, + { + "tier": 6.0, + "symbol": "TRADOOR/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.125", + "cum": "6950.0" + } + }, + { + "tier": 7.0, + "symbol": "TRADOOR/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1667", + "cum": "17375.0" + } + }, + { + "tier": 8.0, + "symbol": "TRADOOR/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "392225.0" + } + }, + { + "tier": 9.0, + "symbol": "TRADOOR/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "2267225.0" + } + } + ], "TRB/USDT:USDT": [ { "tier": 1.0, @@ -77778,15 +80899,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "2", - "initialLeverage": "20", + "initialLeverage": "25", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.025", - "cum": "50.0" + "maintMarginRatio": "0.02", + "cum": "25.0" } }, { @@ -77794,71 +80915,88 @@ "symbol": "TST/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 20000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "3", - "initialLeverage": "10", - "notionalCap": "20000", + "initialLeverage": "20", + "notionalCap": "25000", "notionalFloor": "10000", - "maintMarginRatio": "0.05", - "cum": "300.0" + "maintMarginRatio": "0.025", + "cum": "75.0" } }, { "tier": 4.0, "symbol": "TST/USDT:USDT", "currency": "USDT", - "minNotional": 20000.0, - "maxNotional": 50000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 25000.0, + "maxNotional": 62500.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "4", - "initialLeverage": "5", - "notionalCap": "50000", - "notionalFloor": "20000", - "maintMarginRatio": "0.1", - "cum": "1300.0" + "initialLeverage": "10", + "notionalCap": "62500", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" } }, { "tier": 5.0, "symbol": "TST/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 62500.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "5", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "50000", - "maintMarginRatio": "0.125", - "cum": "2550.0" + "initialLeverage": "5", + "notionalCap": "125000", + "notionalFloor": "62500", + "maintMarginRatio": "0.1", + "cum": "3825.0" } }, { "tier": 6.0, "symbol": "TST/USDT:USDT", "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.125", + "cum": "6950.0" + } + }, + { + "tier": 7.0, + "symbol": "TST/USDT:USDT", + "currency": "USDT", "minNotional": 250000.0, "maxNotional": 4500000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "6", + "bracket": "7", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "12975.0" + "cum": "17375.0" } }, { - "tier": 7.0, + "tier": 8.0, "symbol": "TST/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -77866,16 +81004,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "7", + "bracket": "8", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "387825.0" + "cum": "392225.0" } }, { - "tier": 8.0, + "tier": 9.0, "symbol": "TST/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -77883,12 +81021,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "8", + "bracket": "9", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2262825.0" + "cum": "2267225.0" } } ], @@ -78357,6 +81495,161 @@ } } ], + "UB/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "UB/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": "UB/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": "UB/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "UB/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 62500.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "62500", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 5.0, + "symbol": "UB/USDT:USDT", + "currency": "USDT", + "minNotional": 62500.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "125000", + "notionalFloor": "62500", + "maintMarginRatio": "0.1", + "cum": "3825.0" + } + }, + { + "tier": 6.0, + "symbol": "UB/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.125", + "cum": "6950.0" + } + }, + { + "tier": 7.0, + "symbol": "UB/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1667", + "cum": "17375.0" + } + }, + { + "tier": 8.0, + "symbol": "UB/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "392225.0" + } + }, + { + "tier": 9.0, + "symbol": "UB/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "2267225.0" + } + } + ], "UMA/USDT:USDT": [ { "tier": 1.0, @@ -79586,15 +82879,15 @@ "symbol": "UXLINK/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 30000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "10", + "notionalCap": "30000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.05", "cum": "0.0" } }, @@ -79602,136 +82895,85 @@ "tier": 2.0, "symbol": "UXLINK/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 30000.0, + "maxNotional": 75000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "initialLeverage": "5", + "notionalCap": "75000", + "notionalFloor": "30000", + "maintMarginRatio": "0.1", + "cum": "1500.0" } }, { "tier": 3.0, "symbol": "UXLINK/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 75000.0, + "maxNotional": 150000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "initialLeverage": "4", + "notionalCap": "150000", + "notionalFloor": "75000", + "maintMarginRatio": "0.125", + "cum": "3375.0" } }, { "tier": 4.0, "symbol": "UXLINK/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 150000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "3", + "notionalCap": "1500000", + "notionalFloor": "150000", + "maintMarginRatio": "0.1667", + "cum": "9630.0" } }, { "tier": 5.0, "symbol": "UXLINK/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 1500000.0, + "maxNotional": 2500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, "info": { "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" + "initialLeverage": "2", + "notionalCap": "2500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.25", + "cum": "134580.0" } }, { "tier": 6.0, "symbol": "UXLINK/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "6", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.125", - "cum": "6950.0" - } - }, - { - "tier": 7.0, - "symbol": "UXLINK/USDT:USDT", - "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, - "info": { - "bracket": "7", - "initialLeverage": "3", - "notionalCap": "4500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "17375.0" - } - }, - { - "tier": 8.0, - "symbol": "UXLINK/USDT:USDT", - "currency": "USDT", - "minNotional": 4500000.0, - "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, - "info": { - "bracket": "8", - "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "4500000", - "maintMarginRatio": "0.25", - "cum": "392225.0" - } - }, - { - "tier": 9.0, - "symbol": "UXLINK/USDT:USDT", - "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 2500000.0, + "maxNotional": 4000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "6", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "4000000", + "notionalFloor": "2500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "759580.0" } } ], @@ -80086,15 +83328,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -80102,71 +83344,54 @@ "symbol": "VELODROME/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "VELODROME/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "VELODROME/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "VELODROME/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "VELODROME/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -80174,16 +83399,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "VELODROME/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -80191,16 +83416,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "VELODROME/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -80208,12 +83433,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -81584,13 +84809,13 @@ "symbol": "W/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, + "maxNotional": 7500.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, "info": { "bracket": "1", "initialLeverage": "75", - "notionalCap": "5000", + "notionalCap": "7500", "notionalFloor": "0", "maintMarginRatio": "0.01", "cum": "0.0" @@ -81600,119 +84825,119 @@ "tier": 2.0, "symbol": "W/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, + "minNotional": 7500.0, + "maxNotional": 15000.0, "maintenanceMarginRate": 0.015, "maxLeverage": 50.0, "info": { "bracket": "2", "initialLeverage": "50", - "notionalCap": "10000", - "notionalFloor": "5000", + "notionalCap": "15000", + "notionalFloor": "7500", "maintMarginRatio": "0.015", - "cum": "25.0" + "cum": "37.5" } }, { "tier": 3.0, "symbol": "W/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 25000.0, + "minNotional": 15000.0, + "maxNotional": 75000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "25000", - "notionalFloor": "10000", + "notionalCap": "75000", + "notionalFloor": "15000", "maintMarginRatio": "0.02", - "cum": "75.0" + "cum": "112.5" } }, { "tier": 4.0, "symbol": "W/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, + "minNotional": 75000.0, + "maxNotional": 200000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "25000", + "notionalCap": "200000", + "notionalFloor": "75000", "maintMarginRatio": "0.025", - "cum": "200.0" + "cum": "487.5" } }, { "tier": 5.0, "symbol": "W/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 200000.0, + "maxNotional": 350000.0, + "maintenanceMarginRate": 0.0333, + "maxLeverage": 15.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "125000", - "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1450.0" + "initialLeverage": "15", + "notionalCap": "350000", + "notionalFloor": "200000", + "maintMarginRatio": "0.0333", + "cum": "2147.5" } }, { "tier": 6.0, "symbol": "W/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 350000.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "6", - "initialLeverage": "5", - "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.1", - "cum": "7700.0" + "initialLeverage": "10", + "notionalCap": "750000", + "notionalFloor": "350000", + "maintMarginRatio": "0.05", + "cum": "7992.5" } }, { "tier": 7.0, "symbol": "W/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 750000.0, + "maxNotional": 3000000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "13950.0" + "initialLeverage": "5", + "notionalCap": "3000000", + "notionalFloor": "750000", + "maintMarginRatio": "0.1", + "cum": "45492.5" } }, { "tier": 8.0, "symbol": "W/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, + "minNotional": 3000000.0, "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "8", - "initialLeverage": "3", + "initialLeverage": "4", "notionalCap": "4500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.1667", - "cum": "34800.0" + "notionalFloor": "3000000", + "maintMarginRatio": "0.125", + "cum": "120492.5" } }, { @@ -81721,15 +84946,15 @@ "currency": "USDT", "minNotional": 4500000.0, "maxNotional": 7500000.0, - "maintenanceMarginRate": 0.25, - "maxLeverage": 2.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, "info": { "bracket": "9", - "initialLeverage": "2", + "initialLeverage": "3", "notionalCap": "7500000", "notionalFloor": "4500000", - "maintMarginRatio": "0.25", - "cum": "409650.0" + "maintMarginRatio": "0.1667", + "cum": "308142.5" } }, { @@ -81737,16 +84962,33 @@ "symbol": "W/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "maxNotional": 12000000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "10", + "initialLeverage": "2", + "notionalCap": "12000000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.25", + "cum": "932892.5" + } + }, + { + "tier": 11.0, + "symbol": "W/USDT:USDT", + "currency": "USDT", + "minNotional": 12000000.0, + "maxNotional": 18000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "11", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "18000000", + "notionalFloor": "12000000", "maintMarginRatio": "0.5", - "cum": "2284650.0" + "cum": "3932892.5" } } ], @@ -82067,15 +85309,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -82083,71 +85325,54 @@ "symbol": "WAXP/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "WAXP/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "WAXP/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "WAXP/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "WAXP/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -82155,16 +85380,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "WAXP/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -82172,16 +85397,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "WAXP/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -82189,12 +85414,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], @@ -82841,6 +86066,161 @@ "symbol": "WLD/USDT:USDT", "currency": "USDT", "minNotional": 0.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, + "info": { + "bracket": "1", + "initialLeverage": "75", + "notionalCap": "20000", + "notionalFloor": "0", + "maintMarginRatio": "0.01", + "cum": "0.0" + } + }, + { + "tier": 2.0, + "symbol": "WLD/USDT:USDT", + "currency": "USDT", + "minNotional": 20000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, + "info": { + "bracket": "2", + "initialLeverage": "50", + "notionalCap": "200000", + "notionalFloor": "20000", + "maintMarginRatio": "0.015", + "cum": "100.0" + } + }, + { + "tier": 3.0, + "symbol": "WLD/USDT:USDT", + "currency": "USDT", + "minNotional": 200000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, + "info": { + "bracket": "3", + "initialLeverage": "25", + "notionalCap": "1000000", + "notionalFloor": "200000", + "maintMarginRatio": "0.02", + "cum": "1100.0" + } + }, + { + "tier": 4.0, + "symbol": "WLD/USDT:USDT", + "currency": "USDT", + "minNotional": 1000000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "4", + "initialLeverage": "20", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.025", + "cum": "6100.0" + } + }, + { + "tier": 5.0, + "symbol": "WLD/USDT:USDT", + "currency": "USDT", + "minNotional": 2000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "5", + "initialLeverage": "10", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.05", + "cum": "56100.0" + } + }, + { + "tier": 6.0, + "symbol": "WLD/USDT:USDT", + "currency": "USDT", + "minNotional": 5000000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "6", + "initialLeverage": "5", + "notionalCap": "7500000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.1", + "cum": "306100.0" + } + }, + { + "tier": 7.0, + "symbol": "WLD/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "7", + "initialLeverage": "4", + "notionalCap": "10000000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.125", + "cum": "493600.0" + } + }, + { + "tier": 8.0, + "symbol": "WLD/USDT:USDT", + "currency": "USDT", + "minNotional": 10000000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "12500000", + "notionalFloor": "10000000", + "maintMarginRatio": "0.25", + "cum": "1743600.0" + } + }, + { + "tier": 9.0, + "symbol": "WLD/USDT:USDT", + "currency": "USDT", + "minNotional": 12500000.0, + "maxNotional": 15000000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "15000000", + "notionalFloor": "12500000", + "maintMarginRatio": "0.5", + "cum": "4868600.0" + } + } + ], + "WLFI/USDC:USDC": [ + { + "tier": 1.0, + "symbol": "WLFI/USDC:USDC", + "currency": "USDC", + "minNotional": 0.0, "maxNotional": 5000.0, "maintenanceMarginRate": 0.01, "maxLeverage": 75.0, @@ -82855,8 +86235,8 @@ }, { "tier": 2.0, - "symbol": "WLD/USDT:USDT", - "currency": "USDT", + "symbol": "WLFI/USDC:USDC", + "currency": "USDC", "minNotional": 5000.0, "maxNotional": 10000.0, "maintenanceMarginRate": 0.015, @@ -82872,16 +86252,16 @@ }, { "tier": 3.0, - "symbol": "WLD/USDT:USDT", - "currency": "USDT", + "symbol": "WLFI/USDC:USDC", + "currency": "USDC", "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" @@ -82889,138 +86269,121 @@ }, { "tier": 4.0, - "symbol": "WLD/USDT:USDT", - "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 100000.0, + "symbol": "WLFI/USDC:USDC", + "currency": "USDC", + "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": "WLD/USDT:USDT", - "currency": "USDT", - "minNotional": 100000.0, - "maxNotional": 175000.0, - "maintenanceMarginRate": 0.0333, - "maxLeverage": 15.0, + "symbol": "WLFI/USDC:USDC", + "currency": "USDC", + "minNotional": 50000.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "5", - "initialLeverage": "15", - "notionalCap": "175000", - "notionalFloor": "100000", - "maintMarginRatio": "0.0333", - "cum": "1155.0" + "initialLeverage": "10", + "notionalCap": "125000", + "notionalFloor": "50000", + "maintMarginRatio": "0.05", + "cum": "1450.0" } }, { "tier": 6.0, - "symbol": "WLD/USDT:USDT", - "currency": "USDT", - "minNotional": 175000.0, + "symbol": "WLFI/USDC:USDC", + "currency": "USDC", + "minNotional": 125000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "6", - "initialLeverage": "10", + "initialLeverage": "5", "notionalCap": "250000", - "notionalFloor": "175000", - "maintMarginRatio": "0.05", - "cum": "4077.5" + "notionalFloor": "125000", + "maintMarginRatio": "0.1", + "cum": "7700.0" } }, { "tier": 7.0, - "symbol": "WLD/USDT:USDT", - "currency": "USDT", + "symbol": "WLFI/USDC:USDC", + "currency": "USDC", "minNotional": 250000.0, - "maxNotional": 750000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maxNotional": 500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "7", - "initialLeverage": "5", - "notionalCap": "750000", + "initialLeverage": "4", + "notionalCap": "500000", "notionalFloor": "250000", - "maintMarginRatio": "0.1", - "cum": "16577.5" + "maintMarginRatio": "0.125", + "cum": "13950.0" } }, { "tier": 8.0, - "symbol": "WLD/USDT:USDT", - "currency": "USDT", - "minNotional": 750000.0, - "maxNotional": 1500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, - "info": { - "bracket": "8", - "initialLeverage": "4", - "notionalCap": "1500000", - "notionalFloor": "750000", - "maintMarginRatio": "0.125", - "cum": "35327.5" - } - }, - { - "tier": 9.0, - "symbol": "WLD/USDT:USDT", - "currency": "USDT", - "minNotional": 1500000.0, + "symbol": "WLFI/USDC:USDC", + "currency": "USDC", + "minNotional": 500000.0, "maxNotional": 4500000.0, "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "3", "notionalCap": "4500000", - "notionalFloor": "1500000", + "notionalFloor": "500000", "maintMarginRatio": "0.1667", - "cum": "97877.5" + "cum": "34800.0" } }, { - "tier": 10.0, - "symbol": "WLD/USDT:USDT", - "currency": "USDT", + "tier": 9.0, + "symbol": "WLFI/USDC:USDC", + "currency": "USDC", "minNotional": 4500000.0, "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "10", + "bracket": "9", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "472727.5" + "cum": "409650.0" } }, { - "tier": 11.0, - "symbol": "WLD/USDT:USDT", - "currency": "USDT", + "tier": 10.0, + "symbol": "WLFI/USDC:USDC", + "currency": "USDC", "minNotional": 7500000.0, "maxNotional": 12500000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "11", + "bracket": "10", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2347727.5" + "cum": "2284650.0" } } ], @@ -83030,15 +86393,15 @@ "symbol": "WLFI/USDT:USDT", "currency": "USDT", "minNotional": 0.0, - "maxNotional": 5000.0, - "maintenanceMarginRate": 0.015, - "maxLeverage": 50.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.01, + "maxLeverage": 75.0, "info": { "bracket": "1", - "initialLeverage": "50", - "notionalCap": "5000", + "initialLeverage": "75", + "notionalCap": "20000", "notionalFloor": "0", - "maintMarginRatio": "0.015", + "maintMarginRatio": "0.01", "cum": "0.0" } }, @@ -83046,136 +86409,136 @@ "tier": 2.0, "symbol": "WLFI/USDT:USDT", "currency": "USDT", - "minNotional": 5000.0, - "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "minNotional": 20000.0, + "maxNotional": 200000.0, + "maintenanceMarginRate": 0.015, + "maxLeverage": 50.0, "info": { "bracket": "2", - "initialLeverage": "25", - "notionalCap": "10000", - "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "initialLeverage": "50", + "notionalCap": "200000", + "notionalFloor": "20000", + "maintMarginRatio": "0.015", + "cum": "100.0" } }, { "tier": 3.0, "symbol": "WLFI/USDT:USDT", "currency": "USDT", - "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "minNotional": 200000.0, + "maxNotional": 1000000.0, + "maintenanceMarginRate": 0.02, + "maxLeverage": 25.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", - "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "initialLeverage": "25", + "notionalCap": "1000000", + "notionalFloor": "200000", + "maintMarginRatio": "0.02", + "cum": "1100.0" } }, { "tier": 4.0, "symbol": "WLFI/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 1000000.0, + "maxNotional": 2000000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "20", + "notionalCap": "2000000", + "notionalFloor": "1000000", + "maintMarginRatio": "0.025", + "cum": "6100.0" } }, { "tier": 5.0, "symbol": "WLFI/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "minNotional": 2000000.0, + "maxNotional": 5000000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" + "initialLeverage": "10", + "notionalCap": "5000000", + "notionalFloor": "2000000", + "maintMarginRatio": "0.05", + "cum": "56100.0" } }, { "tier": 6.0, "symbol": "WLFI/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, - "maxNotional": 250000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "minNotional": 5000000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "6", - "initialLeverage": "4", - "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.125", - "cum": "6950.0" + "initialLeverage": "5", + "notionalCap": "7500000", + "notionalFloor": "5000000", + "maintMarginRatio": "0.1", + "cum": "306100.0" } }, { "tier": 7.0, "symbol": "WLFI/USDT:USDT", "currency": "USDT", - "minNotional": 250000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "minNotional": 7500000.0, + "maxNotional": 10000000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "7", - "initialLeverage": "3", - "notionalCap": "4500000", - "notionalFloor": "250000", - "maintMarginRatio": "0.1667", - "cum": "17375.0" + "initialLeverage": "4", + "notionalCap": "10000000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.125", + "cum": "493600.0" } }, { "tier": 8.0, "symbol": "WLFI/USDT:USDT", "currency": "USDT", - "minNotional": 4500000.0, - "maxNotional": 7500000.0, + "minNotional": 10000000.0, + "maxNotional": 12500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { "bracket": "8", "initialLeverage": "2", - "notionalCap": "7500000", - "notionalFloor": "4500000", + "notionalCap": "12500000", + "notionalFloor": "10000000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "1743600.0" } }, { "tier": 9.0, "symbol": "WLFI/USDT:USDT", "currency": "USDT", - "minNotional": 7500000.0, - "maxNotional": 12500000.0, + "minNotional": 12500000.0, + "maxNotional": 15000000.0, "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { "bracket": "9", "initialLeverage": "1", - "notionalCap": "12500000", - "notionalFloor": "7500000", + "notionalCap": "15000000", + "notionalFloor": "12500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "4868600.0" } } ], @@ -83994,13 +87357,13 @@ "symbol": "XMR/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, + "maxNotional": 50000.0, "maintenanceMarginRate": 0.02, "maxLeverage": 25.0, "info": { "bracket": "3", "initialLeverage": "25", - "notionalCap": "25000", + "notionalCap": "50000", "notionalFloor": "10000", "maintMarginRatio": "0.02", "cum": "75.0" @@ -84010,51 +87373,51 @@ "tier": 4.0, "symbol": "XMR/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 50000.0, + "minNotional": 50000.0, + "maxNotional": 100000.0, "maintenanceMarginRate": 0.025, "maxLeverage": 20.0, "info": { "bracket": "4", "initialLeverage": "20", - "notionalCap": "50000", - "notionalFloor": "25000", + "notionalCap": "100000", + "notionalFloor": "50000", "maintMarginRatio": "0.025", - "cum": "200.0" + "cum": "325.0" } }, { "tier": 5.0, "symbol": "XMR/USDT:USDT", "currency": "USDT", - "minNotional": 50000.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 100000.0, + "maxNotional": 175000.0, + "maintenanceMarginRate": 0.0333, + "maxLeverage": 15.0, "info": { "bracket": "5", - "initialLeverage": "10", - "notionalCap": "125000", - "notionalFloor": "50000", - "maintMarginRatio": "0.05", - "cum": "1450.0" + "initialLeverage": "15", + "notionalCap": "175000", + "notionalFloor": "100000", + "maintMarginRatio": "0.0333", + "cum": "1155.0" } }, { "tier": 6.0, "symbol": "XMR/USDT:USDT", "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 175000.0, "maxNotional": 250000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "6", - "initialLeverage": "5", + "initialLeverage": "10", "notionalCap": "250000", - "notionalFloor": "125000", - "maintMarginRatio": "0.1", - "cum": "7700.0" + "notionalFloor": "175000", + "maintMarginRatio": "0.05", + "cum": "4077.5" } }, { @@ -84062,54 +87425,71 @@ "symbol": "XMR/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, - "maxNotional": 500000.0, - "maintenanceMarginRate": 0.125, - "maxLeverage": 4.0, + "maxNotional": 750000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "7", - "initialLeverage": "4", - "notionalCap": "500000", + "initialLeverage": "5", + "notionalCap": "750000", "notionalFloor": "250000", - "maintMarginRatio": "0.125", - "cum": "13950.0" + "maintMarginRatio": "0.1", + "cum": "16577.5" } }, { "tier": 8.0, "symbol": "XMR/USDT:USDT", "currency": "USDT", - "minNotional": 500000.0, - "maxNotional": 4500000.0, - "maintenanceMarginRate": 0.1667, - "maxLeverage": 3.0, + "minNotional": 750000.0, + "maxNotional": 1500000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, "info": { "bracket": "8", - "initialLeverage": "3", - "notionalCap": "4500000", - "notionalFloor": "500000", - "maintMarginRatio": "0.1667", - "cum": "34800.0" + "initialLeverage": "4", + "notionalCap": "1500000", + "notionalFloor": "750000", + "maintMarginRatio": "0.125", + "cum": "35327.5" } }, { "tier": 9.0, "symbol": "XMR/USDT:USDT", "currency": "USDT", + "minNotional": 1500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "9", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "1500000", + "maintMarginRatio": "0.1667", + "cum": "97877.5" + } + }, + { + "tier": 10.0, + "symbol": "XMR/USDT:USDT", + "currency": "USDT", "minNotional": 4500000.0, "maxNotional": 7500000.0, "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "9", + "bracket": "10", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "409650.0" + "cum": "472727.5" } }, { - "tier": 10.0, + "tier": 11.0, "symbol": "XMR/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -84117,12 +87497,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "10", + "bracket": "11", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2284650.0" + "cum": "2347727.5" } } ], @@ -84281,6 +87661,161 @@ } } ], + "XPIN/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "XPIN/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": "XPIN/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": "XPIN/USDT:USDT", + "currency": "USDT", + "minNotional": 10000.0, + "maxNotional": 25000.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, + "info": { + "bracket": "3", + "initialLeverage": "20", + "notionalCap": "25000", + "notionalFloor": "10000", + "maintMarginRatio": "0.025", + "cum": "75.0" + } + }, + { + "tier": 4.0, + "symbol": "XPIN/USDT:USDT", + "currency": "USDT", + "minNotional": 25000.0, + "maxNotional": 62500.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, + "info": { + "bracket": "4", + "initialLeverage": "10", + "notionalCap": "62500", + "notionalFloor": "25000", + "maintMarginRatio": "0.05", + "cum": "700.0" + } + }, + { + "tier": 5.0, + "symbol": "XPIN/USDT:USDT", + "currency": "USDT", + "minNotional": 62500.0, + "maxNotional": 125000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, + "info": { + "bracket": "5", + "initialLeverage": "5", + "notionalCap": "125000", + "notionalFloor": "62500", + "maintMarginRatio": "0.1", + "cum": "3825.0" + } + }, + { + "tier": 6.0, + "symbol": "XPIN/USDT:USDT", + "currency": "USDT", + "minNotional": 125000.0, + "maxNotional": 250000.0, + "maintenanceMarginRate": 0.125, + "maxLeverage": 4.0, + "info": { + "bracket": "6", + "initialLeverage": "4", + "notionalCap": "250000", + "notionalFloor": "125000", + "maintMarginRatio": "0.125", + "cum": "6950.0" + } + }, + { + "tier": 7.0, + "symbol": "XPIN/USDT:USDT", + "currency": "USDT", + "minNotional": 250000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "7", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "250000", + "maintMarginRatio": "0.1667", + "cum": "17375.0" + } + }, + { + "tier": 8.0, + "symbol": "XPIN/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "8", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "392225.0" + } + }, + { + "tier": 9.0, + "symbol": "XPIN/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "9", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "2267225.0" + } + } + ], "XPL/USDT:USDT": [ { "tier": 1.0, @@ -86742,6 +90277,178 @@ } } ], + "ZKC/USDT:USDT": [ + { + "tier": 1.0, + "symbol": "ZKC/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": "ZKC/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": "ZKC/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": "ZKC/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": "ZKC/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": "ZKC/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": "ZKC/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": "ZKC/USDT:USDT", + "currency": "USDT", + "minNotional": 500000.0, + "maxNotional": 4500000.0, + "maintenanceMarginRate": 0.1667, + "maxLeverage": 3.0, + "info": { + "bracket": "8", + "initialLeverage": "3", + "notionalCap": "4500000", + "notionalFloor": "500000", + "maintMarginRatio": "0.1667", + "cum": "34800.0" + } + }, + { + "tier": 9.0, + "symbol": "ZKC/USDT:USDT", + "currency": "USDT", + "minNotional": 4500000.0, + "maxNotional": 7500000.0, + "maintenanceMarginRate": 0.25, + "maxLeverage": 2.0, + "info": { + "bracket": "9", + "initialLeverage": "2", + "notionalCap": "7500000", + "notionalFloor": "4500000", + "maintMarginRatio": "0.25", + "cum": "409650.0" + } + }, + { + "tier": 10.0, + "symbol": "ZKC/USDT:USDT", + "currency": "USDT", + "minNotional": 7500000.0, + "maxNotional": 12500000.0, + "maintenanceMarginRate": 0.5, + "maxLeverage": 1.0, + "info": { + "bracket": "10", + "initialLeverage": "1", + "notionalCap": "12500000", + "notionalFloor": "7500000", + "maintMarginRatio": "0.5", + "cum": "2284650.0" + } + } + ], "ZKJ/USDT:USDT": [ { "tier": 1.0, @@ -87093,15 +90800,15 @@ "currency": "USDT", "minNotional": 5000.0, "maxNotional": 10000.0, - "maintenanceMarginRate": 0.02, - "maxLeverage": 25.0, + "maintenanceMarginRate": 0.025, + "maxLeverage": 20.0, "info": { "bracket": "2", - "initialLeverage": "25", + "initialLeverage": "20", "notionalCap": "10000", "notionalFloor": "5000", - "maintMarginRatio": "0.02", - "cum": "25.0" + "maintMarginRatio": "0.025", + "cum": "50.0" } }, { @@ -87109,71 +90816,54 @@ "symbol": "ZRC/USDT:USDT", "currency": "USDT", "minNotional": 10000.0, - "maxNotional": 25000.0, - "maintenanceMarginRate": 0.025, - "maxLeverage": 20.0, + "maxNotional": 20000.0, + "maintenanceMarginRate": 0.05, + "maxLeverage": 10.0, "info": { "bracket": "3", - "initialLeverage": "20", - "notionalCap": "25000", + "initialLeverage": "10", + "notionalCap": "20000", "notionalFloor": "10000", - "maintMarginRatio": "0.025", - "cum": "75.0" + "maintMarginRatio": "0.05", + "cum": "300.0" } }, { "tier": 4.0, "symbol": "ZRC/USDT:USDT", "currency": "USDT", - "minNotional": 25000.0, - "maxNotional": 62500.0, - "maintenanceMarginRate": 0.05, - "maxLeverage": 10.0, + "minNotional": 20000.0, + "maxNotional": 50000.0, + "maintenanceMarginRate": 0.1, + "maxLeverage": 5.0, "info": { "bracket": "4", - "initialLeverage": "10", - "notionalCap": "62500", - "notionalFloor": "25000", - "maintMarginRatio": "0.05", - "cum": "700.0" + "initialLeverage": "5", + "notionalCap": "50000", + "notionalFloor": "20000", + "maintMarginRatio": "0.1", + "cum": "1300.0" } }, { "tier": 5.0, "symbol": "ZRC/USDT:USDT", "currency": "USDT", - "minNotional": 62500.0, - "maxNotional": 125000.0, - "maintenanceMarginRate": 0.1, - "maxLeverage": 5.0, - "info": { - "bracket": "5", - "initialLeverage": "5", - "notionalCap": "125000", - "notionalFloor": "62500", - "maintMarginRatio": "0.1", - "cum": "3825.0" - } - }, - { - "tier": 6.0, - "symbol": "ZRC/USDT:USDT", - "currency": "USDT", - "minNotional": 125000.0, + "minNotional": 50000.0, "maxNotional": 250000.0, "maintenanceMarginRate": 0.125, "maxLeverage": 4.0, "info": { - "bracket": "6", + "bracket": "5", "initialLeverage": "4", "notionalCap": "250000", - "notionalFloor": "125000", + "notionalFloor": "50000", "maintMarginRatio": "0.125", - "cum": "6950.0" + "cum": "2550.0" } }, { - "tier": 7.0, + "tier": 6.0, "symbol": "ZRC/USDT:USDT", "currency": "USDT", "minNotional": 250000.0, @@ -87181,16 +90871,16 @@ "maintenanceMarginRate": 0.1667, "maxLeverage": 3.0, "info": { - "bracket": "7", + "bracket": "6", "initialLeverage": "3", "notionalCap": "4500000", "notionalFloor": "250000", "maintMarginRatio": "0.1667", - "cum": "17375.0" + "cum": "12975.0" } }, { - "tier": 8.0, + "tier": 7.0, "symbol": "ZRC/USDT:USDT", "currency": "USDT", "minNotional": 4500000.0, @@ -87198,16 +90888,16 @@ "maintenanceMarginRate": 0.25, "maxLeverage": 2.0, "info": { - "bracket": "8", + "bracket": "7", "initialLeverage": "2", "notionalCap": "7500000", "notionalFloor": "4500000", "maintMarginRatio": "0.25", - "cum": "392225.0" + "cum": "387825.0" } }, { - "tier": 9.0, + "tier": 8.0, "symbol": "ZRC/USDT:USDT", "currency": "USDT", "minNotional": 7500000.0, @@ -87215,12 +90905,12 @@ "maintenanceMarginRate": 0.5, "maxLeverage": 1.0, "info": { - "bracket": "9", + "bracket": "8", "initialLeverage": "1", "notionalCap": "12500000", "notionalFloor": "7500000", "maintMarginRatio": "0.5", - "cum": "2267225.0" + "cum": "2262825.0" } } ], diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index e3fbde459..57e1352a0 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -73,6 +73,7 @@ from freqtrade.exchange.exchange_types import ( CcxtOrder, CcxtPosition, FtHas, + FundingRate, OHLCVResponse, OrderBook, Ticker, @@ -137,6 +138,7 @@ class Exchange: "ohlcv_has_history": True, # Some exchanges (Kraken) don't provide history via ohlcv "ohlcv_partial_candle": True, "ohlcv_require_since": False, + "download_data_parallel_quick": True, "always_require_api_keys": False, # purge API keys for Dry-run. Must default to false. # Check https://github.com/ccxt/ccxt/issues/10767 for removal of ohlcv_volume_currency "ohlcv_volume_currency": "base", # "base" or "quote" @@ -164,6 +166,7 @@ class Exchange: "proxy_coin_mapping": {}, # Mapping for proxy coins # Expected to be in the format {"fetchOHLCV": True} or {"fetchOHLCV": False} "ws_enabled": False, # Set to true for exchanges with tested websocket support + "has_delisting": False, # Set to true for exchanges that have delisting pair checks } _ft_has: FtHas = {} _ft_has_futures: FtHas = {} @@ -690,12 +693,13 @@ class Exchange: # Reload async markets, then assign them to sync api retrier(self._load_async_markets, retries=retries)(reload=True) self._markets = self._api_async.markets - self._api.set_markets(self._api_async.markets, self._api_async.currencies) + self._api.set_markets_from_exchange(self._api_async) # Assign options array, as it contains some temporary information from the exchange. + # TODO: investigate with ccxt if it's safe to remove `.options` self._api.options = self._api_async.options if self._exchange_ws: # Set markets to avoid reloading on websocket api - self._ws_async.set_markets(self._api.markets, self._api.currencies) + self._ws_async.set_markets_from_exchange(self._api_async) self._ws_async.options = self._api.options self._last_markets_refresh = dt_ts() @@ -890,6 +894,19 @@ class Exchange: f"Freqtrade does not support '{mm_value}' '{trading_mode}' on {self.name}." ) + @classmethod + def combine_ft_has(cls, include_futures: bool) -> FtHas: + """ + Combine all ft_has options from the class hierarchy. + Child classes override parent classes. + Doesn't apply overrides from the configuration. + """ + _ft_has = deep_merge_dicts(cls._ft_has, deepcopy(cls._ft_has_default)) + + if include_futures: + _ft_has = deep_merge_dicts(cls._ft_has_futures, _ft_has) + return _ft_has + def build_ft_has(self, exchange_conf: ExchangeConfig) -> None: """ Deep merge ft_has with default ft_has options @@ -897,9 +914,8 @@ class Exchange: This is called on initialization of the exchange object. It must be called before ft_has is used. """ - self._ft_has = deep_merge_dicts(self._ft_has, deepcopy(self._ft_has_default)) - if self.trading_mode == TradingMode.FUTURES: - self._ft_has = deep_merge_dicts(self._ft_has_futures, self._ft_has) + self._ft_has = self.combine_ft_has(include_futures=self.trading_mode == TradingMode.FUTURES) + if exchange_conf.get("_ft_has_params"): self._ft_has = deep_merge_dicts(exchange_conf.get("_ft_has_params"), self._ft_has) logger.info("Overriding exchange._ft_has with config params, result: %s", self._ft_has) @@ -2001,6 +2017,30 @@ class Exchange: except ccxt.BaseError as e: raise OperationalException(e) from e + @retrier + def fetch_funding_rate(self, pair: str) -> FundingRate: + """ + Get current Funding rate from exchange. + On Futures markets, this is the interest rate for holding a position. + Won't work for non-futures markets + """ + try: + if pair not in self.markets or self.markets[pair].get("active", False) is False: + raise ExchangeError(f"Pair {pair} not available") + return self._api.fetch_funding_rate(pair) + except ccxt.NotSupported as e: + raise OperationalException( + f"Exchange {self._api.name} does not support fetching funding rate. Message: {e}" + ) from e + except ccxt.DDoSProtection as e: + raise DDosProtection(e) from e + except (ccxt.OperationFailed, ccxt.ExchangeError) as e: + raise TemporaryError( + f"Could not get funding rate due to {e.__class__.__name__}. Message: {e}" + ) from e + except ccxt.BaseError as e: + raise OperationalException(e) from e + @staticmethod def get_next_limit_in_list( limit: int, @@ -2456,7 +2496,14 @@ class Exchange: data.extend(new_data) # Sort data again after extending the result - above calls return in "async order" data = sorted(data, key=lambda x: x[0]) - return pair, timeframe, candle_type, data, self._ohlcv_partial_candle + return ( + pair, + timeframe, + candle_type, + data, + # funding_rates are always complete, so never need to be dropped. + self._ohlcv_partial_candle if candle_type != CandleType.FUNDING_RATE else False, + ) def _try_build_from_websocket( self, pair: str, timeframe: str, candle_type: CandleType @@ -2566,14 +2613,24 @@ class Exchange: input_coroutines: list[Coroutine[Any, Any, OHLCVResponse]] = [] cached_pairs = [] for pair, timeframe, candle_type in set(pair_list): - if timeframe not in self.timeframes and candle_type in ( + invalid_funding = ( + candle_type == CandleType.FUNDING_RATE + and timeframe != self.get_option("funding_fee_timeframe") + ) + invalid_timeframe = timeframe not in self.timeframes and candle_type in ( CandleType.SPOT, CandleType.FUTURES, - ): + ) + if invalid_timeframe or invalid_funding: + timeframes_ = ( + ", ".join(self.timeframes) + if candle_type != CandleType.FUNDING_RATE + else self.get_option("funding_fee_timeframe") + ) logger.warning( - f"Cannot download ({pair}, {timeframe}) combination as this timeframe is " - f"not available on {self.name}. Available timeframes are " - f"{', '.join(self.timeframes)}." + f"Cannot download ({pair}, {timeframe}, {candle_type}) combination as this " + f"timeframe is not available on {self.name}. Available timeframes are " + f"{timeframes_}." ) continue @@ -2756,7 +2813,7 @@ class Exchange: timeframe, candle_type=candle_type, since_ms=since_ms ) - if candle_type and candle_type != CandleType.SPOT: + if candle_type and candle_type not in (CandleType.SPOT, CandleType.FUTURES): params.update({"price": candle_type.value}) if candle_type != CandleType.FUNDING_RATE: data = await self._api_async.fetch_ohlcv( @@ -2771,8 +2828,6 @@ class Exchange: since_ms=since_ms, ) # Some exchanges sort OHLCV in ASC order and others in DESC. - # Ex: Bittrex returns the list of OHLCV in ASC order (oldest first, newest last) - # while GDAX returns the list of OHLCV in DESC order (newest first, oldest last) # Only sort if necessary to save computing time try: if data and data[0][0] > data[-1][0]: @@ -2781,7 +2836,14 @@ class Exchange: logger.exception("Error loading %s. Result was %s.", pair, data) return pair, timeframe, candle_type, [], self._ohlcv_partial_candle logger.debug("Done fetching pair %s, %s interval %s...", pair, candle_type, timeframe) - return pair, timeframe, candle_type, data, self._ohlcv_partial_candle + return ( + pair, + timeframe, + candle_type, + data, + # funding_rates are always complete, so never need to be dropped. + self._ohlcv_partial_candle if candle_type != CandleType.FUNDING_RATE else False, + ) except ccxt.NotSupported as e: raise OperationalException( @@ -3229,7 +3291,7 @@ class Exchange: for sig in [signal.SIGINT, signal.SIGTERM]: try: self.loop.add_signal_handler(sig, task.cancel) - except NotImplementedError: + except (NotImplementedError, RuntimeError): # Not all platforms implement signals (e.g. windows) pass return self.loop.run_until_complete(task) @@ -3863,3 +3925,14 @@ class Exchange: # describes the min amt for a tier, and the lowest tier will always go down to 0 else: raise ExchangeError(f"Cannot get maintenance ratio using {self.name}") + + def check_delisting_time(self, pair: str) -> datetime | None: + """ + Check if the pair gonna be delisted. + This function should be overridden by the exchange class if the exchange + provides such information. + By default, it returns None. + :param pair: Market symbol + :return: Datetime if the pair gonna be delisted, None otherwise + """ + return None diff --git a/freqtrade/exchange/exchange_types.py b/freqtrade/exchange/exchange_types.py index d31863307..d2c2b46e2 100644 --- a/freqtrade/exchange/exchange_types.py +++ b/freqtrade/exchange/exchange_types.py @@ -1,5 +1,8 @@ from typing import Any, Literal, TypedDict +# Re-export for easier use +from ccxt.base.types import FundingRate # noqa: F401 + from freqtrade.enums import CandleType @@ -25,6 +28,8 @@ class FtHas(TypedDict, total=False): ohlcv_volume_currency: str ohlcv_candle_limit_per_timeframe: dict[str, int] always_require_api_keys: bool + # allow disabling of parallel download-data for specific exchanges + download_data_parallel_quick: bool # Tickers tickers_have_quoteVolume: bool tickers_have_percentage: bool @@ -58,6 +63,9 @@ class FtHas(TypedDict, total=False): # Websocket control ws_enabled: bool + # Delisting check + has_delisting: bool + class Ticker(TypedDict): symbol: str diff --git a/freqtrade/exchange/hyperliquid.py b/freqtrade/exchange/hyperliquid.py index a880a60df..74f7c5694 100644 --- a/freqtrade/exchange/hyperliquid.py +++ b/freqtrade/exchange/hyperliquid.py @@ -28,6 +28,7 @@ class Hyperliquid(Exchange): "stoploss_on_exchange": False, "exchange_has_overrides": {"fetchTrades": False}, "marketOrderRequiresPrice": True, + "download_data_parallel_quick": False, "ws_enabled": True, } _ft_has_futures: FtHas = { diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index 1b881366e..847f8a284 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -65,15 +65,22 @@ class Okx(Exchange): """ Exchange ohlcv candle limit OKX has the following behaviour: - * 300 candles for up-to-date data - * 100 candles for historic data - * 100 candles for additional candles (not futures or spot). + * spot and futures: + * 300 candles for regular candles + * mark and premium-index: + * 300 candles for up-to-date data + * 100 candles for historic data + * additional data: + * 100 candles for additional candles :param timeframe: Timeframe to check :param candle_type: Candle-type :param since_ms: Starting timestamp :return: Candle limit as integer """ - if candle_type in (CandleType.FUTURES, CandleType.SPOT) and ( + if candle_type in (CandleType.FUTURES, CandleType.SPOT): + return 300 + + if candle_type in (CandleType.MARK, CandleType.PREMIUMINDEX) and ( not since_ms or since_ms > (date_minus_candles(timeframe, 300).timestamp() * 1000) ): return 300 diff --git a/freqtrade/freqai/base_models/BaseRegressionModel.py b/freqtrade/freqai/base_models/BaseRegressionModel.py index 495ee5e39..75958f4c9 100644 --- a/freqtrade/freqai/base_models/BaseRegressionModel.py +++ b/freqtrade/freqai/base_models/BaseRegressionModel.py @@ -6,6 +6,7 @@ import numpy as np import numpy.typing as npt from pandas import DataFrame +from freqtrade.exceptions import DependencyException from freqtrade.freqai.data_kitchen import FreqaiDataKitchen from freqtrade.freqai.freqai_interface import IFreqaiModel @@ -63,12 +64,19 @@ class BaseRegressionModel(IFreqaiModel): dd["train_labels"], _, _ = dk.label_pipeline.fit_transform(dd["train_labels"]) if self.freqai_info.get("data_split_parameters", {}).get("test_size", 0.1) != 0: - (dd["test_features"], dd["test_labels"], dd["test_weights"]) = ( - dk.feature_pipeline.transform( - dd["test_features"], dd["test_labels"], dd["test_weights"] + if dd["test_labels"].shape[0] == 0: + raise DependencyException( + f"{pair}: test set is empty after filtering. " + f"This is usually caused by overly strict SVM thresholds or insufficient data. " + f"Try reducing 'test_size' or relaxing your SVM conditions." ) - ) - dd["test_labels"], _, _ = dk.label_pipeline.transform(dd["test_labels"]) + else: + (dd["test_features"], dd["test_labels"], dd["test_weights"]) = ( + dk.feature_pipeline.transform( + dd["test_features"], dd["test_labels"], dd["test_weights"] + ) + ) + dd["test_labels"], _, _ = dk.label_pipeline.transform(dd["test_labels"]) logger.info( f"Training model on {len(dk.data_dictionary['train_features'].columns)} features" diff --git a/freqtrade/ft_types/plot_annotation_type.py b/freqtrade/ft_types/plot_annotation_type.py index 4da4102c4..e95586a70 100644 --- a/freqtrade/ft_types/plot_annotation_type.py +++ b/freqtrade/ft_types/plot_annotation_type.py @@ -13,6 +13,7 @@ class AnnotationType(TypedDict, total=False): y_end: float color: str label: str + z_level: int AnnotationTypeTA = TypeAdapter(AnnotationType) diff --git a/freqtrade/optimize/analysis/lookahead_helpers.py b/freqtrade/optimize/analysis/lookahead_helpers.py index 8c5ce6cb4..c9434c3d8 100644 --- a/freqtrade/optimize/analysis/lookahead_helpers.py +++ b/freqtrade/optimize/analysis/lookahead_helpers.py @@ -145,9 +145,19 @@ class LookaheadAnalysisSubFunctions: config["enable_protections"] = False logger.info( "Protections were enabled. " - "Disabling protections now " - "since they could otherwise produce false positives." + "Disabling protections now since they can produce false positives." ) + if not config.get("lookahead_allow_limit_orders", False): + logger.info("Forced order_types to market orders.") + config["order_types"] = { + "entry": "market", + "exit": "market", + "stoploss": "market", + "stoploss_on_exchange": False, + } + else: + logger.info("Using configured order_types, skipping order_types override.") + if config["targeted_trade_amount"] < config["minimum_trade_amount"]: # this combo doesn't make any sense. raise OperationalException( diff --git a/freqtrade/optimize/analysis/recursive.py b/freqtrade/optimize/analysis/recursive.py index b65be6b4d..7e8e39f5a 100644 --- a/freqtrade/optimize/analysis/recursive.py +++ b/freqtrade/optimize/analysis/recursive.py @@ -37,10 +37,12 @@ class RecursiveAnalysis(BaseAnalysis): self.dict_recursive: dict[str, Any] = dict() + self.pair_to_used: str | None = None + # For recursive bias check # analyzes two data frames with processed indicators and shows differences between them. def analyze_indicators(self): - pair_to_check = self.local_config["pairs"][0] + pair_to_check = self.pair_to_used logger.info("Start checking for recursive bias") # check and report signals @@ -85,7 +87,7 @@ class RecursiveAnalysis(BaseAnalysis): # For lookahead bias check # analyzes two data frames with processed indicators and shows differences between them. def analyze_indicators_lookahead(self): - pair_to_check = self.local_config["pairs"][0] + pair_to_check = self.pair_to_used logger.info("Start checking for lookahead bias on indicators only") part = self.partial_varHolder_lookahead_array[0] @@ -138,7 +140,13 @@ class RecursiveAnalysis(BaseAnalysis): backtesting = Backtesting(prepare_data_config, self.exchange) self.exchange = backtesting.exchange + if self.pair_to_used is None: + self.pair_to_used = backtesting.pairlists.whitelist[0] + logger.info( + f"Using pair {self.pair_to_used} only for recursive analysis. Replacing whitelist." + ) self.local_config["candle_type_def"] = prepare_data_config["candle_type_def"] + backtesting.pairlists._whitelist = [self.pair_to_used] backtesting._set_strategy(backtesting.strategylist[0]) strat = backtesting.strategy diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index 65b4baff2..30c0e745c 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -211,6 +211,7 @@ class Backtesting: self._can_short = self.trading_mode != TradingMode.SPOT self._position_stacking: bool = self.config.get("position_stacking", False) self.enable_protections: bool = self.config.get("enable_protections", False) + self.dynamic_pairlist: bool = self.config.get("enable_dynamic_pairlist", False) migrate_data(config, self.exchange) self.init_backtest() @@ -966,7 +967,7 @@ class Backtesting: ) ) - def get_valid_price_and_stake( + def get_valid_entry_price_and_stake( self, pair: str, row: tuple, @@ -1089,18 +1090,20 @@ class Backtesting: stake_amount_ = stake_amount or (trade.stake_amount if trade else 0.0) precision_price, precision_mode_price = self.get_pair_precision(pair, current_time) - propose_rate, stake_amount, leverage, min_stake_amount = self.get_valid_price_and_stake( - pair, - row, - row[OPEN_IDX], - stake_amount_, - direction, - current_time, - entry_tag, - trade, - order_type, - precision_price, - precision_mode_price, + propose_rate, stake_amount, leverage, min_stake_amount = ( + self.get_valid_entry_price_and_stake( + pair, + row, + row[OPEN_IDX], + stake_amount_, + direction, + current_time, + entry_tag, + trade, + order_type, + precision_price, + precision_mode_price, + ) ) # replace proposed rate if another rate was requested @@ -1582,6 +1585,11 @@ class Backtesting: for current_time in self._time_generator(start_date, end_date): # Loop for each main candle. self.check_abort() + + if self.dynamic_pairlist and self.pairlists: + self.pairlists.refresh_pairlist() + pairs = self.pairlists.whitelist + # Reset open trade count for this candle # Critical to avoid exceeding max_open_trades in backtesting # when timeframe-detail is used and trades close within the opening candle. diff --git a/freqtrade/plugins/pairlist/DelistFilter.py b/freqtrade/plugins/pairlist/DelistFilter.py new file mode 100644 index 000000000..d4a3ce90b --- /dev/null +++ b/freqtrade/plugins/pairlist/DelistFilter.py @@ -0,0 +1,95 @@ +""" +Delist pair list filter +""" + +import logging +from datetime import UTC, datetime, timedelta + +from freqtrade.exceptions import ConfigurationError +from freqtrade.exchange.exchange_types import Ticker +from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting +from freqtrade.util import format_date + + +logger = logging.getLogger(__name__) + + +class DelistFilter(IPairList): + supports_backtesting = SupportsBacktesting.NO + + def __init__(self, *args, **kwargs) -> None: + super().__init__(*args, **kwargs) + + self._max_days_from_now = self._pairlistconfig.get("max_days_from_now", 0) + if self._max_days_from_now < 0: + raise ConfigurationError("DelistFilter requires max_days_from_now to be >= 0") + if not self._exchange._ft_has["has_delisting"]: + raise ConfigurationError( + "DelistFilter doesn't support this exchange and trading mode combination.", + ) + + @property + def needstickers(self) -> bool: + """ + Boolean property defining if tickers are necessary. + If no Pairlist requires tickers, an empty Dict is passed + as tickers argument to filter_pairlist + """ + return False + + def short_desc(self) -> str: + """ + Short whitelist method description - used for startup-messages + """ + return ( + f"{self.name} - Filtering pairs that will be delisted" + + ( + f" in the next {self._max_days_from_now} days" + if self._max_days_from_now > 0 + else "" + ) + + "." + ) + + @staticmethod + def description() -> str: + return "Filter pairs that will be delisted on exchange." + + @staticmethod + def available_parameters() -> dict[str, PairlistParameter]: + return { + "max_days_from_now": { + "type": "number", + "default": 0, + "description": "Max days from now", + "help": ( + "Remove pairs that will be delisted in the next X days. Set to 0 to remove all." + ), + }, + } + + def _validate_pair(self, pair: str, ticker: Ticker | None) -> bool: + """ + Check if pair will be delisted. + :param pair: Pair that's currently validated + :param ticker: ticker dict as returned from ccxt.fetch_ticker + :return: True if the pair can stay, false if it should be removed + """ + delist_date = self._exchange.check_delisting_time(pair) + + if delist_date is not None: + remove_pair = self._max_days_from_now == 0 + if self._max_days_from_now > 0: + current_datetime = datetime.now(UTC) + max_delist_date = current_datetime + timedelta(days=self._max_days_from_now) + remove_pair = delist_date <= max_delist_date + + if remove_pair: + self.log_once( + f"Removed {pair} from whitelist, because it will be delisted on " + f"{format_date(delist_date)}.", + logger.info, + ) + return False + + return True diff --git a/freqtrade/plugins/pairlist/ShuffleFilter.py b/freqtrade/plugins/pairlist/ShuffleFilter.py index be536e705..86d618160 100644 --- a/freqtrade/plugins/pairlist/ShuffleFilter.py +++ b/freqtrade/plugins/pairlist/ShuffleFilter.py @@ -93,6 +93,8 @@ class ShuffleFilter(IPairList): return pairlist_new # Shuffle is done inplace self._random.shuffle(pairlist) - self.__pairlist_cache[pairlist_bef] = pairlist + + if self._config.get("runmode") in (RunMode.LIVE, RunMode.DRY_RUN): + self.__pairlist_cache[pairlist_bef] = pairlist return pairlist diff --git a/freqtrade/plugins/pairlist/StaticPairList.py b/freqtrade/plugins/pairlist/StaticPairList.py index bff2105b3..94ba04235 100644 --- a/freqtrade/plugins/pairlist/StaticPairList.py +++ b/freqtrade/plugins/pairlist/StaticPairList.py @@ -7,6 +7,9 @@ Provides pair white list as it configured in config import logging from copy import deepcopy +from cachetools import LRUCache + +from freqtrade.enums import RunMode from freqtrade.exchange.exchange_types import Tickers from freqtrade.plugins.pairlist.IPairList import IPairList, PairlistParameter, SupportsBacktesting @@ -22,6 +25,8 @@ class StaticPairList(IPairList): super().__init__(*args, **kwargs) self._allow_inactive = self._pairlistconfig.get("allow_inactive", False) + # Pair cache - only used for optimize modes + self._bt_pair_cache: LRUCache = LRUCache(maxsize=1) @property def needstickers(self) -> bool: @@ -60,15 +65,23 @@ class StaticPairList(IPairList): :param tickers: Tickers (from exchange.get_tickers). May be cached. :return: List of pairs """ - wl = self.verify_whitelist( - self._config["exchange"]["pair_whitelist"], logger.info, keep_invalid=True - ) - if self._allow_inactive: - return wl - else: - # Avoid implicit filtering of "verify_whitelist" to keep - # proper warnings in the log - return self._whitelist_for_active_markets(wl) + pairlist = self._bt_pair_cache.get("pairlist") + + if not pairlist: + wl = self.verify_whitelist( + self._config["exchange"]["pair_whitelist"], logger.info, keep_invalid=True + ) + if self._allow_inactive: + pairlist = wl + else: + # Avoid implicit filtering of "verify_whitelist" to keep + # proper warnings in the log + pairlist = self._whitelist_for_active_markets(wl) + + if self._config["runmode"] in (RunMode.BACKTEST, RunMode.HYPEROPT): + self._bt_pair_cache["pairlist"] = pairlist.copy() + + return pairlist def filter_pairlist(self, pairlist: list[str], tickers: Tickers) -> list[str]: """ diff --git a/freqtrade/plugins/pairlist/VolumePairList.py b/freqtrade/plugins/pairlist/VolumePairList.py index 63de5ad2d..7e7fa7601 100644 --- a/freqtrade/plugins/pairlist/VolumePairList.py +++ b/freqtrade/plugins/pairlist/VolumePairList.py @@ -247,7 +247,6 @@ class VolumePairList(IPairList): * 1000 ) - # todo: utc date output for starting date self.log_once( f"Using volume range of {self._lookback_period} candles, timeframe: " f"{self._lookback_timeframe}, starting from {format_ms_time(since_ms)} " diff --git a/freqtrade/plugins/pairlistmanager.py b/freqtrade/plugins/pairlistmanager.py index bc66d00c3..9056d842e 100644 --- a/freqtrade/plugins/pairlistmanager.py +++ b/freqtrade/plugins/pairlistmanager.py @@ -5,7 +5,7 @@ PairList manager class import logging from functools import partial -from cachetools import TTLCache, cached +from cachetools import LRUCache, TTLCache, cached from freqtrade.constants import Config, ListPairsWithTimeframes from freqtrade.data.dataprovider import DataProvider @@ -56,6 +56,7 @@ class PairListManager(LoggingMixin): ) self._check_backtest() + self._not_expiring_cache: LRUCache = LRUCache(maxsize=1) refresh_period = config.get("pairlist_refresh_period", 3600) LoggingMixin.__init__(self, logger, refresh_period) @@ -109,7 +110,15 @@ class PairListManager(LoggingMixin): @property def expanded_blacklist(self) -> list[str]: """The expanded blacklist (including wildcard expansion)""" - return expand_pairlist(self._blacklist, self._exchange.get_markets().keys()) + eblacklist = self._not_expiring_cache.get("eblacklist") + + if not eblacklist: + eblacklist = expand_pairlist(self._blacklist, self._exchange.get_markets().keys()) + + if self._config["runmode"] in (RunMode.BACKTEST, RunMode.HYPEROPT): + self._not_expiring_cache["eblacklist"] = eblacklist.copy() + + return eblacklist @property def name_list(self) -> list[str]: @@ -157,16 +166,17 @@ class PairListManager(LoggingMixin): :param logmethod: Function that'll be called, `logger.info` or `logger.warning`. :return: pairlist - blacklisted pairs """ - try: - blacklist = self.expanded_blacklist - except ValueError as err: - logger.error(f"Pair blacklist contains an invalid Wildcard: {err}") - return [] - log_once = partial(self.log_once, logmethod=logmethod) - for pair in pairlist.copy(): - if pair in blacklist: - log_once(f"Pair {pair} in your blacklist. Removing it from whitelist...") - pairlist.remove(pair) + if self._blacklist: + try: + blacklist = self.expanded_blacklist + except ValueError as err: + logger.error(f"Pair blacklist contains an invalid Wildcard: {err}") + return [] + log_once = partial(self.log_once, logmethod=logmethod) + for pair in pairlist.copy(): + if pair in blacklist: + log_once(f"Pair {pair} in your blacklist. Removing it from whitelist...") + pairlist.remove(pair) return pairlist def verify_whitelist( diff --git a/freqtrade/resolvers/strategy_resolver.py b/freqtrade/resolvers/strategy_resolver.py index 2a9bf27e8..47a09120d 100644 --- a/freqtrade/resolvers/strategy_resolver.py +++ b/freqtrade/resolvers/strategy_resolver.py @@ -87,7 +87,7 @@ class StrategyResolver(IResolver): # Loop this list again to have output combined for attribute, _ in attributes: if attribute in config: - logger.info("Strategy using %s: %s", attribute, config[attribute]) + logger.info(f"Strategy using {attribute}: {config[attribute]}") StrategyResolver._normalize_attributes(strategy) @@ -109,9 +109,8 @@ class StrategyResolver(IResolver): # Ensure Properties are not overwritten setattr(strategy, attribute, config[attribute]) logger.info( - "Override strategy '%s' with value in config file: %s.", - attribute, - config[attribute], + f"Override strategy '{attribute}' with value from the configuration: " + f"{config[attribute]}.", ) elif hasattr(strategy, attribute): val = getattr(strategy, attribute) diff --git a/freqtrade/rpc/api_server/api_backtest.py b/freqtrade/rpc/api_server/api_backtest.py index b553bc1fa..713c6f400 100644 --- a/freqtrade/rpc/api_server/api_backtest.py +++ b/freqtrade/rpc/api_server/api_backtest.py @@ -63,7 +63,7 @@ def __run_backtest_bg(btconfig: Config): ApiBG.bt["bt"] = Backtesting(btconfig) else: - ApiBG.bt["bt"].config = btconfig + ApiBG.bt["bt"].config = deep_merge_dicts(btconfig, ApiBG.bt["bt"].config) ApiBG.bt["bt"].init_backtest() # Only reload data if timeframe changed. if ( diff --git a/freqtrade/rpc/api_server/api_download_data.py b/freqtrade/rpc/api_server/api_download_data.py index b8c14ea13..6e446b063 100644 --- a/freqtrade/rpc/api_server/api_download_data.py +++ b/freqtrade/rpc/api_server/api_download_data.py @@ -57,7 +57,8 @@ def pairlists_evaluate( config_loc = deepcopy(config) config_loc["stake_currency"] = "" config_loc["pairs"] = payload.pairs - config_loc["timerange"] = payload.timerange + if payload.timerange: + config_loc["timerange"] = payload.timerange config_loc["days"] = payload.days config_loc["timeframes"] = payload.timeframes config_loc["erase"] = payload.erase diff --git a/freqtrade/rpc/api_server/api_schemas.py b/freqtrade/rpc/api_server/api_schemas.py index dfc78daf6..601c52392 100644 --- a/freqtrade/rpc/api_server/api_schemas.py +++ b/freqtrade/rpc/api_server/api_schemas.py @@ -229,6 +229,7 @@ class ShowConfig(BaseModel): api_version: float dry_run: bool trading_mode: str + margin_mode: str short_allowed: bool stake_currency: str stake_amount: str diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index 868b10d7d..7a51cc112 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -136,6 +136,7 @@ class RPC: "strategy_version": strategy_version, "dry_run": config["dry_run"], "trading_mode": config.get("trading_mode", "spot"), + "margin_mode": config.get("margin_mode", ""), "short_allowed": config.get("trading_mode", "spot") != "spot", "stake_currency": config["stake_currency"], "stake_currency_decimals": decimals_per_coin(config["stake_currency"]), diff --git a/freqtrade/rpc/telegram.py b/freqtrade/rpc/telegram.py index f19217dae..cdce0c1e2 100644 --- a/freqtrade/rpc/telegram.py +++ b/freqtrade/rpc/telegram.py @@ -360,11 +360,9 @@ class Telegram(RPCHandler): await asyncio.sleep(2) if self._app.updater: await self._app.updater.start_polling( - bootstrap_retries=-1, + bootstrap_retries=10, timeout=20, - # read_latency=60, # Assumed transmission latency drop_pending_updates=True, - # stop_signals=[], # Necessary as we don't run on the main thread ) while True: await asyncio.sleep(10) diff --git a/freqtrade/rpc/webhook.py b/freqtrade/rpc/webhook.py index eb9aa37c8..d39c378dc 100644 --- a/freqtrade/rpc/webhook.py +++ b/freqtrade/rpc/webhook.py @@ -49,7 +49,7 @@ class Webhook(RPCHandler): if msg["type"].value in whconfig: # Explicit types should have priority valuedict = whconfig.get(msg["type"].value) - # Deprecated 2022.10 - only keep generic method. + # The below is deprecated 2022.10 - only keep generic method. elif msg["type"] in [RPCMessageType.ENTRY]: valuedict = whconfig.get("webhookentry") elif msg["type"] in [RPCMessageType.ENTRY_CANCEL]: @@ -81,6 +81,20 @@ class Webhook(RPCHandler): return None return valuedict + def recursive_format(self, obj: dict | list | str, msg: RPCSendMsg): + """ + Format the given object using the provided message. + """ + match obj: + case dict(): + return {k: self.recursive_format(v, msg) for k, v in obj.items()} + case list(): + return [self.recursive_format(item, msg) for item in obj] + case str(): + return obj.format(**msg) + case _: + return obj + def send_msg(self, msg: RPCSendMsg) -> None: """Send a message to telegram channel""" try: @@ -90,7 +104,7 @@ class Webhook(RPCHandler): logger.debug("Message type '%s' not configured for webhooks", msg["type"]) return - payload = {key: value.format(**msg) for (key, value) in valuedict.items()} + payload = self.recursive_format(valuedict, msg) self._send_msg(payload) except KeyError as exc: logger.exception( diff --git a/freqtrade/strategy/informative_decorator.py b/freqtrade/strategy/informative_decorator.py index 69cf6f0ce..ac9a2a1ad 100644 --- a/freqtrade/strategy/informative_decorator.py +++ b/freqtrade/strategy/informative_decorator.py @@ -100,7 +100,7 @@ def _create_and_merge_informative_pair( dataframe: DataFrame, metadata: dict, inf_data: InformativeData, - populate_indicators: PopulateIndicators, + populate_indicators_fn: PopulateIndicators, ): asset = inf_data.asset or "" timeframe = inf_data.timeframe @@ -133,7 +133,12 @@ def _create_and_merge_informative_pair( inf_metadata = {"pair": asset, "timeframe": timeframe} inf_dataframe = strategy.dp.get_pair_dataframe(asset, timeframe, candle_type) - inf_dataframe = populate_indicators(strategy, inf_dataframe, inf_metadata) + if inf_dataframe.empty: + raise ValueError( + f"Informative dataframe for ({asset}, {timeframe}, {candle_type}) is empty. " + "Can't populate informative indicators." + ) + inf_dataframe = populate_indicators_fn(strategy, inf_dataframe, inf_metadata) formatter: Any = None if callable(fmt): diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index c863a8392..7ac196dba 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -11,6 +11,7 @@ from math import isinf, isnan from pandas import DataFrame from pydantic import ValidationError +from freqtrade.configuration import TimeRange 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 @@ -40,7 +41,7 @@ from freqtrade.strategy.informative_decorator import ( ) from freqtrade.strategy.strategy_validation import StrategyResultValidator from freqtrade.strategy.strategy_wrapper import strategy_safe_wrapper -from freqtrade.util import dt_now +from freqtrade.util import dt_now, dt_ts from freqtrade.wallets import Wallets @@ -151,7 +152,7 @@ class IStrategy(ABC, HyperStrategyMixin): def __init__(self, config: Config) -> None: self.config = config # Dict to determine if analysis is necessary - self._last_candle_seen_per_pair: dict[str, datetime] = {} + self.__last_candle_seen_per_pair: dict[str, datetime] = {} super().__init__(config) # Gather informative pairs from @informative-decorated methods. @@ -1208,14 +1209,14 @@ class IStrategy(ABC, HyperStrategyMixin): """ pair = str(metadata.get("pair")) - new_candle = self._last_candle_seen_per_pair.get(pair, None) != dataframe.iloc[-1]["date"] + new_candle = self.__last_candle_seen_per_pair.get(pair, None) != dataframe.iloc[-1]["date"] # Test if seen this pair and last candle before. # always run if process_only_new_candles is set to false if not self.process_only_new_candles or new_candle: # Defs that only make change on new candle data. dataframe = self.analyze_ticker(dataframe, metadata) - self._last_candle_seen_per_pair[pair] = dataframe.iloc[-1]["date"] + self.__last_candle_seen_per_pair[pair] = dataframe.iloc[-1]["date"] candle_type = self.config.get("candle_type_def", CandleType.SPOT) self.dp._set_cached_df(pair, self.timeframe, dataframe, candle_type=candle_type) @@ -1767,9 +1768,16 @@ class IStrategy(ABC, HyperStrategyMixin): use_public_trades = self.config.get("exchange", {}).get("use_public_trades", False) if use_public_trades: pair = metadata["pair"] - trades = self.dp.trades(pair=pair, copy=False) + # Build timerange from dataframe date column + if not dataframe.empty: + start_ts = dt_ts(dataframe["date"].iloc[0]) + end_ts = dt_ts(dataframe["date"].iloc[-1]) + timerange = TimeRange("date", "date", startts=start_ts, stopts=end_ts) + else: + timerange = None + + trades = self.dp.trades(pair=pair, copy=False, timerange=timerange) - # 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( cached_grouped_trades, self.config, dataframe, trades diff --git a/freqtrade/util/formatters.py b/freqtrade/util/formatters.py index fa656f52b..caac5a68b 100644 --- a/freqtrade/util/formatters.py +++ b/freqtrade/util/formatters.py @@ -78,5 +78,5 @@ def format_duration(td: timedelta) -> str: """ d = td.days h, r = divmod(td.seconds, 3600) - m, s = divmod(r, 60) + m, _ = divmod(r, 60) return f"{d}d {h:02d}:{m:02d}" diff --git a/ft_client/freqtrade_client/__init__.py b/ft_client/freqtrade_client/__init__.py index 90edc4f76..d4f8c1d20 100644 --- a/ft_client/freqtrade_client/__init__.py +++ b/ft_client/freqtrade_client/__init__.py @@ -1,7 +1,7 @@ from freqtrade_client.ft_rest_client import FtRestClient -__version__ = "2025.8" +__version__ = "2025.9" if "dev" in __version__: from pathlib import Path diff --git a/pyproject.toml b/pyproject.toml index 24aadb26d..4bac06296 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,7 @@ classifiers = [ dependencies = [ # from requirements.txt - "ccxt>=4.4.87", + "ccxt>=4.5.4", "SQLAlchemy>=2.0.6", "python-telegram-bot>=20.1", "humanize>=4.0.0", @@ -224,7 +224,7 @@ exclude = [ ] ignore = ["freqtrade/vendor/**"] pythonPlatform = "All" -pythonVersion = "3.9" +pythonVersion = "3.11" typeCheckingMode = "off" # analyzeUnannotatedFunctions = false diff --git a/requirements-dev.txt b/requirements-dev.txt index d09a530f5..5a2c3c4f4 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -6,13 +6,13 @@ -r requirements-freqai-rl.txt -r docs/requirements-docs.txt -ruff==0.12.10 -mypy==1.17.1 +ruff==0.13.1 +mypy==1.18.2 pre-commit==4.3.0 -pytest==8.4.1 -pytest-asyncio==1.1.0 -pytest-cov==6.2.1 -pytest-mock==3.14.1 +pytest==8.4.2 +pytest-asyncio==1.2.0 +pytest-cov==7.0.0 +pytest-mock==3.15.1 pytest-random-order==1.2.0 pytest-timeout==2.4.0 pytest-xdist==3.8.0 @@ -24,9 +24,9 @@ time-machine==2.19.0 nbconvert==7.16.6 # mypy types -scipy-stubs==1.16.1.1 # keep in sync with `scipy` in `requirements-hyperopt.txt` -types-cachetools==6.1.0.20250717 +scipy-stubs==1.16.2.0 # keep in sync with `scipy` in `requirements-hyperopt.txt` +types-cachetools==6.2.0.20250827 types-filelock==3.2.7 -types-requests==2.32.4.20250809 +types-requests==2.32.4.20250913 types-tabulate==0.9.0.20241207 types-python-dateutil==2.9.0.20250822 diff --git a/requirements-freqai.txt b/requirements-freqai.txt index 15a03d7b7..059512b7b 100644 --- a/requirements-freqai.txt +++ b/requirements-freqai.txt @@ -3,10 +3,10 @@ -r requirements-plot.txt # Required for freqai -scikit-learn==1.7.1 +scikit-learn==1.7.2 joblib==1.5.2 catboost==1.2.8; 'arm' not in platform_machine lightgbm==4.6.0 -xgboost==3.0.4 +xgboost==3.0.5 tensorboard==2.20.0 datasieve==0.1.9 diff --git a/requirements-hyperopt.txt b/requirements-hyperopt.txt index 4d31f6042..a577b9c08 100644 --- a/requirements-hyperopt.txt +++ b/requirements-hyperopt.txt @@ -2,8 +2,8 @@ -r requirements.txt # Required for hyperopt -scipy==1.16.1 -scikit-learn==1.7.1 +scipy==1.16.2 +scikit-learn==1.7.2 filelock==3.19.1 optuna==4.5.0 cmaes==0.12.0 diff --git a/requirements.txt b/requirements.txt index 39bd5ded3..fe161e937 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,23 +1,21 @@ -numpy==2.3.2; platform_machine != 'armv7l' -numpy==2.2.4; platform_machine == 'armv7l' -pandas==2.3.2; platform_machine != 'armv7l' -pandas==2.2.3; platform_machine == 'armv7l' -bottleneck==1.5.0 -numexpr==2.11.0 +numpy==2.3.3 +pandas==2.3.2 +bottleneck==1.6.0 +numexpr==2.12.1 # Indicator libraries -ft-pandas-ta==0.3.15 -ta-lib==0.6.5 +ft-pandas-ta==0.3.16 +ta-lib==0.6.7 technical==1.5.3 -ccxt==4.5.2 -cryptography==45.0.6 +ccxt==4.5.5 +cryptography==46.0.1 aiohttp==3.12.15 SQLAlchemy==2.0.43 -python-telegram-bot==22.3 +python-telegram-bot==22.4 # can't be hard-pinned due to telegram-bot pinning httpx with ~ httpx>=0.24.1 -humanize==4.12.3 -cachetools==6.1.0 +humanize==4.13.0 +cachetools==6.2.0 requests==2.32.5 urllib3==2.5.0 certifi==2025.8.3 @@ -34,22 +32,22 @@ pyarrow==20.0.0; platform_machine == "aarch64" # Load ticker files 30% faster python-rapidjson==1.21 # Properly format api responses -orjson==3.11.2 +orjson==3.11.3 # Notify systemd sdnotify==0.3.2 # API Server -fastapi==0.116.1 -pydantic==2.11.7 -uvicorn==0.35.0 +fastapi==0.117.1 +pydantic==2.11.9 +uvicorn==0.36.0 pyjwt==2.10.1 aiofiles==24.1.0 -psutil==7.0.0 +psutil==7.1.0 # Building config files interactively -questionary==2.1.0 -prompt-toolkit==3.0.51 +questionary==2.1.1 +prompt-toolkit==3.0.52 # Extensions to datetime library python-dateutil==2.9.0.post0 pytz==2025.2 diff --git a/tests/commands/test_commands.py b/tests/commands/test_commands.py index f4625663a..5231d45a4 100644 --- a/tests/commands/test_commands.py +++ b/tests/commands/test_commands.py @@ -658,7 +658,9 @@ def test_start_new_strategy_no_arg(): args = [ "new-strategy", ] - with pytest.raises(OperationalException, match="`new-strategy` requires --strategy to be set."): + with pytest.raises( + OperationalException, match=r"`new-strategy` requires --strategy to be set\." + ): start_new_strategy(get_args(args)) @@ -803,7 +805,7 @@ def test_get_ui_download_url_direct(mocker): assert last_version == "0.0.1" assert x == "http://download1.zip" - with pytest.raises(ValueError, match="UI-Version not found."): + with pytest.raises(ValueError, match=r"UI-Version not found\."): x, last_version = get_ui_download_url("0.0.3", False) @@ -1650,7 +1652,7 @@ def test_hyperopt_show(mocker, capsys): pargs = get_args(args) pargs["config"] = None with pytest.raises( - OperationalException, match="The index of the epoch to show should be greater than -4." + OperationalException, match=r"The index of the epoch to show should be greater than -4\." ): start_hyperopt_show(pargs) @@ -1658,7 +1660,7 @@ def test_hyperopt_show(mocker, capsys): pargs = get_args(args) pargs["config"] = None with pytest.raises( - OperationalException, match="The index of the epoch to show should be less than 4." + OperationalException, match=r"The index of the epoch to show should be less than 4\." ): start_hyperopt_show(pargs) @@ -1831,6 +1833,39 @@ def test_start_list_trades_data(testdatadir, capsys): captured.out, ) + args = [ + "list-data", + "--datadir", + str(testdatadir), + "--trades", + "--pairs", + "XRP/ETH", + ] + pargs = get_args(args) + pargs["config"] = None + start_list_data(pargs) + captured = capsys.readouterr() + assert "Found trades data for 1 pair." in captured.out + assert re.search(r".*Pair.*Type.*\n", captured.out) + assert re.search( + r"\n.* XRP/ETH .* spot .* 2019-10-11 00:00:01 .* 2019-10-13 11:19:28 .* 12477 .*|\n", + captured.out, + ) + + args = [ + "list-data", + "--datadir", + str(testdatadir), + "--trades", + "--pairs", + "NO/PAIR", + ] + pargs = get_args(args) + pargs["config"] = None + start_list_data(pargs) + captured = capsys.readouterr() + assert "Found trades data for 0 pairs." in captured.out + args = [ "list-data", "--datadir", @@ -1999,5 +2034,7 @@ def test_start_edge(): ] pargs = get_args(args) - with pytest.raises(OperationalException, match="The Edge module has been deprecated in 2023.9"): + with pytest.raises( + OperationalException, match=r"The Edge module has been deprecated in 2023\.9" + ): start_edge(pargs) diff --git a/tests/data/test_btanalysis.py b/tests/data/test_btanalysis.py index dd85fb8bb..e7c914040 100644 --- a/tests/data/test_btanalysis.py +++ b/tests/data/test_btanalysis.py @@ -75,7 +75,7 @@ def test_get_latest_hyperopt_file(testdatadir): # Test with absolute path with pytest.raises( OperationalException, - match="--hyperopt-filename expects only the filename, not an absolute path.", + match=r"--hyperopt-filename expects only the filename, not an absolute path\.", ): get_latest_hyperopt_file(str(testdatadir.parent), str(testdatadir.parent)) @@ -344,7 +344,7 @@ def test_create_cum_profit1(testdatadir): assert cum_profits.iloc[0]["cum_profits"] == 0 assert pytest.approx(cum_profits.iloc[-1]["cum_profits"]) == 9.0225563e-05 - with pytest.raises(ValueError, match="Trade dataframe empty."): + with pytest.raises(ValueError, match=r"Trade dataframe empty\."): create_cum_profit( df.set_index("date"), bt_data[bt_data["pair"] == "NOTAPAIR"], @@ -369,10 +369,10 @@ def test_calculate_max_drawdown(testdatadir): underwater = calculate_underwater(bt_data) assert isinstance(underwater, DataFrame) - with pytest.raises(ValueError, match="Trade dataframe empty."): + with pytest.raises(ValueError, match=r"Trade dataframe empty\."): calculate_max_drawdown(DataFrame()) - with pytest.raises(ValueError, match="Trade dataframe empty."): + with pytest.raises(ValueError, match=r"Trade dataframe empty\."): calculate_underwater(DataFrame()) @@ -391,7 +391,7 @@ def test_calculate_csum(testdatadir): assert csum_min1 == csum_min + 5 assert csum_max1 == csum_max + 5 - with pytest.raises(ValueError, match="Trade dataframe empty."): + with pytest.raises(ValueError, match=r"Trade dataframe empty\."): csum_min, csum_max = calculate_csum(DataFrame()) diff --git a/tests/data/test_converter.py b/tests/data/test_converter.py index 3d6c9adc2..835f5a861 100644 --- a/tests/data/test_converter.py +++ b/tests/data/test_converter.py @@ -14,6 +14,7 @@ from freqtrade.data.converter import ( convert_trades_to_ohlcv, ohlcv_fill_up_missing_data, ohlcv_to_dataframe, + order_book_to_dataframe, reduce_dataframe_footprint, trades_df_remove_duplicates, trades_dict_to_list, @@ -49,7 +50,7 @@ def test_ohlcv_to_dataframe(ohlcv_history_list, caplog): def test_trades_to_ohlcv(trades_history_df, caplog): caplog.set_level(logging.DEBUG) - with pytest.raises(ValueError, match="Trade-list empty."): + with pytest.raises(ValueError, match=r"Trade-list empty\."): trades_to_ohlcv(pd.DataFrame(columns=trades_history_df.columns), "1m") df = trades_to_ohlcv(trades_history_df, "1m") @@ -588,3 +589,77 @@ def test_convert_trades_to_ohlcv(testdatadir, tmp_path, caplog): candle_type=CandleType.SPOT, ) assert log_has(msg, caplog) + + +def test_order_book_to_dataframe(): + bids = [ + [100.0, 5.0], + [99.5, 3.0], + [99.0, 2.0], + ] + asks = [ + [100.5, 4.0], + [101.0, 6.0], + [101.5, 1.0], + ] + + result = order_book_to_dataframe(bids, asks) + + assert isinstance(result, pd.DataFrame) + + expected_columns = ["b_sum", "b_size", "bids", "asks", "a_size", "a_sum"] + assert result.columns.tolist() == expected_columns + + assert len(result) == max(len(bids), len(asks)) + + assert result["bids"].tolist() == [100.0, 99.5, 99.0] + assert result["b_size"].tolist() == [5.0, 3.0, 2.0] + assert result["b_sum"].tolist() == [5.0, 8.0, 10.0] + + assert result["asks"].tolist() == [100.5, 101.0, 101.5] + assert result["a_size"].tolist() == [4.0, 6.0, 1.0] + assert result["a_sum"].tolist() == [4.0, 10.0, 11.0] + + +def test_order_book_to_dataframe_empty(): + bids = [] + asks = [] + + result = order_book_to_dataframe(bids, asks) + + assert isinstance(result, pd.DataFrame) + + expected_columns = ["b_sum", "b_size", "bids", "asks", "a_size", "a_sum"] + assert result.columns.tolist() == expected_columns + # Empty input should result in empty dataframe + assert len(result) == 0 + + +def test_order_book_to_dataframe_unequal_lengths(): + bids = [ + [100.0, 5.0], + [99.5, 3.0], + [99.0, 2.0], + [98.5, 1.0], + ] + asks = [ + [100.5, 4.0], + [101.0, 6.0], + ] + + result = order_book_to_dataframe(bids, asks) + + assert len(result) == max(len(bids), len(asks)) + assert len(result) == 4 + + assert result["bids"].tolist() == [100.0, 99.5, 99.0, 98.5] + assert result["b_size"].tolist() == [5.0, 3.0, 2.0, 1.0] + assert result["b_sum"].tolist() == [5.0, 8.0, 10.0, 11.0] + + assert result["asks"].tolist()[:2] == [100.5, 101.0] + # NA for missing asks + assert pd.isna(result["asks"].iloc[2]) + assert pd.isna(result["asks"].iloc[3]) + + assert result["a_size"].tolist()[:2] == [4.0, 6.0] + assert result["a_sum"].tolist()[:2] == [4.0, 10.0] diff --git a/tests/data/test_datahandler.py b/tests/data/test_datahandler.py index 98c7c65ba..bc665535f 100644 --- a/tests/data/test_datahandler.py +++ b/tests/data/test_datahandler.py @@ -506,3 +506,137 @@ def test_get_datahandler(testdatadir): assert isinstance(dh, JsonGzDataHandler) dh1 = get_datahandler(testdatadir, "jsongz", dh) assert id(dh1) == id(dh) + + +@pytest.fixture +def feather_dh(testdatadir): + return FeatherDataHandler(testdatadir) + + +@pytest.fixture +def trades_full(feather_dh): + df = feather_dh.trades_load("XRP/ETH", TradingMode.SPOT) + assert not df.empty + return df + + +@pytest.fixture +def timerange_mid(trades_full): + # Pick a mid-range window using actual timestamps + mid_start = int(trades_full["timestamp"].iloc[len(trades_full) // 3]) + mid_end = int(trades_full["timestamp"].iloc[(2 * len(trades_full)) // 3]) + return TimeRange("date", "date", startts=mid_start, stopts=mid_end) + + +def test_feather_trades_timerange_filter_fullspan(feather_dh, trades_full): + timerange_full = TimeRange( + "date", + "date", + startts=int(trades_full["timestamp"].min()), + stopts=int(trades_full["timestamp"].max()), + ) + # Full-span filter should equal unfiltered + filtered = feather_dh.trades_load("XRP/ETH", TradingMode.SPOT, timerange=timerange_full) + assert_frame_equal( + trades_full.reset_index(drop=True), filtered.reset_index(drop=True), check_exact=True + ) + + +def test_feather_trades_timerange_filter_subset(feather_dh, trades_full, timerange_mid): + # Subset filter should be a subset of the full-span filter + subset = feather_dh.trades_load("XRP/ETH", TradingMode.SPOT, timerange=timerange_mid) + assert not subset.empty + assert subset["timestamp"].min() >= timerange_mid.startts + assert subset["timestamp"].max() <= timerange_mid.stopts + assert len(subset) < len(trades_full) + + +def test_feather_trades_timerange_pushdown_fallback( + feather_dh, trades_full, timerange_mid, monkeypatch, caplog +): + # Pushdown filter should fail, so fallback should load the entire file + import freqtrade.data.history.datahandlers.featherdatahandler as fdh + + def raise_err(*args, **kwargs): + raise ValueError("fail") + + # Mock the dataset loading to raise an error + monkeypatch.setattr(fdh.dataset, "dataset", raise_err) + + with caplog.at_level("WARNING"): + out = feather_dh.trades_load("XRP/ETH", TradingMode.SPOT, timerange=timerange_mid) + + assert len(out) == len(trades_full) + assert any( + "Unable to use Arrow filtering, loading entire trades file" in r.message + for r in caplog.records + ) + + +def test_feather_trades_timerange_open_start(feather_dh, trades_full): + # Open start: stop timestamp but no start (startts=0) + stop_ts = int(trades_full["timestamp"].iloc[(2 * len(trades_full)) // 3]) + tr = TimeRange(None, "date", startts=0, stopts=stop_ts) + + filtered = feather_dh.trades_load("XRP/ETH", TradingMode.SPOT, timerange=tr) + assert 0 < len(filtered) < len(trades_full) + assert filtered["timestamp"].max() <= stop_ts + # First row should match full's first row + assert filtered.iloc[0]["timestamp"] == trades_full.iloc[0]["timestamp"] + + +def test_feather_trades_timerange_open_end(feather_dh, trades_full): + # Open end: start timestamp but no stop (stopts=0) + start_ts = int(trades_full["timestamp"].iloc[len(trades_full) // 3]) + tr = TimeRange("date", None, startts=start_ts, stopts=0) + + filtered = feather_dh.trades_load("XRP/ETH", TradingMode.SPOT, timerange=tr) + assert 0 < len(filtered) < len(trades_full) + assert filtered["timestamp"].min() >= start_ts + # Last row should match full's last row + assert filtered.iloc[-1]["timestamp"] == trades_full.iloc[-1]["timestamp"] + + +def test_feather_trades_timerange_fully_open(feather_dh, trades_full): + # Fully open: no start or stop bounds (both 0) + tr = TimeRange(None, None, startts=0, stopts=0) + + filtered = feather_dh.trades_load("XRP/ETH", TradingMode.SPOT, timerange=tr) + # Should equal unfiltered load + assert_frame_equal( + trades_full.reset_index(drop=True), filtered.reset_index(drop=True), check_exact=True + ) + + +def test_feather_build_arrow_time_filter(feather_dh): + # None timerange should return None + assert feather_dh._build_arrow_time_filter(None) is None + + # Fully open (both bounds 0) should return None + tr_fully_open = TimeRange(None, None, startts=0, stopts=0) + assert feather_dh._build_arrow_time_filter(tr_fully_open) is None + + # Open start (startts=0) should return stop filter only + tr_open_start = TimeRange(None, "date", startts=0, stopts=1000) + filter_open_start = feather_dh._build_arrow_time_filter(tr_open_start) + assert filter_open_start is not None + # Should be a single expression (timestamp <= stopts) + assert str(filter_open_start).count("<=") == 1 + assert str(filter_open_start).count(">=") == 0 + + # Open end (stopts=0) should return start filter only + tr_open_end = TimeRange("date", None, startts=500, stopts=0) + filter_open_end = feather_dh._build_arrow_time_filter(tr_open_end) + assert filter_open_end is not None + # Should be a single expression (timestamp >= startts) + assert str(filter_open_end).count(">=") == 1 + assert str(filter_open_end).count("<=") == 0 + + # Closed range should return combined filter + tr_closed = TimeRange("date", "date", startts=500, stopts=1000) + filter_closed = feather_dh._build_arrow_time_filter(tr_closed) + assert filter_closed is not None + # Should contain both >= and <= (combined with &) + filter_str = str(filter_closed) + assert ">=" in filter_str + assert "<=" in filter_str diff --git a/tests/data/test_dataprovider.py b/tests/data/test_dataprovider.py index 27aa2f17d..afbba3d5d 100644 --- a/tests/data/test_dataprovider.py +++ b/tests/data/test_dataprovider.py @@ -8,6 +8,7 @@ from freqtrade.data.dataprovider import DataProvider from freqtrade.enums import CandleType, RunMode from freqtrade.exceptions import ExchangeError, OperationalException from freqtrade.plugins.pairlistmanager import PairListManager +from freqtrade.util import dt_utc from tests.conftest import EXMS, generate_test_data, get_patched_exchange @@ -449,6 +450,12 @@ def test_no_exchange_mode(default_conf): with pytest.raises(OperationalException, match=message): dp.available_pairs() + with pytest.raises(OperationalException, match=message): + dp.funding_rate("XRP/USDT:USDT") + + with pytest.raises(OperationalException, match=message): + dp.check_delisting("XRP/USDT") + def test_dp_send_msg(default_conf): default_conf["runmode"] = RunMode.DRY_RUN @@ -612,3 +619,20 @@ def test_dp_get_required_startup(default_conf_usdt): assert dp.get_required_startup("5m") == 51880 assert dp.get_required_startup("1h") == 4360 assert dp.get_required_startup("1d") == 220 + + +def test_check_delisting(mocker, default_conf_usdt): + delist_mock = MagicMock(return_value=None) + exchange = get_patched_exchange(mocker, default_conf_usdt) + mocker.patch.object(exchange, "check_delisting_time", delist_mock) + dp = DataProvider(default_conf_usdt, exchange) + res = dp.check_delisting("ETH/USDT") + assert res is None + assert delist_mock.call_count == 1 + + delist_mock2 = MagicMock(return_value=dt_utc(2025, 10, 2)) + mocker.patch.object(exchange, "check_delisting_time", delist_mock2) + res = dp.check_delisting("XRP/USDT") + assert res == dt_utc(2025, 10, 2) + + assert delist_mock2.call_count == 1 diff --git a/tests/data/test_history.py b/tests/data/test_history.py index 5554e04b3..de216eec9 100644 --- a/tests/data/test_history.py +++ b/tests/data/test_history.py @@ -18,6 +18,7 @@ from freqtrade.data.converter import ohlcv_to_dataframe from freqtrade.data.history import get_datahandler from freqtrade.data.history.datahandlers.jsondatahandler import JsonDataHandler, JsonGzDataHandler from freqtrade.data.history.history_utils import ( + _download_all_pairs_history_parallel, _download_pair_history, _download_trades_history, _load_cached_data_for_updating, @@ -545,6 +546,14 @@ def test_refresh_backtest_ohlcv_data( ): caplog.set_level(logging.DEBUG) dl_mock = mocker.patch("freqtrade.data.history.history_utils._download_pair_history") + + def parallel_mock(pairs, timeframe, candle_type, **kwargs): + return {(pair, timeframe, candle_type): DataFrame() for pair in pairs} + + parallel_mock = mocker.patch( + "freqtrade.data.history.history_utils._download_all_pairs_history_parallel", + side_effect=parallel_mock, + ) mocker.patch(f"{EXMS}.markets", PropertyMock(return_value=markets)) mocker.patch.object(Path, "exists", MagicMock(return_value=True)) @@ -559,10 +568,12 @@ def test_refresh_backtest_ohlcv_data( timeframes=["1m", "5m"], datadir=testdatadir, timerange=timerange, - erase=True, + erase=False, trading_mode=trademode, ) + # Called once per timeframe (as we return an empty dataframe) + assert parallel_mock.call_count == 2 assert dl_mock.call_count == callcount assert dl_mock.call_args[1]["timerange"].starttype == "date" @@ -699,3 +710,256 @@ def test_download_trades_history( assert ght_mock.call_count == 0 _clean_test_file(file2) + + +def test_download_all_pairs_history_parallel(mocker, default_conf_usdt): + pairs = ["PAIR1/BTC", "PAIR2/USDT"] + timeframe = "5m" + candle_type = CandleType.SPOT + + df1 = DataFrame( + { + "date": [1, 2], + "open": [1, 2], + "close": [1, 2], + "high": [1, 2], + "low": [1, 2], + "volume": [1, 2], + } + ) + df2 = DataFrame( + { + "date": [3, 4], + "open": [3, 4], + "close": [3, 4], + "high": [3, 4], + "low": [3, 4], + "volume": [3, 4], + } + ) + expected = { + ("PAIR1/BTC", timeframe, candle_type): df1, + ("PAIR2/USDT", timeframe, candle_type): df2, + } + # Mock exchange + mocker.patch.multiple( + EXMS, + exchange_has=MagicMock(return_value=True), + ohlcv_candle_limit=MagicMock(return_value=1000), + refresh_latest_ohlcv=MagicMock(return_value=expected), + ) + exchange = get_patched_exchange(mocker, default_conf_usdt) + # timerange with starttype 'date' and startts far in the future to trigger parallel download + + timerange = TimeRange("date", None, 9999999999, 0) + result = _download_all_pairs_history_parallel( + exchange=exchange, + pairs=pairs, + timeframe=timeframe, + candle_type=candle_type, + timerange=timerange, + ) + assert result == expected + + assert exchange.ohlcv_candle_limit.call_args[0] == (timeframe, candle_type) + assert exchange.refresh_latest_ohlcv.call_count == 1 + + # If since is not after one_call_min_time_dt, should not call refresh_latest_ohlcv + exchange.refresh_latest_ohlcv.reset_mock() + timerange2 = TimeRange("date", None, 0, 0) + result2 = _download_all_pairs_history_parallel( + exchange=exchange, + pairs=pairs, + timeframe=timeframe, + candle_type=candle_type, + timerange=timerange2, + ) + assert result2 == {} + assert exchange.refresh_latest_ohlcv.call_count == 0 + + exchange.refresh_latest_ohlcv.reset_mock() + + # Test without timerange + result3 = _download_all_pairs_history_parallel( + exchange=exchange, + pairs=pairs, + timeframe=timeframe, + candle_type=candle_type, + timerange=None, + ) + assert result3 == {} + assert exchange.refresh_latest_ohlcv.call_count == 0 + + +def test_download_pair_history_with_pair_candles(mocker, default_conf, tmp_path, caplog) -> None: + """ + Test _download_pair_history with pair_candles parameter (parallel method). + """ + exchange = get_patched_exchange(mocker, default_conf) + + # Create test data for existing cached data + existing_data = DataFrame( + { + "date": [dt_utc(2018, 1, 10, 10, 0), dt_utc(2018, 1, 10, 10, 5)], + "open": [1.0, 1.15], + "high": [1.1, 1.2], + "low": [0.9, 1.1], + "close": [1.05, 1.15], + "volume": [100, 150], + } + ) + + # Create pair_candles data that will be used instead of exchange download + # This data should start before or at the same time as since_ms to trigger the else branch + pair_candles_data = DataFrame( + { + "date": [ + dt_utc(2018, 1, 10, 10, 5), + dt_utc(2018, 1, 10, 10, 10), + dt_utc(2018, 1, 10, 10, 15), + ], + "open": [1.15, 1.2, 1.25], + "high": [1.25, 1.3, 1.35], + "low": [1.1, 1.15, 1.2], + "close": [1.2, 1.25, 1.3], + "volume": [200, 250, 300], + } + ) + + # Mock the data handler to return existing cached data + data_handler_mock = MagicMock() + data_handler_mock.ohlcv_load.return_value = existing_data + data_handler_mock.ohlcv_store = MagicMock() + mocker.patch( + "freqtrade.data.history.history_utils.get_datahandler", return_value=data_handler_mock + ) + + # Mock _load_cached_data_for_updating to return existing data and since_ms + since_ms = dt_ts(dt_utc(2018, 1, 10, 10, 5)) # Time of last existing candle + mocker.patch( + "freqtrade.data.history.history_utils._load_cached_data_for_updating", + return_value=(existing_data, since_ms, None), + ) + + # Mock clean_ohlcv_dataframe to return concatenated data + expected_result = DataFrame( + { + "date": [ + dt_utc(2018, 1, 10, 10, 0), + dt_utc(2018, 1, 10, 10, 5), + dt_utc(2018, 1, 10, 10, 10), + dt_utc(2018, 1, 10, 10, 15), + ], + "open": [1.0, 1.15, 1.2, 1.25], + "high": [1.1, 1.25, 1.3, 1.35], + "low": [0.9, 1.1, 1.15, 1.2], + "close": [1.05, 1.2, 1.25, 1.3], + "volume": [100, 200, 250, 300], + } + ) + + get_historic_ohlcv_mock = MagicMock() + mocker.patch.object(exchange, "get_historic_ohlcv", get_historic_ohlcv_mock) + + # Call _download_pair_history with pre-loaded pair_candles + result = _download_pair_history( + datadir=tmp_path, + exchange=exchange, + pair="TEST/BTC", + timeframe="5m", + candle_type=CandleType.SPOT, + pair_candles=pair_candles_data, + ) + + # Verify the function succeeded + assert result is True + + # Verify that exchange.get_historic_ohlcv was NOT called (parallel method was used) + assert get_historic_ohlcv_mock.call_count == 0 + + # Verify the log message indicating parallel method was used (line 315-316) + assert log_has("Downloaded data for TEST/BTC with length 3. Parallel Method.", caplog) + + # Verify data was stored + assert data_handler_mock.ohlcv_store.call_count == 1 + stored_data = data_handler_mock.ohlcv_store.call_args_list[0][1]["data"] + assert stored_data.equals(expected_result) + assert len(stored_data) == 4 + + +def test_download_pair_history_with_pair_candles_no_overlap( + mocker, default_conf, tmp_path, caplog +) -> None: + exchange = get_patched_exchange(mocker, default_conf) + + # Create test data for existing cached data + existing_data = DataFrame( + { + "date": [dt_utc(2018, 1, 10, 10, 0), dt_utc(2018, 1, 10, 10, 5)], + "open": [1.0, 1.1], + "high": [1.1, 1.2], + "low": [0.9, 1.0], + "close": [1.05, 1.15], + "volume": [100, 150], + } + ) + + # Create pair_candles data that will be used instead of exchange download + # This data should start before or at the same time as since_ms to trigger the else branch + pair_candles_data = DataFrame( + { + "date": [ + dt_utc(2018, 1, 10, 10, 10), + dt_utc(2018, 1, 10, 10, 15), + dt_utc(2018, 1, 10, 10, 20), + ], + "open": [1.15, 1.2, 1.25], + "high": [1.25, 1.3, 1.35], + "low": [1.1, 1.15, 1.2], + "close": [1.2, 1.25, 1.3], + "volume": [200, 250, 300], + } + ) + + # Mock the data handler to return existing cached data + data_handler_mock = MagicMock() + data_handler_mock.ohlcv_load.return_value = existing_data + data_handler_mock.ohlcv_store = MagicMock() + mocker.patch( + "freqtrade.data.history.history_utils.get_datahandler", return_value=data_handler_mock + ) + + # Mock _load_cached_data_for_updating to return existing data and since_ms + since_ms = dt_ts(dt_utc(2018, 1, 10, 10, 5)) # Time of last existing candle + mocker.patch( + "freqtrade.data.history.history_utils._load_cached_data_for_updating", + return_value=(existing_data, since_ms, None), + ) + + get_historic_ohlcv_mock = MagicMock(return_value=DataFrame()) + mocker.patch.object(exchange, "get_historic_ohlcv", get_historic_ohlcv_mock) + + # Call _download_pair_history with pre-loaded pair_candles + result = _download_pair_history( + datadir=tmp_path, + exchange=exchange, + pair="TEST/BTC", + timeframe="5m", + candle_type=CandleType.SPOT, + pair_candles=pair_candles_data, + ) + + # Verify the function succeeded + assert result is True + + # Verify that exchange.get_historic_ohlcv was NOT called (parallel method was used) + assert get_historic_ohlcv_mock.call_count == 1 + + # Verify the log message indicating parallel method was used (line 315-316) + assert not log_has_re(r"Downloaded .* Parallel Method.", caplog) + + # Verify data was stored + assert data_handler_mock.ohlcv_store.call_count == 1 + stored_data = data_handler_mock.ohlcv_store.call_args_list[0][1]["data"] + assert stored_data.equals(existing_data) + assert len(stored_data) == 2 diff --git a/tests/exchange/test_binance.py b/tests/exchange/test_binance.py index 02c0f202b..2c11fc2f3 100644 --- a/tests/exchange/test_binance.py +++ b/tests/exchange/test_binance.py @@ -1,3 +1,4 @@ +from copy import deepcopy from datetime import datetime, timedelta from random import randint from unittest.mock import MagicMock, PropertyMock @@ -7,7 +8,7 @@ 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.enums import CandleType, MarginMode, RunMode, TradingMode from freqtrade.exceptions import DependencyException, InvalidOrderException, OperationalException from freqtrade.exchange.exchange_utils_timeframe import timeframe_to_seconds from freqtrade.persistence import Trade @@ -1108,3 +1109,84 @@ async def test__async_get_trade_history_id_binance_fast( # Clean up event loop to avoid warnings exchange.close() + + +def test_check_delisting_time_binance(default_conf_usdt, mocker): + exchange = get_patched_exchange(mocker, default_conf_usdt, exchange="binance") + exchange._config["runmode"] = RunMode.BACKTEST + delist_mock = MagicMock(return_value=None) + delist_fut_mock = MagicMock(return_value=None) + mocker.patch.object(exchange, "_get_spot_pair_delist_time", delist_mock) + mocker.patch.object(exchange, "_check_delisting_futures", delist_fut_mock) + + # Invalid run mode + resp = exchange.check_delisting_time("BTC/USDT") + assert resp is None + assert delist_mock.call_count == 0 + assert delist_fut_mock.call_count == 0 + + # Delist spot called + exchange._config["runmode"] = RunMode.DRY_RUN + resp1 = exchange.check_delisting_time("BTC/USDT") + assert resp1 is None + assert delist_mock.call_count == 1 + assert delist_fut_mock.call_count == 0 + delist_mock.reset_mock() + + # Delist futures called + exchange.trading_mode = TradingMode.FUTURES + resp1 = exchange.check_delisting_time("BTC/USDT:USDT") + assert resp1 is None + assert delist_mock.call_count == 0 + assert delist_fut_mock.call_count == 1 + + +def test__check_delisting_futures_binance(default_conf_usdt, mocker, markets): + markets["BTC/USDT:USDT"] = deepcopy(markets["SOL/BUSD:BUSD"]) + markets["BTC/USDT:USDT"]["info"]["deliveryDate"] = 4133404800000 + markets["SOL/BUSD:BUSD"]["info"]["deliveryDate"] = 4133404800000 + markets["ADA/USDT:USDT"]["info"]["deliveryDate"] = 1760745600000 # 2025-10-18 + exchange = get_patched_exchange(mocker, default_conf_usdt, exchange="binance") + mocker.patch(f"{EXMS}.markets", PropertyMock(return_value=markets)) + + resp_sol = exchange._check_delisting_futures("SOL/BUSD:BUSD") + # Delisting is equal to BTC + assert resp_sol is None + # Actually has a delisting date + resp_ada = exchange._check_delisting_futures("ADA/USDT:USDT") + assert resp_ada == dt_utc(2025, 10, 18) + + +def test__get_spot_delist_schedule_binance(default_conf_usdt, mocker): + exchange = get_patched_exchange(mocker, default_conf_usdt, exchange="binance") + ret_value = [{"delistTime": 1759114800000, "symbols": ["ETCBTC"]}] + schedule_mock = mocker.patch.object(exchange, "_get_spot_delist_schedule", return_value=None) + + # None - mode is DRY + assert exchange._get_spot_pair_delist_time("ETC/BTC") is None + # Switch to live + exchange._config["runmode"] = RunMode.LIVE + assert exchange._get_spot_pair_delist_time("ETC/BTC") is None + + mocker.patch.object(exchange, "_get_spot_delist_schedule", return_value=ret_value) + resp = exchange._get_spot_pair_delist_time("ETC/BTC") + assert resp == dt_utc(2025, 9, 29, 3, 0) + assert schedule_mock.call_count == 1 + schedule_mock.reset_mock() + + # Caching - don't refresh. + assert exchange._get_spot_pair_delist_time("ETC/BTC", refresh=False) == dt_utc( + 2025, 9, 29, 3, 0 + ) + assert schedule_mock.call_count == 0 + + api_mock = MagicMock() + ccxt_exceptionhandlers( + mocker, + default_conf_usdt, + api_mock, + "binance", + "_get_spot_delist_schedule", + "sapi_get_spot_delist_schedule", + retries=1, + ) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index bf7f6350a..1550d93e6 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -28,6 +28,7 @@ from freqtrade.exchange import ( Bybit, Exchange, Kraken, + date_minus_candles, market_is_active, timeframe_to_prev_date, ) @@ -858,7 +859,7 @@ def test_validate_pricing(default_conf, mocker): default_conf["exchange"]["name"] = "binance" ExchangeResolver.load_exchange(default_conf) has.update({"fetchTicker": False}) - with pytest.raises(OperationalException, match="Ticker pricing not available for .*"): + with pytest.raises(OperationalException, match=r"Ticker pricing not available for .*"): ExchangeResolver.load_exchange(default_conf) has.update({"fetchTicker": True}) @@ -867,7 +868,7 @@ def test_validate_pricing(default_conf, mocker): ExchangeResolver.load_exchange(default_conf) has.update({"fetchL2OrderBook": False}) - with pytest.raises(OperationalException, match="Orderbook not available for .*"): + with pytest.raises(OperationalException, match=r"Orderbook not available for .*"): ExchangeResolver.load_exchange(default_conf) has.update({"fetchL2OrderBook": True}) @@ -876,7 +877,7 @@ def test_validate_pricing(default_conf, mocker): default_conf["trading_mode"] = TradingMode.FUTURES default_conf["margin_mode"] = MarginMode.ISOLATED - with pytest.raises(OperationalException, match="Ticker pricing not available for .*"): + with pytest.raises(OperationalException, match=r"Ticker pricing not available for .*"): ExchangeResolver.load_exchange(default_conf) @@ -2144,7 +2145,7 @@ def test___now_is_time_to_refresh(default_conf, mocker, exchange_name, time_mach assert exchange._now_is_time_to_refresh(pair, "1d", candle_type) is True -@pytest.mark.parametrize("candle_type", ["mark", ""]) +@pytest.mark.parametrize("candle_type", ["mark", "spot", "futures"]) @pytest.mark.parametrize("exchange_name", EXCHANGES) def test_get_historic_ohlcv(default_conf, mocker, caplog, exchange_name, candle_type): caplog.set_level(logging.DEBUG) @@ -2171,24 +2172,24 @@ def test_get_historic_ohlcv(default_conf, mocker, caplog, exchange_name, candle_ exchange._async_get_candle_history = Mock(wraps=mock_candle_hist) # one_call calculation * 1.8 should do 2 calls + candle_limit = exchange.ohlcv_candle_limit("5m", candle_type) + since = date_minus_candles("5m", candle_limit) + ret = exchange.get_historic_ohlcv(pair, "5m", dt_ts(since), candle_type=candle_type) - since = 5 * 60 * exchange.ohlcv_candle_limit("5m", candle_type) * 1.8 - ret = exchange.get_historic_ohlcv( - pair, "5m", dt_ts(dt_now() - timedelta(seconds=since)), candle_type=candle_type - ) - - assert exchange._async_get_candle_history.call_count == 2 + if exchange_name == "okx" and candle_type == "mark": + expected = 4 + else: + expected = 2 + assert exchange._async_get_candle_history.call_count == expected # Returns twice the above OHLCV data after truncating the open candle. - assert len(ret) == 2 + assert len(ret) == expected assert log_has_re(r"Downloaded data for .* from ccxt with length .*\.", caplog) caplog.clear() 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 - ) + exchange.get_historic_ohlcv(pair, "5m", dt_ts(since), candle_type=candle_type) assert log_has_re(r"Async code raised an exception: .*", caplog) @@ -2335,7 +2336,7 @@ def test_refresh_latest_ohlcv(mocker, default_conf_usdt, caplog, candle_type) -> if candle_type != CandleType.MARK: assert not res assert len(res) == 0 - assert log_has_re(r"Cannot download \(IOTA\/USDT, 3m\).*", caplog) + assert log_has_re(r"Cannot download \(IOTA\/USDT, 3m, \S+\).*", caplog) else: assert len(res) == 1 @@ -3555,7 +3556,7 @@ def test_get_historic_trades_notsupported( pair = "ETH/BTC" with pytest.raises( - OperationalException, match="This exchange does not support downloading Trades." + OperationalException, match=r"This exchange does not support downloading Trades\." ): exchange.get_historic_trades(pair, since=trades_history[0][0], until=trades_history[-1][0]) @@ -4441,7 +4442,7 @@ def test_get_markets( def test_get_markets_error(default_conf, mocker): ex = get_patched_exchange(mocker, default_conf) mocker.patch(f"{EXMS}.markets", PropertyMock(return_value=None)) - with pytest.raises(OperationalException, match="Markets were not loaded."): + with pytest.raises(OperationalException, match=r"Markets were not loaded\."): ex.get_markets("LTC", "USDT", True, False) @@ -4455,8 +4456,7 @@ def test_ohlcv_candle_limit(default_conf, mocker, exchange_name): for timeframe in timeframes: # if 'ohlcv_candle_limit_per_timeframe' in exchange._ft_has: # expected = exchange._ft_has['ohlcv_candle_limit_per_timeframe'][timeframe] - # This should only run for bittrex - # assert exchange_name == 'bittrex' + # This should only run for htx assert exchange.ohlcv_candle_limit(timeframe, CandleType.SPOT) == expected @@ -5243,7 +5243,7 @@ def test__fetch_and_calculate_funding_fees( # Return empty "refresh_latest" mocker.patch(f"{EXMS}.refresh_latest_ohlcv", return_value={}) ex = get_patched_exchange(mocker, default_conf, api_mock, exchange=exchange) - with pytest.raises(ExchangeError, match="Could not find funding rates."): + with pytest.raises(ExchangeError, match=r"Could not find funding rates\."): ex._fetch_and_calculate_funding_fees( pair="ADA/USDT:USDT", amount=amount, is_short=False, open_date=d1, close_date=d2 ) @@ -6319,3 +6319,39 @@ def test_exchange_features(default_conf, mocker): assert exchange.features("futures", "fetchOHLCV", "limit", 500) == 997 # Fall back to default assert exchange.features("futures", "fetchOHLCV_else", "limit", 601) == 601 + + +@pytest.mark.parametrize("exchange_name", EXCHANGES) +def test_fetch_funding_rate(default_conf, mocker, exchange_name): + api_mock = MagicMock() + funding_rate = { + "symbol": "ETH/BTC", + "fundingRate": 5.652e-05, + "fundingTimestamp": 1757174400000, + "fundingDatetime": "2025-09-06T16:00:00.000Z", + } + api_mock.fetch_funding_rate = MagicMock(return_value=funding_rate) + api_mock.markets = {"ETH/BTC": {"active": True}} + exchange = get_patched_exchange(mocker, default_conf, api_mock, exchange=exchange_name) + # retrieve original funding rate + funding_rate = exchange.fetch_funding_rate(pair="ETH/BTC") + assert funding_rate["fundingRate"] == funding_rate["fundingRate"] + assert funding_rate["fundingTimestamp"] == funding_rate["fundingTimestamp"] + assert funding_rate["fundingDatetime"] == funding_rate["fundingDatetime"] + + ccxt_exceptionhandlers( + mocker, + default_conf, + api_mock, + exchange_name, + "fetch_funding_rate", + "fetch_funding_rate", + pair="ETH/BTC", + ) + + api_mock.fetch_funding_rate = MagicMock(return_value={}) + exchange = get_patched_exchange(mocker, default_conf, api_mock, exchange=exchange_name) + exchange.fetch_funding_rate(pair="ETH/BTC") + + with pytest.raises(DependencyException, match=r"Pair XRP/ETH not available"): + exchange.fetch_funding_rate(pair="XRP/ETH") diff --git a/tests/exchange/test_okx.py b/tests/exchange/test_okx.py index bf881163e..a388c2ab1 100644 --- a/tests/exchange/test_okx.py +++ b/tests/exchange/test_okx.py @@ -20,11 +20,11 @@ def test_okx_ohlcv_candle_limit(default_conf, mocker): for timeframe in timeframes: assert exchange.ohlcv_candle_limit(timeframe, CandleType.SPOT) == 300 assert exchange.ohlcv_candle_limit(timeframe, CandleType.FUTURES) == 300 - assert exchange.ohlcv_candle_limit(timeframe, CandleType.MARK) == 100 + assert exchange.ohlcv_candle_limit(timeframe, CandleType.MARK) == 300 assert exchange.ohlcv_candle_limit(timeframe, CandleType.FUNDING_RATE) == 100 - assert exchange.ohlcv_candle_limit(timeframe, CandleType.SPOT, start_time) == 100 - assert exchange.ohlcv_candle_limit(timeframe, CandleType.FUTURES, start_time) == 100 + assert exchange.ohlcv_candle_limit(timeframe, CandleType.SPOT, start_time) == 300 + assert exchange.ohlcv_candle_limit(timeframe, CandleType.FUTURES, start_time) == 300 assert exchange.ohlcv_candle_limit(timeframe, CandleType.MARK, start_time) == 100 assert exchange.ohlcv_candle_limit(timeframe, CandleType.FUNDING_RATE, start_time) == 100 one_call = int( @@ -36,6 +36,7 @@ def test_okx_ohlcv_candle_limit(default_conf, mocker): assert exchange.ohlcv_candle_limit(timeframe, CandleType.SPOT, one_call) == 300 assert exchange.ohlcv_candle_limit(timeframe, CandleType.FUTURES, one_call) == 300 + assert exchange.ohlcv_candle_limit(timeframe, CandleType.MARK, one_call) == 300 one_call = int( ( @@ -43,8 +44,9 @@ def test_okx_ohlcv_candle_limit(default_conf, mocker): ).timestamp() * 1000 ) - assert exchange.ohlcv_candle_limit(timeframe, CandleType.SPOT, one_call) == 100 - assert exchange.ohlcv_candle_limit(timeframe, CandleType.FUTURES, one_call) == 100 + assert exchange.ohlcv_candle_limit(timeframe, CandleType.SPOT, one_call) == 300 + assert exchange.ohlcv_candle_limit(timeframe, CandleType.FUTURES, one_call) == 300 + assert exchange.ohlcv_candle_limit(timeframe, CandleType.MARK, one_call) == 100 def test_get_maintenance_ratio_and_amt_okx( diff --git a/tests/exchange_online/conftest.py b/tests/exchange_online/conftest.py index 65d11f949..6784500da 100644 --- a/tests/exchange_online/conftest.py +++ b/tests/exchange_online/conftest.py @@ -28,7 +28,11 @@ EXCHANGES = { "leverage_tiers_public": False, "leverage_in_spot_market": False, "trades_lookback_hours": 4, - "private_methods": ["fapiPrivateGetPositionSideDual", "fapiPrivateGetMultiAssetsMargin"], + "private_methods": [ + "fapiPrivateGetPositionSideDual", + "fapiPrivateGetMultiAssetsMargin", + "sapi_get_spot_delist_schedule", + ], "sample_order": [ { "exchange_response": { diff --git a/tests/freqtradebot/test_freqtradebot.py b/tests/freqtradebot/test_freqtradebot.py index 16def3d19..1304ca9ba 100644 --- a/tests/freqtradebot/test_freqtradebot.py +++ b/tests/freqtradebot/test_freqtradebot.py @@ -986,7 +986,7 @@ def test_execute_entry( # Fail to get price... mocker.patch(f"{EXMS}.get_rate", MagicMock(return_value=0.0)) - with pytest.raises(PricingError, match="Could not determine entry price."): + with pytest.raises(PricingError, match=r"Could not determine entry price\."): freqtrade.execute_entry(pair, stake_amount, is_short=is_short) # In case of custom entry price diff --git a/tests/optimize/test_backtesting.py b/tests/optimize/test_backtesting.py index 292ee92aa..1c9373fb7 100644 --- a/tests/optimize/test_backtesting.py +++ b/tests/optimize/test_backtesting.py @@ -27,7 +27,7 @@ from freqtrade.optimize.backtest_caching import get_backtest_metadata_filename, from freqtrade.optimize.backtesting import Backtesting from freqtrade.persistence import LocalTrade, Trade from freqtrade.resolvers import StrategyResolver -from freqtrade.util.datetime_helpers import dt_utc +from freqtrade.util import dt_now, dt_utc from tests.conftest import ( CURRENT_TEST_STRATEGY, EXMS, @@ -357,7 +357,7 @@ def test_get_pair_precision_bt(default_conf, mocker) -> None: pair = "UNITTEST/BTC" backtesting.pairlists._whitelist = [pair] ex_mock = mocker.patch(f"{EXMS}.get_precision_price", return_value=1e-5) - data, timerange = backtesting.load_bt_data() + data, _timerange = backtesting.load_bt_data() assert data assert backtesting.get_pair_precision(pair, dt_utc(2018, 1, 1)) == (1e-8, TICK_SIZE) @@ -444,7 +444,7 @@ def test_backtesting_start_no_data(default_conf, mocker, caplog, testdatadir) -> backtesting = Backtesting(default_conf) backtesting._set_strategy(backtesting.strategylist[0]) - with pytest.raises(OperationalException, match="No data found. Terminating."): + with pytest.raises(OperationalException, match=r"No data found. Terminating\."): backtesting.start() @@ -465,7 +465,7 @@ def test_backtesting_no_pair_left(default_conf, mocker) -> None: default_conf["export"] = "none" default_conf["timerange"] = "20180101-20180102" - with pytest.raises(OperationalException, match="No pair in whitelist."): + with pytest.raises(OperationalException, match=r"No pair in whitelist\."): Backtesting(default_conf) default_conf.update( @@ -476,7 +476,7 @@ def test_backtesting_no_pair_left(default_conf, mocker) -> None: ) with pytest.raises( - OperationalException, match="Detail timeframe must be smaller than strategy timeframe." + OperationalException, match=r"Detail timeframe must be smaller than strategy timeframe\." ): Backtesting(default_conf) @@ -517,7 +517,7 @@ def test_backtesting_pairlist_list(default_conf, mocker, tickers) -> None: default_conf["strategy_list"] = [CURRENT_TEST_STRATEGY, "StrategyTestV2"] with pytest.raises( OperationalException, - match="PrecisionFilter not allowed for backtesting multiple strategies.", + match=r"PrecisionFilter not allowed for backtesting multiple strategies\.", ): Backtesting(default_conf) @@ -2715,3 +2715,75 @@ def test_get_backtest_metadata_filename(): filename = "backtest_results_zip.zip" expected = Path("backtest_results_zip.meta.json") assert get_backtest_metadata_filename(filename) == expected + + +@pytest.mark.parametrize("dynamic_pairlist", [True, False]) +def test_time_pair_generator_refresh_pairlist(mocker, default_conf, dynamic_pairlist): + patch_exchange(mocker) + default_conf["enable_dynamic_pairlist"] = dynamic_pairlist + backtesting = Backtesting(default_conf) + backtesting._set_strategy(backtesting.strategylist[0]) + assert backtesting.dynamic_pairlist == dynamic_pairlist + + refresh_mock = mocker.patch( + "freqtrade.plugins.pairlistmanager.PairListManager.refresh_pairlist" + ) + + # Simulate 2 candles + start_date = datetime(2025, 1, 1, 0, 0, tzinfo=UTC) + end_date = start_date + timedelta(minutes=10) + pairs = default_conf["exchange"]["pair_whitelist"] + data = {pair: [] for pair in pairs} + + # Simulate backtest loop + list(backtesting.time_pair_generator(start_date, end_date, pairs, data)) + + if dynamic_pairlist: + assert refresh_mock.call_count == 2 + else: + assert refresh_mock.call_count == 0 + + +@pytest.mark.parametrize("dynamic_pairlist", [True, False]) +def test_time_pair_generator_open_trades_first(mocker, default_conf, dynamic_pairlist): + patch_exchange(mocker) + default_conf["enable_dynamic_pairlist"] = dynamic_pairlist + backtesting = Backtesting(default_conf) + backtesting._set_strategy(backtesting.strategylist[0]) + assert backtesting.dynamic_pairlist == dynamic_pairlist + + pairs = ["XRP/BTC", "LTC/BTC", "NEO/BTC", "ETH/BTC"] + + # Simulate open trades + trades = [ + LocalTrade(pair="XRP/BTC", open_date=dt_now(), amount=1, open_rate=1), + LocalTrade(pair="NEO/BTC", open_date=dt_now(), amount=1, open_rate=1), + ] + LocalTrade.bt_trades_open = trades + LocalTrade.bt_trades_open_pp = { + "XRP/BTC": [trades[0]], + "NEO/BTC": [trades[1]], + "LTC/BTC": [], + "ETH/BTC": [], + } + + start_date = datetime(2025, 1, 1, 0, 0, tzinfo=UTC) + end_date = start_date + timedelta(minutes=5) + dummy_row = (end_date, 1.0, 1.1, 0.9, 1.0, 0, 0, 0, 0, None, None) + data = {pair: [dummy_row] for pair in pairs} + + def mock_refresh(self): + # Simulate shuffle + self._whitelist = pairs[::-1] # ['ETH/BTC', 'NEO/BTC', 'LTC/BTC', 'XRP/BTC'] + + mocker.patch("freqtrade.plugins.pairlistmanager.PairListManager.refresh_pairlist", mock_refresh) + + processed_pairs = [] + for _, pair, _, _, _ in backtesting.time_pair_generator(start_date, end_date, pairs, data): + processed_pairs.append(pair) + + # Open trades first in both cases + if dynamic_pairlist: + assert processed_pairs == ["XRP/BTC", "NEO/BTC", "ETH/BTC", "LTC/BTC"] + else: + assert processed_pairs == ["XRP/BTC", "NEO/BTC", "LTC/BTC", "ETH/BTC"] diff --git a/tests/optimize/test_hyperopt.py b/tests/optimize/test_hyperopt.py index 4d9d68eae..21f011a9b 100644 --- a/tests/optimize/test_hyperopt.py +++ b/tests/optimize/test_hyperopt.py @@ -280,7 +280,7 @@ def test_start_no_data(mocker, hyperopt_conf, tmp_path) -> None: "5", ] pargs = get_args(args) - with pytest.raises(OperationalException, match="No data found. Terminating."): + with pytest.raises(OperationalException, match=r"No data found. Terminating\."): start_hyperopt(pargs) # Cleanup since that failed hyperopt start leaves a lockfile. @@ -1127,7 +1127,7 @@ def test_in_strategy_auto_hyperopt(mocker, hyperopt_conf, tmp_path, fee) -> None assert opt.backtesting.strategy.max_open_trades != 1 opt.custom_hyperopt.generate_estimator = lambda *args, **kwargs: "ET1" - with pytest.raises(OperationalException, match="Optuna Sampler ET1 not supported."): + with pytest.raises(OperationalException, match=r"Optuna Sampler ET1 not supported\."): opt.get_optimizer(42) diff --git a/tests/optimize/test_hyperoptloss.py b/tests/optimize/test_hyperoptloss.py index 6d3110509..8fd47a8e6 100644 --- a/tests/optimize/test_hyperoptloss.py +++ b/tests/optimize/test_hyperoptloss.py @@ -11,8 +11,8 @@ from freqtrade.resolvers.hyperopt_resolver import HyperOptLossResolver def test_hyperoptlossresolver_noname(default_conf): with pytest.raises( OperationalException, - match="No Hyperopt loss set. Please use `--hyperopt-loss` to specify " - "the Hyperopt-Loss class to use.", + match=r"No Hyperopt loss set. Please use `--hyperopt-loss` to specify " + r"the Hyperopt-Loss class to use\.", ): HyperOptLossResolver.load_hyperoptloss(default_conf) diff --git a/tests/optimize/test_lookahead_analysis.py b/tests/optimize/test_lookahead_analysis.py index 3ecabc0b1..2b8331608 100644 --- a/tests/optimize/test_lookahead_analysis.py +++ b/tests/optimize/test_lookahead_analysis.py @@ -123,7 +123,7 @@ def test_lookahead_helper_no_strategy_defined(lookahead_conf): LookaheadAnalysisSubFunctions.start(conf) -def test_lookahead_helper_start(lookahead_conf, mocker) -> None: +def test_lookahead_helper_start(lookahead_conf, mocker, caplog) -> None: single_mock = MagicMock() text_table_mock = MagicMock() mocker.patch.multiple( @@ -131,13 +131,22 @@ def test_lookahead_helper_start(lookahead_conf, mocker) -> None: initialize_single_lookahead_analysis=single_mock, text_table_lookahead_analysis_instances=text_table_mock, ) - LookaheadAnalysisSubFunctions.start(lookahead_conf) + LookaheadAnalysisSubFunctions.start(deepcopy(lookahead_conf)) assert single_mock.call_count == 1 assert text_table_mock.call_count == 1 + assert log_has_re("Forced order_types to market orders.", caplog) + assert single_mock.call_args_list[0][0][0]["order_types"]["entry"] == "market" single_mock.reset_mock() text_table_mock.reset_mock() + lookahead_conf["lookahead_allow_limit_orders"] = True + LookaheadAnalysisSubFunctions.start(lookahead_conf) + assert single_mock.call_count == 1 + assert text_table_mock.call_count == 1 + assert log_has_re("Using configured order_types, skipping order_types override.", caplog) + assert "order_types" not in single_mock.call_args_list[0][0][0] + @pytest.mark.parametrize( "indicators, expected_caption_text", diff --git a/tests/plugins/test_pairlist.py b/tests/plugins/test_pairlist.py index f2c3c69e3..5e64a5d03 100644 --- a/tests/plugins/test_pairlist.py +++ b/tests/plugins/test_pairlist.py @@ -18,7 +18,7 @@ from freqtrade.persistence import LocalTrade, Trade from freqtrade.plugins.pairlist.pairlist_helpers import dynamic_expand_pairlist, expand_pairlist from freqtrade.plugins.pairlistmanager import PairListManager from freqtrade.resolvers import PairListResolver -from freqtrade.util.datetime_helpers import dt_now +from freqtrade.util import dt_now, dt_utc from tests.conftest import ( EXMS, create_mock_trades_usdt, @@ -1274,27 +1274,37 @@ def test_ShuffleFilter_init(mocker, whitelist_conf, caplog) -> None: {"method": "StaticPairList"}, {"method": "ShuffleFilter", "seed": 43}, ] - whitelist_conf["runmode"] = "backtest" + whitelist_conf["runmode"] = RunMode.BACKTEST exchange = get_patched_exchange(mocker, whitelist_conf) plm = PairListManager(exchange, whitelist_conf) assert log_has("Backtesting mode detected, applying seed value: 43", caplog) + plm.refresh_pairlist() + pl1 = deepcopy(plm.whitelist) + plm.refresh_pairlist() + assert plm.whitelist != pl1 + assert set(plm.whitelist) == set(pl1) + + caplog.clear() + whitelist_conf["runmode"] = RunMode.DRY_RUN + plm = PairListManager(exchange, whitelist_conf) + assert not log_has("Backtesting mode detected, applying seed value: 42", caplog) + assert log_has("Live mode detected, not applying seed.", caplog) + with time_machine.travel("2021-09-01 05:01:00 +00:00") as t: plm.refresh_pairlist() pl1 = deepcopy(plm.whitelist) plm.refresh_pairlist() assert plm.whitelist == pl1 + target = plm._pairlist_handlers[1]._random + shuffle_mock = mocker.patch.object(target, "shuffle", wraps=target.shuffle) + t.shift(timedelta(minutes=10)) plm.refresh_pairlist() - assert plm.whitelist != pl1 - - caplog.clear() - whitelist_conf["runmode"] = RunMode.DRY_RUN - plm = PairListManager(exchange, whitelist_conf) - assert not log_has("Backtesting mode detected, applying seed value: 42", caplog) - assert log_has("Live mode detected, not applying seed.", caplog) + assert shuffle_mock.call_count == 1 + assert set(plm.whitelist) == set(pl1) @pytest.mark.usefixtures("init_persistence") @@ -1669,7 +1679,7 @@ def test_rangestabilityfilter_checks(mocker, default_conf, markets, tickers): with pytest.raises( OperationalException, - match="RangeStabilityFilter requires sort_direction to be either None.*", + match=r"RangeStabilityFilter requires sort_direction to be either None\.*", ): get_patched_freqtradebot(mocker, default_conf) @@ -1823,6 +1833,17 @@ def test_spreadfilter_invalid_data(mocker, default_conf, markets, tickers, caplo None, "PriceFilter requires max_value to be >= 0", ), # OperationalException expected + ( + {"method": "DelistFilter", "max_days_from_now": -1}, + None, + "DelistFilter requires max_days_from_now to be >= 0", + ), # ConfigurationError expected + ( + {"method": "DelistFilter", "max_days_from_now": 1}, + "[{'DelistFilter': 'DelistFilter - Filtering pairs that will be delisted in the " + "next 1 days.'}]", + None, + ), # ConfigurationError expected ( {"method": "RangeStabilityFilter", "lookback_days": 10, "min_rate_of_change": 0.01}, "[{'RangeStabilityFilter': 'RangeStabilityFilter - Filtering pairs with rate " @@ -2526,7 +2547,7 @@ def test_MarketCapPairList_exceptions(mocker, default_conf_usdt, caplog): } ] with pytest.raises( - OperationalException, match="Category layer250 not in coingecko category list." + OperationalException, match=r"Category layer250 not in coingecko category list\." ): PairListManager(exchange, default_conf_usdt) @@ -2591,3 +2612,63 @@ def test_backtesting_modes( if expected_warning: assert log_has_re(f"Pairlist Handlers {expected_warning}", caplog) + + +def test_DelistFilter_error(whitelist_conf) -> None: + whitelist_conf["pairlists"] = [{"method": "StaticPairList"}, {"method": "DelistFilter"}] + exchange_mock = MagicMock() + exchange_mock._ft_has = {"has_delisting": False} + with pytest.raises( + OperationalException, + match=r"DelistFilter doesn't support this exchange and trading mode combination\.", + ): + PairListManager(exchange_mock, whitelist_conf, MagicMock()) + + +@pytest.mark.usefixtures("init_persistence") +def test_DelistFilter(mocker, default_conf_usdt, time_machine, caplog) -> None: + default_conf_usdt["exchange"]["pair_whitelist"] = [ + "ETH/USDT", + "XRP/USDT", + "BTC/USDT", + "NEO/USDT", + ] + default_conf_usdt["pairlists"] = [ + {"method": "StaticPairList"}, + {"method": "DelistFilter", "max_days_from_now": 3}, + ] + default_conf_usdt["max_open_trades"] = -1 + exchange = get_patched_exchange(mocker, default_conf_usdt) + + def delist_mock(pair: str): + mock_delist = { + "XRP/USDT": dt_utc(2025, 9, 1) + timedelta(days=1), # Delisting in 1 day + "NEO/USDT": dt_utc(2025, 9, 1) + timedelta(days=5, hours=2), # Delisting in 5 days + } + return mock_delist.get(pair, None) + + time_machine.move_to("2025-09-01 01:00:00 +00:00", tick=False) + + mocker.patch.object(exchange, "check_delisting_time", delist_mock) + pm = PairListManager(exchange, default_conf_usdt) + pm.refresh_pairlist() + assert pm.whitelist == ["ETH/USDT", "BTC/USDT", "NEO/USDT"] + assert log_has( + "Removed XRP/USDT from whitelist, because it will be delisted on 2025-09-02 00:00:00.", + caplog, + ) + # NEO is kept initially as delisting is in 5 days, but config is 3 days + + time_machine.move_to("2025-09-03 01:00:00 +00:00", tick=False) + pm.refresh_pairlist() + assert pm.whitelist == ["ETH/USDT", "BTC/USDT", "NEO/USDT"] + # NEO not removed yet, expiry falls into the window 1 hour later + + time_machine.move_to("2025-09-03 02:00:00 +00:00", tick=False) + pm.refresh_pairlist() + assert pm.whitelist == ["ETH/USDT", "BTC/USDT"] + + assert log_has( + "Removed NEO/USDT from whitelist, because it will be delisted on 2025-09-06 02:00:00.", + caplog, + ) diff --git a/tests/plugins/test_remotepairlist.py b/tests/plugins/test_remotepairlist.py index ed2cd8ac4..2c1e80bf4 100644 --- a/tests/plugins/test_remotepairlist.py +++ b/tests/plugins/test_remotepairlist.py @@ -82,7 +82,7 @@ def test_fetch_pairlist_mock_response_html(mocker, rpl_config): exchange, pairlistmanager, rpl_config, rpl_config["pairlists"][0], 0 ) - with pytest.raises(OperationalException, match="RemotePairList is not of type JSON."): + with pytest.raises(OperationalException, match=r"RemotePairList is not of type JSON\."): remote_pairlist.fetch_pairlist() diff --git a/tests/rpc/test_rpc.py b/tests/rpc/test_rpc.py index 3c8490d44..03cdaa0b6 100644 --- a/tests/rpc/test_rpc.py +++ b/tests/rpc/test_rpc.py @@ -393,7 +393,7 @@ def test_rpc_delete_trade(mocker, default_conf, fee, markets, caplog, is_short): freqtradebot.strategy.order_types["stoploss_on_exchange"] = True create_mock_trades(fee, is_short) rpc = RPC(freqtradebot) - with pytest.raises(RPCException, match="Trade with id '200' not found."): + with pytest.raises(RPCException, match=r"Trade with id '200' not found\."): rpc._rpc_delete("200") trades = Trade.session.scalars(select(Trade)).all() @@ -1204,7 +1204,7 @@ def test_rpc_force_entry(mocker, default_conf, ticker, fee, limit_buy_order_open patch_get_signal(freqtradebot) rpc = RPC(freqtradebot) pair = "ETH/BTC" - with pytest.raises(RPCException, match="Maximum number of trades is reached."): + with pytest.raises(RPCException, match=r"Maximum number of trades is reached\."): rpc._rpc_force_entry(pair, None) freqtradebot.config["max_open_trades"] = 5 @@ -1286,7 +1286,7 @@ def test_rpc_force_entry_wrong_mode(mocker, default_conf) -> None: patch_get_signal(freqtradebot) rpc = RPC(freqtradebot) pair = "ETH/BTC" - with pytest.raises(RPCException, match="Can't go short on Spot markets."): + with pytest.raises(RPCException, match=r"Can't go short on Spot markets\."): rpc._rpc_force_entry(pair, None, order_side=SignalDirection.SHORT) diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index 56068e6fe..88437fd03 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -355,7 +355,7 @@ def test_api__init__(default_conf, mocker): apiserver = ApiServer(default_conf) apiserver.add_rpc_handler(RPC(get_patched_freqtradebot(mocker, default_conf))) assert apiserver._config == default_conf - with pytest.raises(OperationalException, match="RPC Handler already attached."): + with pytest.raises(OperationalException, match=r"RPC Handler already attached\."): apiserver.add_rpc_handler(RPC(get_patched_freqtradebot(mocker, default_conf))) apiserver.cleanup() @@ -534,7 +534,7 @@ def test_api_reloadconf(botclient): def test_api_pause(botclient): - ftbot, client = botclient + _ftbot, client = botclient rc = client_post(client, f"{BASE_URI}/pause") assert_response(rc) @@ -3281,7 +3281,7 @@ def test_api_download_data(botclient, mocker, tmp_path): def test_api_markets_live(botclient): - ftbot, client = botclient + _ftbot, client = botclient rc = client_get(client, f"{BASE_URI}/markets") assert_response(rc, 200) diff --git a/tests/rpc/test_rpc_telegram.py b/tests/rpc/test_rpc_telegram.py index e2540e885..e9e2ee65a 100644 --- a/tests/rpc/test_rpc_telegram.py +++ b/tests/rpc/test_rpc_telegram.py @@ -177,7 +177,7 @@ def test_telegram_init(default_conf, mocker, caplog) -> None: assert log_has(message_str, caplog) -async def test_telegram_startup(default_conf, mocker) -> None: +async def test_telegram_startup(default_conf, mocker, caplog) -> None: app_mock = MagicMock() app_mock.initialize = AsyncMock() app_mock.start = AsyncMock() @@ -193,6 +193,12 @@ async def test_telegram_startup(default_conf, mocker) -> None: assert app_mock.updater.start_polling.call_count == 1 assert sleep_mock.call_count == 1 + # Test telegram Retries and Exceptions + app_mock.start = AsyncMock(side_effect=Exception("Test exception")) + await telegram._startup_telegram() + assert app_mock.start.call_count == 3 + assert log_has("Telegram init failed.", caplog) + async def test_telegram_cleanup( default_conf, @@ -978,7 +984,7 @@ async def test_telegram_profit_long_short_handle( mocker.patch("freqtrade.rpc.rpc.CryptoToFiatConverter._find_price", return_value=1.1) mocker.patch.multiple(EXMS, fetch_ticker=ticker_usdt, get_fee=fee) - telegram, freqtradebot, msg_mock = get_telegram_testobject(mocker, default_conf_usdt) + telegram, _freqtradebot, msg_mock = get_telegram_testobject(mocker, default_conf_usdt) # When there are no trades await telegram._profit_long(update=update, context=MagicMock()) diff --git a/tests/rpc/test_rpc_webhook.py b/tests/rpc/test_rpc_webhook.py index b60e52177..24629d5e8 100644 --- a/tests/rpc/test_rpc_webhook.py +++ b/tests/rpc/test_rpc_webhook.py @@ -477,3 +477,33 @@ def test_send_msg_discord(default_conf, mocker): assert "title" in msg_mock.call_args_list[0][0][0]["embeds"][0] assert "color" in msg_mock.call_args_list[0][0][0]["embeds"][0] assert "fields" in msg_mock.call_args_list[0][0][0]["embeds"][0] + + +def test_nested_payload_format(default_conf, mocker): + webhook_config = { + "enabled": True, + "url": "https://example.com", + "format": "json", + "status": { + "msgtype": "text", + "text": {"content": "Status update: {status}", "contentlist": ["{status}"]}, + }, + } + default_conf["webhook"] = webhook_config + + webhook = Webhook(RPC(get_patched_freqtradebot(mocker, default_conf)), default_conf) + + msg = { + "type": RPCMessageType.STATUS, + "status": "running", + } + + post = mocker.patch("freqtrade.rpc.webhook.post") + webhook.send_msg(msg) + + expected_payload = { + "msgtype": "text", + "text": {"content": "Status update: running", "contentlist": ["running"]}, + } + + post.assert_called_once_with("https://example.com", json=expected_payload, timeout=10) diff --git a/tests/strategy/test_interface.py b/tests/strategy/test_interface.py index f06248166..3d6f5c752 100644 --- a/tests/strategy/test_interface.py +++ b/tests/strategy/test_interface.py @@ -988,7 +988,7 @@ def test_auto_hyperopt_interface_loadparams(default_conf, mocker, caplog): } mocker.patch("freqtrade.strategy.hyper.HyperoptTools.load_params", return_value=expected_result) - with pytest.raises(OperationalException, match="Invalid parameter file provided."): + with pytest.raises(OperationalException, match=r"Invalid parameter file provided\."): StrategyResolver.load_strategy(default_conf) mocker.patch( diff --git a/tests/strategy/test_strategy_helpers.py b/tests/strategy/test_strategy_helpers.py index 605579191..53e6501cf 100644 --- a/tests/strategy/test_strategy_helpers.py +++ b/tests/strategy/test_strategy_helpers.py @@ -380,9 +380,10 @@ def test_informative_decorator(mocker, default_conf_usdt, trading_mode): assert inf_pair in strategy.gather_informative_pairs() def test_historic_ohlcv(pair, timeframe, candle_type): - return data[ - (pair, timeframe or strategy.timeframe, CandleType.from_string(candle_type)) - ].copy() + return data.get( + (pair, timeframe or strategy.timeframe, CandleType.from_string(candle_type)), + pd.DataFrame(), + ).copy() mocker.patch( "freqtrade.data.dataprovider.DataProvider.historic_ohlcv", side_effect=test_historic_ohlcv @@ -405,3 +406,12 @@ def test_informative_decorator(mocker, default_conf_usdt, trading_mode): for _, dataframe in analyzed.items(): for col in expected_columns: assert col in dataframe.columns + + # Test non-available pairs + del data[("ETH/BTC", "1h", CandleType.SPOT)] + with pytest.raises( + ValueError, match=r"Informative dataframe for \(ETH\/BTC, 1h, spot\) is empty.*" + ): + strategy.advise_all_indicators( + {p: data[(p, strategy.timeframe, candle_def)] for p in ("XRP/USDT", "LTC/USDT")} + ) diff --git a/tests/strategy/test_strategy_loading.py b/tests/strategy/test_strategy_loading.py index 30aa56f7e..923f3635b 100644 --- a/tests/strategy/test_strategy_loading.py +++ b/tests/strategy/test_strategy_loading.py @@ -111,7 +111,7 @@ def test_load_strategy_noname(default_conf): default_conf["strategy"] = "" with pytest.raises( OperationalException, - match="No strategy set. Please use `--strategy` to specify the strategy class to use.", + match=r"No strategy set. Please use `--strategy` to specify the strategy class to use\.", ): StrategyResolver.load_strategy(default_conf) @@ -169,7 +169,8 @@ def test_strategy_override_minimal_roi(caplog, default_conf): assert strategy.minimal_roi[0] == 0.5 assert log_has( - "Override strategy 'minimal_roi' with value in config file: {'20': 0.1, '0': 0.5}.", caplog + "Override strategy 'minimal_roi' with value from the configuration: {'20': 0.1, '0': 0.5}.", + caplog, ) @@ -179,7 +180,7 @@ def test_strategy_override_stoploss(caplog, default_conf): strategy = StrategyResolver.load_strategy(default_conf) assert strategy.stoploss == -0.5 - assert log_has("Override strategy 'stoploss' with value in config file: -0.5.", caplog) + assert log_has("Override strategy 'stoploss' with value from the configuration: -0.5.", caplog) def test_strategy_override_max_open_trades(caplog, default_conf): @@ -188,7 +189,9 @@ def test_strategy_override_max_open_trades(caplog, default_conf): strategy = StrategyResolver.load_strategy(default_conf) assert strategy.max_open_trades == 7 - assert log_has("Override strategy 'max_open_trades' with value in config file: 7.", caplog) + assert log_has( + "Override strategy 'max_open_trades' with value from the configuration: 7.", caplog + ) def test_strategy_override_trailing_stop(caplog, default_conf): @@ -198,7 +201,9 @@ def test_strategy_override_trailing_stop(caplog, default_conf): assert strategy.trailing_stop assert isinstance(strategy.trailing_stop, bool) - assert log_has("Override strategy 'trailing_stop' with value in config file: True.", caplog) + assert log_has( + "Override strategy 'trailing_stop' with value from the configuration: True.", caplog + ) def test_strategy_override_trailing_stop_positive(caplog, default_conf): @@ -214,12 +219,14 @@ def test_strategy_override_trailing_stop_positive(caplog, default_conf): assert strategy.trailing_stop_positive == -0.1 assert log_has( - "Override strategy 'trailing_stop_positive' with value in config file: -0.1.", caplog + "Override strategy 'trailing_stop_positive' with value from the configuration: -0.1.", + caplog, ) assert strategy.trailing_stop_positive_offset == -0.2 assert log_has( - "Override strategy 'trailing_stop_positive' with value in config file: -0.1.", caplog + "Override strategy 'trailing_stop_positive' with value from the configuration: -0.1.", + caplog, ) @@ -233,7 +240,7 @@ def test_strategy_override_timeframe(caplog, default_conf): assert strategy.timeframe == 60 assert strategy.stake_currency == "ETH" - assert log_has("Override strategy 'timeframe' with value in config file: 60.", caplog) + assert log_has("Override strategy 'timeframe' with value from the configuration: 60.", caplog) def test_strategy_override_process_only_new_candles(caplog, default_conf): @@ -244,7 +251,8 @@ def test_strategy_override_process_only_new_candles(caplog, default_conf): assert not strategy.process_only_new_candles assert log_has( - "Override strategy 'process_only_new_candles' with value in config file: False.", caplog + "Override strategy 'process_only_new_candles' with value from the configuration: False.", + caplog, ) @@ -265,7 +273,7 @@ def test_strategy_override_order_types(caplog, default_conf): assert strategy.order_types[method] == order_types[method] assert log_has( - "Override strategy 'order_types' with value in config file:" + "Override strategy 'order_types' with value from the configuration:" " {'entry': 'market', 'exit': 'limit', 'stoploss': 'limit'," " 'stoploss_on_exchange': True}.", caplog, @@ -299,7 +307,7 @@ def test_strategy_override_order_tif(caplog, default_conf): assert strategy.order_time_in_force[method] == order_time_in_force[method] assert log_has( - "Override strategy 'order_time_in_force' with value in config file:" + "Override strategy 'order_time_in_force' with value from the configuration:" " {'entry': 'FOK', 'exit': 'GTC'}.", caplog, ) @@ -340,7 +348,9 @@ def test_strategy_override_use_exit_signal(caplog, default_conf): assert not strategy.use_exit_signal assert isinstance(strategy.use_exit_signal, bool) - assert log_has("Override strategy 'use_exit_signal' with value in config file: False.", caplog) + assert log_has( + "Override strategy 'use_exit_signal' with value from the configuration: False.", caplog + ) def test_strategy_override_use_exit_profit_only(caplog, default_conf): @@ -367,7 +377,9 @@ def test_strategy_override_use_exit_profit_only(caplog, default_conf): assert strategy.exit_profit_only assert isinstance(strategy.exit_profit_only, bool) - assert log_has("Override strategy 'exit_profit_only' with value in config file: True.", caplog) + assert log_has( + "Override strategy 'exit_profit_only' with value from the configuration: True.", caplog + ) def test_strategy_max_open_trades_infinity_from_strategy(caplog, default_conf): diff --git a/tests/test_configuration.py b/tests/test_configuration.py index 66d039845..ba54e7b52 100644 --- a/tests/test_configuration.py +++ b/tests/test_configuration.py @@ -250,7 +250,7 @@ def test_from_recursive_files(testdatadir) -> None: assert "test_pricing2_conf.json" in conf["config_files"][3] files = testdatadir / "testconfigs/recursive.json" - with pytest.raises(OperationalException, match="Config loop detected."): + with pytest.raises(OperationalException, match=r"Config loop detected\."): load_from_files([files]) @@ -672,7 +672,7 @@ def test_validate_max_open_trades(default_conf): default_conf["stake_amount"] = "unlimited" with pytest.raises( OperationalException, - match="`max_open_trades` and `stake_amount` cannot both be unlimited.", + match=r"`max_open_trades` and `stake_amount` cannot both be unlimited\.", ): validate_config_consistency(default_conf) @@ -691,14 +691,15 @@ def test_validate_price_side(default_conf): conf["order_types"]["entry"] = "market" with pytest.raises( OperationalException, - match='Market entry orders require entry_pricing.price_side = "other".', + match=r'Market entry orders require entry_pricing.price_side = "other"\.', ): validate_config_consistency(conf) conf = deepcopy(default_conf) conf["order_types"]["exit"] = "market" with pytest.raises( - OperationalException, match='Market exit orders require exit_pricing.price_side = "other".' + OperationalException, + match=r'Market exit orders require exit_pricing.price_side = "other"\.', ): validate_config_consistency(conf) @@ -716,8 +717,8 @@ def test_validate_tsl(default_conf): default_conf["stoploss"] = 0.0 with pytest.raises( OperationalException, - match="The config stoploss needs to be different " - "from 0 to avoid problems with sell orders.", + match=r"The config stoploss needs to be different " + r"from 0 to avoid problems with sell orders\.", ): validate_config_consistency(default_conf) default_conf["stoploss"] = -0.10 @@ -767,7 +768,7 @@ def test_validate_whitelist(default_conf): del conf["exchange"]["pair_whitelist"] # Test error case with pytest.raises( - OperationalException, match="StaticPairList requires pair_whitelist to be set." + OperationalException, match=r"StaticPairList requires pair_whitelist to be set\." ): validate_config_consistency(conf) @@ -969,7 +970,7 @@ def test__validate_consumers(default_conf, caplog) -> None: conf = deepcopy(default_conf) conf.update({"external_message_consumer": {"enabled": True, "producers": []}}) with pytest.raises( - OperationalException, match="You must specify at least 1 Producer to connect to." + OperationalException, match=r"You must specify at least 1 Producer to connect to\." ): validate_config_consistency(conf) @@ -996,7 +997,7 @@ def test__validate_consumers(default_conf, caplog) -> None: } ) with pytest.raises( - OperationalException, match="Producer names must be unique. Duplicate: default" + OperationalException, match=r"Producer names must be unique\. Duplicate: default" ): validate_config_consistency(conf) @@ -1026,7 +1027,7 @@ def test__validate_orderflow(default_conf) -> None: conf["exchange"]["use_public_trades"] = True with pytest.raises( ConfigurationError, - match="Orderflow is a required configuration key when using public trades.", + match=r"Orderflow is a required configuration key when using public trades\.", ): validate_config_consistency(conf) @@ -1050,7 +1051,7 @@ def test_validate_edge_removal(default_conf): } with pytest.raises( ConfigurationError, - match="Edge is no longer supported and has been removed from Freqtrade with 2025.6.", + match=r"Edge is no longer supported and has been removed from Freqtrade with 2025\.6\.", ): validate_config_consistency(default_conf)